Ir al contenido


Foto

¿Es posible hacer un while en un listbox?


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 03 agosto 2009 - 07:03

Pues eso, es posible hacer un while en un Listbox?, que recorra cada items y ejecute cada item por separado, como cuando se hace una while a una base de datos:



delphi
  1. dm.tabla.first;
  2. while not eof do begin
  3.   dm.tabla.fields[0].Integer := dm.tabla.recordcount + 1;
  4.   dm.tabla.next;
  5. end;



Algo así­ pero en un listbox, ¿es posible?  *-)

Saludos.
  • 0

#2 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 640 mensajes
  • LocationLos Mochis

Escrito 03 agosto 2009 - 08:42

Con el for in



delphi
  1. var
  2.   item: String;
  3. begin
  4.   for item in ListBox1.Items do
  5.   begin
  6.     ShowMessage(item)
  7.   end;
  8. end;


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 04 agosto 2009 - 12:16

Vaya, cada dí­a aprendo algo nuevo :s, haré las pruebas y luego os comento, gracias Axesys.

Saludos.
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 04 agosto 2009 - 03:17

La verdad no estoy muy seguro si el código de Axesys funciona en versiones anteriores a Delphi 2007, el siguiente ejemplo obtiene el mismo resultado.


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. i: integer;
  4. begin
  5. for i:=0 to ListBox1.Count -1 do
  6. begin
  7. ShowMessage(ListBox1.Items[i])
  8. end;
  9. end;
  10. end.



saludos
  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 04 agosto 2009 - 03:53

La verdad no estoy muy seguro si el código de Axesys funciona en versiones anteriores a Delphi 2007, el siguiente ejemplo obtiene el mismo resultado.

saludos


Tienes razón, en D7 no funciona :D
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 04 agosto 2009 - 07:07

Gracias Wilson, pero el problema del For..to es que las cuentas todas y sólo toma en consideración el último item, imagí­nate un playlist hecho con un listbox con el for..to contará todos los items pero sólo tocará la última, lo que necesito es que tenga el comportamiento como el while, empieza desde el primero toca esa, termina y sigue con la siguiente, en un DBGrid con el while funciona perfecto, os dejo un ejemplo con un list box sólo agrega dos o más canciones a la lista y verás que sólo toca la última.

Saludos.

Archivos adjuntos


  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 04 agosto 2009 - 07:36

Ensaya esta



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var i,e: Integer;
  3. begin
  4. i := 0;
  5. e:=  ListBox1.Count ;
  6. while i < e do
  7.  
  8. begin
  9. BASS_StreamFree(Channel);
  10. Channel := BASS_StreamCreateFile(False, PChar(ListBox1.Items[i]), 0, 0, 0);
  11. BASS_ChannelPlay(Channel, False);
  12. Form1.Caption := 'Player - '+ExtractFileName(Listbox1.Items[i]);
  13. i := i+1;
  14. end;
  15. end;


  • 0

#8 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 264 mensajes
  • LocationMéxico

Escrito 04 agosto 2009 - 09:41



delphi
  1. Var x,nPos:integer;
  2. begin
  3.  
  4.   x:= ListBox1.count -1;
  5.   nPos :=0;
  6.   while nPos<>x do
  7.   begin
  8.       inc(nPos);
  9.       x:= ListBox.count -1 ;
  10.   end;
  11.  
  12. end;



La Funcion SERIA ASI..



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var i: Integer;
  3.     x,nPos:integer;
  4. begin
  5.  
  6.   x:= ListBox1.count -1;
  7.   i :=0;
  8.   while i<>x do
  9.   begin
  10.       BASS_StreamFree(Channel);
  11.       Channel := BASS_StreamCreateFile(False, PChar(ListBox1.Items[i]), 0, 0, 0);
  12.       BASS_ChannelPlay(Channel, False);
  13.       Form1.Caption := 'Player - '+ExtractFileName(Listbox1.Items[i]);
  14.       inc(i);
  15.       x:= ListBox1.count -1 ;
  16.   end;
  17.  
  18. end;

[/code]

PERO la Secuencia DEPENDE del PLAYER, ya que al parecer no espera a que termine la REPRODUCCION inmediatamente continua el CICLO..

  • 0

#9 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 264 mensajes
  • LocationMéxico

Escrito 04 agosto 2009 - 10:50

CORREGIDO... 




delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var i: Integer;
  3.     x,nPos:integer;
  4. begin
  5.  
  6.   x:= ListBox1.count -1;
  7.   i :=0;
  8.   while i<=x do
  9.   begin
  10.       Form1.Caption := 'Player - '+ExtractFileName(Listbox1.Items[i]);
  11.       BASS_StreamFree(Channel);
  12.       Channel := BASS_StreamCreateFile(False, PChar(ListBox1.Items[i]), 0, 0, 0);
  13.       if BASS_ChannelPlay(Channel, False) then
  14.       begin
  15.         while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do
  16.         begin
  17.             Application.ProcessMessages;
  18.             refresh;
  19.         end;
  20.         inc(i);
  21.       end
  22.       ELSE
  23.         inc(i);
  24.  
  25.       x:= ListBox1.count -1 ;
  26.   end;
  27.  
  28. end;


  • 0

#10 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 264 mensajes
  • LocationMéxico

Escrito 04 agosto 2009 - 11:02

Tal vez te pueda INTERESAR este SITIO...



http://www.3delite.h...edisplay3d.html
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 05 agosto 2009 - 06:47

Muchas gracias PCICOM y Wilson esta noche haré las pruebas y luego les comento :D, gracias.

Saludos.
  • 0

#12 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 agosto 2009 - 07:24

aun no entiendo la diferencia entre el while y el for para esta función, igual los dos hacen el ciclo...  :huh:
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 05 agosto 2009 - 07:37

aun no entiendo la diferencia entre el while y el for para esta función, igual los dos hacen el ciclo...  :huh:


¿Llegaste a descargar mi ejemplo?, ella hace el ciclo pero en vez de ir sonando uno a uno como hace el while suena la última de la lista, ahi es la diferencia.

Saludos.
  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 agosto 2009 - 07:47


aun no entiendo la diferencia entre el while y el for para esta función, igual los dos hacen el ciclo...  :huh:


¿Llegaste a descargar mi ejemplo?, ella hace el ciclo pero en vez de ir sonando uno a uno como hace el while suena la última de la lista, ahi es la diferencia.

Saludos.


si lo vi, pero esa es mi duda, tecnicamente deberia ser la misma mesa pero con otro mantel  :lipsrsealed:
  • 0

#15 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 264 mensajes
  • LocationMéxico

Escrito 05 agosto 2009 - 12:05

Si checaste el EJEMPLO de enecu...  lo que tiene es un reproductor de musica, entonces con el FOR al ejecutarlo tiene definido su ciclo logico  por ejemplo de 1 a 5..  pero si lo usas con un while podras agregar mas musica a la lista y esta continuara tocandola, cosa que con el for solo tocaria hasta la 5..

CHEQUE el codigo de ENECUNEME.. y le postie un CODIGO que funciona  y que lo puede adaptar a su reproductor,


SALUDOS..
  • 0

#16 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 05 agosto 2009 - 06:18

Hola pcicom, probé tu code y está excelente, me funciona de pelos :D, muchas gracias (y).

Saludos.
  • 0

#17 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 05 agosto 2009 - 07:32

Volviendo a esto, adapté el code de pcicom a mi sistema y ha quedado 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 := 0;
  12.   while i <= x do begin
  13.     ObtenerObjeto(grLista.ItemIndex);
  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.             refresh;
  68.         end;
  69.         inc(i);
  70.       end
  71.       ELSE
  72.         inc(i);
  73.  
  74.       x := grLista.count -1 ;
  75.   end;
  76. end;
  77. end;



