¿Es posible hacer un while en un listbox?
#21
Escrito 06 agosto 2009 - 07:25
Saludos!
#22
Escrito 06 agosto 2009 - 07:28
Amigo enecumene, si usas los breackpoint para saber la posición del listbox en tiempo de ejecución ¿como te pasa los valores?.
Saludos!
enecumene lo conoce como TRACE jejejeje
Salud OS
#23
Escrito 06 agosto 2009 - 07:33
Amigo enecumene, si usas los breackpoint para saber la posición del listbox en tiempo de ejecución ¿como te pasa los valores?.
Saludos!
enecumene lo conoce como TRACE jejejeje
Salud OS
Ahh bueno... , yo lo dije como para novatos ... pero la idea se entiende.
Saludos!
#24
Escrito 06 agosto 2009 - 08:06
de:
Inc(i);
A:
i := grLista.ItemIndex + 1;
y lo que me hace es repetir la canción donde le doy el doble click por la cantidad de items en el listbox .
#25
Escrito 07 agosto 2009 - 06:40
procedure TForm1.grListaDblClick(Sender: TObject); var Longitud: DWORD; Minutos, Segundos: WORD; Frq: Single; Frecuencia,FinalPos,Bitrate: DWORD; Canales: BASS_CHANNELINFO; i,x,npos: integer; begin x := grLista.count -1; i := grLista.ItemIndex; //cambio while i <= x do begin ObtenerObjeto(grLista.Items.IndexOf(grLista.Items[i])); //aquí estaba el problema if Not FileExists(Ruta) then begin ShowMessage('Este archivo no existe o fue movido de sitio.'); end else begin BASS_StreamFree(Channel); Channel := BASS_StreamCreateFile(False, PChar(Ruta), 0, 0, 0); Volumen := TrackBar1.Position; BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_MUSIC_VOL_CHAN,Volumen); if BASS_ChannelPlay(Channel, False) then begin // Mostramos la duración de la cancion Tiempo := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE)); Longitud := BASS_ChannelGetLength(Channel, BASS_POS_BYTE); Gauge1.MaxValue := Longitud; Minutos := Round(Tiempo) div 60; Segundos := Round(Tiempo) - (Minutos * 60); lbTimeTotal.Caption := '/ '+format('%.*d',[2,Minutos])+':'+format('%.*d',[2,Segundos]); //Sacamos la Frecuencia de la Canción BASS_ChannelGetAttribute(Channel,BASS_ATTRIB_FREQ,frq); Frecuencia := Trunc(frq); lbFreq.Caption := 'Khz: '+IntToStr(Frecuencia); //sacamos el Bitrate FinalPos := BASS_StreamGetFilePosition(Channel, BASS_FILEPOS_END); Bitrate := Trunc(FinalPos / (125 * Tiempo) + 0.5); lbBitrate.Caption := 'Kbps: '+IntToStr(Bitrate); //Sacamos el tipo de canal Mono o Stereo BASS_ChannelGetInfo(Channel,Canales); case Canales.chans of 1 : lbChannels.Caption := 'Mono'; 2 : lbChannels.Caption := 'Stereo'; end; //mostramos la información de la canción (ID3 Tags) lbTitulo.Caption := TAGS_Read(Channel, '%TITL'); lbArtista.Caption := TAGS_Read(Channel, '%ARTI'); lbAlbum.Caption := TAGS_Read(Channel, '%ALBM'); lbAno.Caption := TAGS_Read(Channel, '%YEAR'); lbGenero.Caption := TAGS_Read(Channel, '%GNRE'); lbrate.Caption := lbFreq.Caption+' Khz'; lbCalidad.Caption := lbBitrate.Caption+' Kbps'; lbBPM.Caption := TAGS_Read(Channel, '%TBPM'); lbSize.Caption := TAGS_Read(Channel, '%TSIZ'); tmPosition.Enabled := True; TimerVis.Enabled := True; while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do begin Application.ProcessMessages; // Eliminé el Refresh porque realizaba un efecto desagradable así que no era necesario end; i := i + 1; //cambio end ELSE i := i + 1; //cambio x := grLista.count -1 ; end; end; end;
Gracias a todos .
Saludos.
#26
Escrito 09 agosto 2009 - 02:11
procedure TForm1.Button4Click(Sender: TObject); begin BASS_ChannelPause(Channel); end;
Con eso era má que suficiente, pero ahora lo que hace es que al pausar la canción comienza a sonar la siguiente de la lista y así sucesivamente, cosa que no debería de hacer
Saludos.
#27
Escrito 09 agosto 2009 - 02:46
while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do .......... begin Application.ProcessMessages; // Eliminé el Refresh porque realizaba un efecto desagradable así que no era necesario end; i := i + 1; //cambio ...........
Si no puedes detectar con una función que estas en "pause", entonces coloca una variable bandera global en tu función de pausar:
procedure TForm1.Button4Click(Sender: TObject); begin BASS_ChannelPause(Channel); BanderaPause := true; end;
Con esa variable detactas la pausa y en el código de incrementar la canción, evitas el incremento:
while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do .......... begin Application.ProcessMessages; // Eliminé el Refresh porque realizaba un efecto desagradable así que no era necesario end; if BanderaPause <> true then i := i + 1; //cambio ...........
Espero haber acertado.
Saludos.
#28
Escrito 09 agosto 2009 - 03:03
Saludos.
#29
Escrito 09 agosto 2009 - 03:07
Hola escafandra, hice eso que me propones pero lo que me hace es repetir la misma canción en vez de pausarse .
Saludos.
Sin embargo el cambio es mínimo. ¿Diste el valor false a esa variable como valor de inicio? Al reanudar, tambien habra que colocar la variable a false.
Saludos.
#30
Escrito 09 agosto 2009 - 03:17
Saludos.
#31
Escrito 09 agosto 2009 - 03:59
procedure TForm1.Button4Click(Sender: TObject); var Status: Integer; begin Status := BASS_ChannelIsActive(Channel); for ni := ni to grLista.Count -1 do begin case Status of BASS_ACTIVE_PLAYING : begin BASS_ChannelPause(Channel); end; BASS_ACTIVE_PAUSED : begin BASS_ChannelPlay(Channel,false); end; end; end; end;
Saludos.
#32
Escrito 09 agosto 2009 - 04:01
procedure TForm1.Button4Click(Sender: TObject); begin BanderaPause := true; BASS_ChannelPause(Channel); end;
Y en el bucle haces esto:
while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do .......... begin Application.ProcessMessages; // Eliminé el Refresh porque realizaba un efecto desagradable así que no era necesario end; While(BanderaPause = true) do begin end; Bucle infinito hasta que varie la bandera. i := i + 1; //cambio ...........
Saludos.
#33
Escrito 10 agosto 2009 - 06:55
Lo que he estado haciendo es lo siguiente, éste es el botón de pausar:
procedure TForm1.Button4Click(Sender: TObject); var Status: Integer; begin for ni := ni to ni do begin Status := BASS_ChannelIsActive(Channel); case Status of BASS_ACTIVE_PLAYING : begin BASS_ChannelPause(Channel); end; BASS_ACTIVE_PAUSED : begin BASS_ChannelPlay(Channel,false); end; end; end; end;
Hasta aquí todo va bien, me pausa la canción y al presionar el botón Play ella continua desde la pausa todo bien, puedo pausarla cuantas veces quisiera, pero... ocurre un problema 8-), y es que si en el Listbox hay más de una canción ella no hace ciclo completo, se queda en la canción actual, o sea, ya no hace la continuidad , ¿alguna idea mejor?.
Por si las moscas aquí dejo el code de Play:
procedure TForm1.Button3Click(Sender: TObject); var Status: DWORD; begin Status := BASS_ChannelIsActive(Channel); case Status of BASS_ACTIVE_STOPPED : begin grListaDblClick(Sender); end; BASS_ACTIVE_PAUSED : begin BASS_ChannelPlay(Channel,false); end; end; end;
Saludos.
#34
Escrito 11 agosto 2009 - 07:07
while (BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING or BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PAUSED) do .......... begin Application.ProcessMessages; // Eliminé el Refresh porque realizaba un efecto desagradable así que no era necesario end; if BanderaPause <> true then i := i + 1; //cambio ...........
Saludos.
Edito: Se me trabó la sintaxis delphi. :$ Lo arreglo.
#35
Escrito 11 agosto 2009 - 11:47
#36
Escrito 11 agosto 2009 - 04:32
Saludos.