Ir al contenido


Foto

¿Es posible hacer un while en un listbox?


  • Por favor identifícate para responder
35 respuestas en este tema

#21 felipe

felipe

    Advanced Member

  • Moderador
  • PipPipPip
  • 3.283 mensajes
  • LocationColombia

Escrito 06 agosto 2009 - 07:25

Amigo enecumene, si usas los breackpoint para saber la posición del listbox en tiempo de ejecución ¿como te pasa los valores?.


Saludos!
  • 0

#22 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

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!


:D :D :D enecumene lo conoce como TRACE jejejeje

Salud OS
  • 0

#23 felipe

felipe

    Advanced Member

  • Moderador
  • PipPipPip
  • 3.283 mensajes
  • LocationColombia

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!


:D :D :D enecumene lo conoce como TRACE jejejeje

Salud OS


Ahh bueno...  :D, yo lo dije como para novatos  :p... pero la idea se entiende.


Saludos!
  • 0

#24 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 agosto 2009 - 08:06

Siguiendo con esto, hice un pequeño cambio:

de:



delphi
  1. Inc(i);



A:



delphi
  1. 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 :(.
  • 0

#25 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 07 agosto 2009 - 06:40

Problema resuelto :D, el code quedó así­:



delphi
  1. procedure TForm1.grListaDblClick(Sender: TObject);
  2. var
  3.   Longitud: DWORD;
  4.   Minutos, Segundos: WORD;
  5.   Frq: Single;
  6.   Frecuencia,FinalPos,Bitrate: DWORD;
  7.   Canales: BASS_CHANNELINFO;
  8.   i,x,npos: integer;
  9. begin
  10.   x := grLista.count -1;
  11.   i := grLista.ItemIndex; //cambio
  12.   while i <= x do begin
  13.     ObtenerObjeto(grLista.Items.IndexOf(grLista.Items[i])); //aquí­ estaba el problema
  14.     if Not FileExists(Ruta) then
  15.     begin
  16.       ShowMessage('Este archivo no existe o fue movido de sitio.');
  17.     end else begin
  18.  
  19. BASS_StreamFree(Channel);
  20. Channel := BASS_StreamCreateFile(False, PChar(Ruta), 0, 0, 0);
  21. Volumen := TrackBar1.Position;
  22. BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_MUSIC_VOL_CHAN,Volumen);
  23.  
  24. if BASS_ChannelPlay(Channel, False) then
  25. begin
  26. // Mostramos la duración de la cancion
  27. Tiempo  := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE));
  28. Longitud := BASS_ChannelGetLength(Channel, BASS_POS_BYTE);
  29. Gauge1.MaxValue := Longitud;
  30. Minutos  := Round(Tiempo) div 60;
  31. Segundos := Round(Tiempo) - (Minutos * 60);
  32. lbTimeTotal.Caption := '/ '+format('%.*d',[2,Minutos])+':'+format('%.*d',[2,Segundos]);
  33.  
  34. //Sacamos la Frecuencia de la Canción
  35. BASS_ChannelGetAttribute(Channel,BASS_ATTRIB_FREQ,frq);
  36. Frecuencia := Trunc(frq);
  37. lbFreq.Caption := 'Khz: '+IntToStr(Frecuencia);
  38.  
  39. //sacamos el Bitrate
  40. FinalPos := BASS_StreamGetFilePosition(Channel, BASS_FILEPOS_END);
  41. Bitrate  := Trunc(FinalPos / (125 * Tiempo) + 0.5);
  42. lbBitrate.Caption := 'Kbps: '+IntToStr(Bitrate);
  43.  
  44. //Sacamos el tipo de canal Mono o Stereo
  45. BASS_ChannelGetInfo(Channel,Canales);
  46. case Canales.chans of
  47.   1 :  lbChannels.Caption := 'Mono';
  48.   2 :  lbChannels.Caption := 'Stereo';
  49. end;
  50.  
  51. //mostramos la información de la canción (ID3 Tags)
  52. lbTitulo.Caption  := TAGS_Read(Channel, '%TITL');
  53. lbArtista.Caption := TAGS_Read(Channel, '%ARTI');
  54. lbAlbum.Caption  := TAGS_Read(Channel, '%ALBM');
  55. lbAno.Caption    := TAGS_Read(Channel, '%YEAR');
  56. lbGenero.Caption  := TAGS_Read(Channel, '%GNRE');
  57. lbrate.Caption    := lbFreq.Caption+' Khz';
  58. lbCalidad.Caption := lbBitrate.Caption+' Kbps';
  59. lbBPM.Caption    := TAGS_Read(Channel, '%TBPM');
  60. lbSize.Caption    := TAGS_Read(Channel, '%TSIZ');
  61. tmPosition.Enabled := True;
  62. TimerVis.Enabled := True;
  63.  
  64. while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do
  65.         begin
  66.             Application.ProcessMessages;
  67.           // Eliminé el Refresh porque realizaba un efecto desagradable así­ que no era necesario
  68.         end;
  69.         i := i + 1; //cambio
  70.       end
  71.       ELSE
  72.         i := i + 1; //cambio
  73.  
  74.       x := grLista.count -1 ;
  75.   end;
  76. end;
  77. end;



Gracias a todos :D.

Saludos.


  • 0

#26 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 09 agosto 2009 - 02:11

