Ir al contenido


Foto

Ciclo For por partes ^o|


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 20 julio 2009 - 06:04

Pues eso tengo un ciclo for y quisiera ejecutarlo por partes, o sea, por ejemplo:



delphi
  1. for i := 0 to clDiscos.Items.Count - 1 do begin
  2.   if clDiscos.Checked[i] = True then begin
  3.   Letra := LeftStr(clDiscos.Items.Strings[i],1);
  4.   ShowMessage(Letra);
  5.   lstrcpy(@Path, PChar(Letra+':\')); // where to search
  6.   Timer1.Tag := CreateThread(nil, 0{}, @Search, PChar('.mp3.'), 0, PDWORD(0)^); // extensions in lower case with extra point at the end!
  7.   Timer1.Enabled := True;
  8.   Application.ProcessMessages;
  9.   end;
  10. end;



ahí­ cuento un listbox con varias Letras, si selecciono dos letras del listbox las cuenta pero ejecuta el hilo dentro del ciclo con la última letra del conteo, quisiera que al contar hagalo siguiente, letra A, ejecuta el hilo, termina, luego sigue con la Letra B y así­ sucesivamente, o sea, por partes, primero uno luego la otra, no sé si me hice entender, por favor, sino es así­ haganmelo saber please ;) :$.

Saludos.
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 20 julio 2009 - 06:08

si no entendi mal, tu lo que quieres es que la ejecución del ciclo se detenga hasta que termine el hilo???
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 20 julio 2009 - 06:12

si no entendi mal, tu lo que quieres es que la ejecución del ciclo se detenga hasta que termine el hilo???


Nop, mira, por ejemplo, en el conteo el resultado serí­a A y B, ahora, si es uno solo el hilo se ejecuta sin problemas con la A, ahora si es con los dos en vez ejecutar primero la A y luego la B, la ejecuta con la B, o sea obvia la A, lo que necesito es que ejecute el hilo con la A y cuando termine con la A, siga con la B y así­ sucesivamente.

Saludos.
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 julio 2009 - 06:28

Se me ocurre declarar un segundo procedimiento y llamarlo desde el principal:


delphi
  1. procedure ProcesarLetras(s:string);
  2. var
  3. i:integer;
  4. begin
  5. for i =1 to Length(s) do
  6. begin
  7. ShowMessage(S[i]); 
  8. lstrcpy(@Path, PChar(S[i]+':\')); // where to search 
  9. Timer1.Tag := CreateThread(nil, 0{}, @Search, PChar('.mp3.'), 0, PDWORD(0)^); // extensions in lower case with extra point at the end! 
  10. Timer1.Enabled := True; 
  11. Application.ProcessMessages;
  12. end;



Y luego llamarla mas o menos asi:


delphi
  1. for i := 0 to clDiscos.Items.Count - 1 do
  2. begin 
  3. if clDiscos.Checked[i] = True then
  4. begin 
  5. ProcesarLetras(TusLetras);


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 20 julio 2009 - 06:39

Hola Wilson, acabo de probar tu opción y el efecto es el mismo, salta de la primera a la última y ejecuta el hilo con la última del conteo.

Saludos.
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 julio 2009 - 06:45

Miraste esta coreccion?


delphi
  1. lstrcpy(@Path, PChar(S[i]+':\'));


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 20 julio 2009 - 06:49

Miraste esta coreccion?


delphi
  1. lstrcpy(@Path, PChar(S[i]+':\'));



Sip, lo mismo.
  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 758 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 julio 2009 - 08:57

Hola enecumene
Detallame un poco mas lo que quieres hacer, pues no entiendo muy bien  *-)

Dices que tienes un Listbox: 
Como es la lista que tienes, son letras nada mas?, es decir:
A
B
C
D
o que es lo que contiene?

En el ciclo preguntas si esta chequeado el item


delphi
  1.   if clDiscos.Checked[i] = True then



Pero si es un listbox, como lo marcas?
En un Listbox, se puede marcar mas de un item?

Aclarame esto para tener una mejor idea de la solucion que tengo en mente


  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 23 julio 2009 - 11:15

El componente que estoy utilizando es un CheckListBox, es un componente que trae Delphi y estí  en la paleta Additional, creo, no recuerdo bien donde estí , pero me parece que es ahí¬. El CheckListBox no es mí s que el mismo ListBox Tradicional con la salvedad que incluye CheckBoxs. ;)

Saludos.
  • 0

#10 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 758 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 julio 2009 - 01:12

Si, ya me imaginaba que fuera ese componente, por eso queria que me aclararas por si acaso 

  • 0

#11 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 758 mensajes
  • LocationPinar del Río, Cuba

Escrito 24 julio 2009 - 11:56

enecumene
Por qué usas el tag del Timer1



delphi
  1. Timer1.Tag := CreateThread(nil, 0{}, @Search, PChar('.mp3.'), 0, PDWORD(0)^);



No seria mejor usar una variable?  *-) o quizas un array  8-)

A veces nos volvemos locos buscando en lo mas complejo, y la solucion es mucho mas sencilla
Ya te dije a veces ...  :^)
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 24 julio 2009 - 11:59

Pues el hilo o Thread trabaja conjuntamente con el Timer, en el timer tiene código que muestra el movimiento o el trabajo del hilo.

Saludos.
  • 0

#13 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 758 mensajes
  • LocationPinar del Río, Cuba

Escrito 24 julio 2009 - 12:07

Es que estaba revisando el codigo, (sin profundizar mucho), y pensaba que cada vez que escribes en el tag, sustituyes el valor anterior, y por eso solo te ejecuta el ultimo hilo, en cambio si usaras un array hacias el llamado usando la variable de control del ciclo, tendras todos los items seleccionados
Tal vez con esta solucion te enredes mas, pero es lo que se me ocurrio a primera vista
  • 0