¿Problemas?, sí­, está teniendo el siguiente comportamiento, al estar en el evento OnDBlClick del Listbox, si lo hago en el primer item suena la primera pero no continúa si lo hago en la última (en el caso donde hay dos items nada más) suena la última y continúa al primer item, no sé en que ando mal, no puedo negar que mi mente anda muy espeso estas últimas semanas :(, a ver quién me echa la mano :D.

Saludos.
  • 0

#18 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 agosto 2009 - 08:43

Si checaste el EJEMPLO de enecu...  lo que tiene es un reproductor de musica, entonces con el FOR al ejecutarlo tiene definido su ciclo logico  por ejemplo de 1 a 5..  pero si lo usas con un while podras agregar mas musica a la lista y esta continuara tocandola, cosa que con el for solo tocaria hasta la 5..

CHEQUE el codigo de ENECUNEME.. y le postie un CODIGO que funciona  y que lo puede adaptar a su reproductor,


SALUDOS..


gracias  por la explicacion amigo, es la unica forma que tiene logica
  • 0

#19 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 264 mensajes
  • LocationMéxico

Escrito 06 agosto 2009 - 06:54



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.  
  12.   // Si lo Ejecutas al hacer dobleClick en el Elemento de la Lista
  13.   // Lo Logico es que empieze en la posicion del DOBLECLICK
  14.  
  15.   i := grLista.itemindex;
  16.    
  17.  
  18.   //
  19.  
  20.   while i <= x do begin
  21.     ObtenerObjeto(grLista.ItemIndex);
  22.     if Not FileExists(Ruta) then
  23.     begin
  24.       ShowMessage('Este archivo no existe o fue movido de sitio.');
  25.     end else begin
  26.  
  27.     BASS_StreamFree(Channel);
  28.     Channel := BASS_StreamCreateFile(False, PChar(Ruta), 0, 0, 0);
  29.     Volumen := TrackBar1.Position;
  30.     BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_MUSIC_VOL_CHAN,Volumen);
  31.  
  32.     if BASS_ChannelPlay(Channel, False) then
  33.     begin
  34.       // Mostramos la duración de la cancion
  35.       Tiempo  := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE));
  36.       Longitud := BASS_ChannelGetLength(Channel, BASS_POS_BYTE);
  37.       Gauge1.MaxValue := Longitud;
  38.       Minutos  := Round(Tiempo) div 60;
  39.       Segundos := Round(Tiempo) - (Minutos * 60);
  40.       lbTimeTotal.Caption := '/ '+format('%.*d',[2,Minutos])+':'+format('%.*d',[2,Segundos]);
  41.  
  42.     //Sacamos la Frecuencia de la Canción
  43.     BASS_ChannelGetAttribute(Channel,BASS_ATTRIB_FREQ,frq);
  44.     Frecuencia := Trunc(frq);
  45.     lbFreq.Caption := 'Khz: '+IntToStr(Frecuencia);
  46.  
  47.     //sacamos el Bitrate
  48.     FinalPos := BASS_StreamGetFilePosition(Channel, BASS_FILEPOS_END);
  49.     Bitrate  := Trunc(FinalPos / (125 * Tiempo) + 0.5);
  50.     lbBitrate.Caption := 'Kbps: '+IntToStr(Bitrate);
  51.  
  52.     //Sacamos el tipo de canal Mono o Stereo
  53.     BASS_ChannelGetInfo(Channel,Canales);
  54.     case Canales.chans of
  55.       1 :  lbChannels.Caption := 'Mono';
  56.       2 :  lbChannels.Caption := 'Stereo';
  57.     end;
  58.  
  59.     //mostramos la información de la canción (ID3 Tags)
  60.     lbTitulo.Caption  := TAGS_Read(Channel, '%TITL');
  61.     lbArtista.Caption := TAGS_Read(Channel, '%ARTI');
  62.     lbAlbum.Caption  := TAGS_Read(Channel, '%ALBM');
  63.     lbAno.Caption    := TAGS_Read(Channel, '%YEAR');
  64.     lbGenero.Caption  := TAGS_Read(Channel, '%GNRE');
  65.     lbrate.Caption    := lbFreq.Caption+' Khz';
  66.     lbCalidad.Caption := lbBitrate.Caption+' Kbps';
  67.     lbBPM.Caption    := TAGS_Read(Channel, '%TBPM');
  68.     lbSize.Caption    := TAGS_Read(Channel, '%TSIZ');
  69.     tmPosition.Enabled := True;
  70.     TimerVis.Enabled := True;
  71.  
  72.     while BASS_ChannelIsActive(Channel)= BASS_ACTIVE_PLAYING do
  73.     begin
  74.         Application.ProcessMessages;
  75.         refresh;
  76.     end;
  77.     inc(i);
  78. end
  79. ELSE
  80.     inc(i);
  81.  
  82.   x := grLista.count -1 ;
  83. end;
  84. end;
  85. end;



  • 0

#20 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 06 agosto 2009 - 07:14

Hola Pcicom, precisamente así­ la tengo ahora y pensé que por ahí­ iban los tiros, pero no, no continúa :(.
  • 0