Ah vaya, ahora estoy teniendo otro problema, y es al pausar la canción :(, antes, cuando tení­a el DBGrid lo pausaba de esta manera y la canción se detení­a y si le volví­as a dar continuaba desde ahí­, este es el code:



delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. begin
  3. BASS_ChannelPause(Channel);
  4. 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.
  • 0

#27 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.999 mensajes
  • LocationMadrid - España

Escrito 09 agosto 2009 - 02:46

No conozcl las librerí­as que usas pero lo que ocurre es que al pausar la canción incrementas tu contador:


delphi
  1. while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do
  2. ..........
  3.         begin
  4.             Application.ProcessMessages;
  5.           // Eliminé el Refresh porque realizaba un efecto desagradable así­ que no era necesario
  6.         end;
  7.         i := i + 1; //cambio
  8. ...........



Si no puedes detectar con una función que estas en "pause", entonces coloca una variable bandera global en tu función de pausar:


delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. begin
  3. BASS_ChannelPause(Channel);
  4. BanderaPause := true;
  5. end;



Con esa variable detactas la pausa y en el código de incrementar la canción, evitas el incremento:


delphi
  1. while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do
  2. ..........
  3.         begin
  4.             Application.ProcessMessages;
  5.           // Eliminé el Refresh porque realizaba un efecto desagradable así­ que no era necesario
  6.         end;
  7.         if BanderaPause <> true then
  8.             i := i + 1; //cambio
  9. ...........



Espero haber acertado. ;)

Saludos.

  • 0

#28 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 09 agosto 2009 - 03:03

Hola escafandra, hice eso que me propones pero lo que me hace es repetir la misma canción en vez de pausarse :D.

Saludos.
  • 0

#29 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.999 mensajes
  • LocationMadrid - España

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 :D.

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.
  • 0

#30 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 09 agosto 2009 - 03:17

Así­ es amigo, al crearse el formulario asigno el valor de la variable a False, y al presionar el botón de pausa le asigno True, pero lo que me sucede es que al presionar el botón de pausa, en vez de pausarse lo que hace es empezar de nuevo esa misma canción, creo que los tiros se deben al ciclo, no sé, mi cabeza tiene pedos :(.

Saludos.
  • 0

#31 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 09 agosto 2009 - 03:59

Bueno ya resolví­ por lo menos parte del problema, ahora ya me pausa y puedo resumir pero el problema es que no puedo volver a resumir, pero ya eso es otro asunto, el code quedó así­:



delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. var Status: Integer;
  3. begin
  4. Status := BASS_ChannelIsActive(Channel);
  5. for ni := ni to grLista.Count -1 do
  6.   begin
  7.     case Status of
  8.     BASS_ACTIVE_PLAYING : begin
  9.                             BASS_ChannelPause(Channel);
  10.                           end;
  11.     BASS_ACTIVE_PAUSED  : begin
  12.                             BASS_ChannelPlay(Channel,false);
  13.                           end;
  14.     end;
  15.   end;
  16. end;



Saludos.
  • 0

#32 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.999 mensajes
  • LocationMadrid - España

Escrito 09 agosto 2009 - 04:01

¿Y si el valor de la Bandera lo asignas a tru antes de realizar la Pasua?



delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. begin
  3. BanderaPause := true;
  4. BASS_ChannelPause(Channel);
  5. end;



Y en el bucle haces esto:



delphi
  1. while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do
  2. ..........
  3.         begin
  4.             Application.ProcessMessages;
  5.           // Eliminé el Refresh porque realizaba un efecto desagradable así­ que no era necesario
  6.         end;
  7.           While(BanderaPause = true) do    begin end; Bucle infinito hasta que varie la bandera.
  8.             i := i + 1; //cambio
  9. ...........


:D

Saludos.
  • 0

#33 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 agosto 2009 - 06:55

Hola escafandra, acabo de probar tu propuesta, el asunto funciona sí­ y no, pues ella pausa la canción peeeero, la aplicación se queda congelada dentro del bucle infinito :D, no puedo hacer nada :p.

Lo que he estado haciendo es lo siguiente, éste es el botón de pausar:



delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. var Status: Integer;
  3. begin
  4. for ni := ni to ni do begin
  5. Status := BASS_ChannelIsActive(Channel);
  6.     case Status of
  7.     BASS_ACTIVE_PLAYING : begin
  8.                             BASS_ChannelPause(Channel);
  9.                           end;
  10.     BASS_ACTIVE_PAUSED  : begin
  11.                             BASS_ChannelPlay(Channel,false);
  12.                           end;
  13.     end;
  14.   end;
  15. 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:



delphi
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. var Status: DWORD;
  3. begin
  4. Status := BASS_ChannelIsActive(Channel);
  5. case Status of
  6.   BASS_ACTIVE_STOPPED : begin
  7.                           grListaDblClick(Sender);
  8.                         end;
  9.   BASS_ACTIVE_PAUSED  : begin
  10.                           BASS_ChannelPlay(Channel,false);
  11.                         end;
  12.   end;
  13. end;



Saludos.
  • 0

#34 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.999 mensajes
  • LocationMadrid - España

Escrito 11 agosto 2009 - 07:07

¿Que tal así­?



delphi
  1. while (BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING or BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PAUSED) do
  2. ..........
  3.         begin
  4.             Application.ProcessMessages;
  5.           // Eliminé el Refresh porque realizaba un efecto desagradable así­ que no era necesario
  6.         end;
  7.         if BanderaPause <> true then
  8.             i := i + 1; //cambio
  9. ...........



:D

Saludos.

Edito: Se me trabó la sintaxis delphi. :$  Lo arreglo.
  • 0

#35 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 11 agosto 2009 - 11:47

Ah vaya, no he probado de esa forma, en la noche lo probaré :D
  • 0

#36 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 11 agosto 2009 - 04:32

Mi estimado, me ha funcionado perfectamente bien :D (y), pausa y resume la canción y continúa con la siguiente cuando ésta termina :D, gracias amigo.

Saludos.
  • 0