| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Ovat Cdt

Registrado: 27 Feb 2006Mensajes: 16Ubicación: Cali-Colombia
|
Publicado: Jue 13 Jul, 2006 4:45 pm Asunto: Actualizar un dato en pantalla desde un FOR |
|
|
Hola,
Tengo un inconveniente con los FOR, necesito que a medida que progresa el contador del FOR se vaya actualizando un dato que necesito usar en otra función. Para esto hago la siguiente prueba: uso un Edit y dentro del for le digo que ponga en Text del Edit el valor actualizado, para lo cual eso el mismo contador. Hago eso pero el valor del Text solo se actualiza al finalizar esta bucla FOR. ¿Que hago para obtener este dato a medida que va cambiando y no solo al final de la bucla???
Este es el sencillo código que pongo:
void __fastcall TFormImagenProcesada::BitBtn1Click(TObject *Sender)
{
for(int g=0; g<100; g++)
{
TrackBar1->Position++;
Edit1->Text=TrackBar1->Position;
//Funcion para obtener un retardo en Milisegundos
unsigned int time=0;
time=GetTickCount();
while(GetTickCount()<=(time+50))
{}
//Fin Función retardo
}
} |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 13 Jul, 2006 5:34 pm Asunto: |
|
|
Mientras se ejecuta el ciclo, necesitas procesar los demas mensajes.
La instrucción va dentro del for y es la siguiente:
Application->ProcessMessages();
| Código: |
oid __fastcall TFormImagenProcesada::BitBtn1Click(TObject *Sender)
{
for(int g=0; g<100; g++)
{
TrackBar1->Position++;
Edit1->Text=TrackBar1->Position;
//Precesar mensajes
Application->ProcessMessages();
//Funcion para obtener un retardo en Milisegundos
unsigned int time=0;
time=GetTickCount();
while(GetTickCount()<=(time+50))
{}
//Fin Función retardo
}
}
|
Saludos _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
Miguel Angel Torres Master


Registrado: 23 Abr 2006Mensajes: 282Ubicación: Siegen, Alemania
|
Publicado: Jue 13 Jul, 2006 6:28 pm Asunto: |
|
|
Agregas el Evento Update luego de asignar el valor para poder visualizar así:
| Código: |
for(int g=0; g<100; g++)
{
TrackBar1->Position++;
Edit1->Text=TrackBar1->Position;
Edit1->Update();
//Funcion para obtener un retardo en Milisegundos
unsigned int time=0;
time=GetTickCount();
while(GetTickCount()<=(time+50))
{}
//Fin Función retardo
}
|
Suerte... _________________ Entre más sé, sé que nada sé
----------------------------------
Miguel Angel Torres Arredondo
Siegen - Deutschland |
|
| Volver arriba |
|
 |
Ovat Cdt

Registrado: 27 Feb 2006Mensajes: 16Ubicación: Cali-Colombia
|
Publicado: Jue 13 Jul, 2006 6:57 pm Asunto: Gracias |
|
|
Gracias por su colaboración ya probé las dos formas anteriores y listo, también me encontré con:
Edit1->Refresh();
esa también funciona, pues actualiza el objeto dentro del ciclo.
Sin embargo, tengo el prblema siguiente:
No puedo usar el dato actualizado en otra función que he creado en otro archivo de código. Si lo hago por medio de un evento ( cambio de posición de un TrackBar ) sí funciona, pero si lo hago dandole la orden de que mueva el TrackBar automatico y no con el mouse no puedo hacer que tome el dato actualizado en la otra función... solo lo toma despues de que acaba todo el ciclo FOR. ¿Que puedo hacer? |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 14 Jul, 2006 8:08 am Asunto: |
|
|
No voy a entrar en el tema del TrackBar proque no lo he usado nunca, pero en lo del retardo, ¿no te sería mejor utilizar un TTimer? Con ello dejas que sea el propio sistema el que controle los intervalos de tiempo y cuando se cumpla el intervalo haces lo que te interese.
| Código: | void __fastcall TfForm1::TimerTimer(TObject *Sender)
{
Timer->Enabled = false; // Paramos el Timer
[Código a ejecutar cada n milisegundos]
Timer->Enabled = true; // Arrancamos el timer
} |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Miguel Angel Torres Master


Registrado: 23 Abr 2006Mensajes: 282Ubicación: Siegen, Alemania
|
Publicado: Vie 14 Jul, 2006 2:33 pm Asunto: |
|
|
Con respecto a la herramienta para usar un retardo, si necesitas que el retardo sea muy mínimo o sea de tiempo de pocos milisegundos o microsegundos, lo mejor es que no utilices un TTimer, ya que este no es muy confiable ("En realidad no sirve para nada en estos tipos de retardos, ya que él apesar de dejar colocar retardos hasta de 1ms, no los ejecuta así, su tiempo es muchísimo mayor, no me acuerdo bien pero por decir 100ms creo"), lo mejor sería que utilizaras herramientas como el ASM, tal y como se programa en retardo en un Microprocesador, y ejecutar instrucciones para realizar el retardo requerido. Suerte.... _________________ Entre más sé, sé que nada sé
----------------------------------
Miguel Angel Torres Arredondo
Siegen - Deutschland |
|
| Volver arriba |
|
 |
Miguel Angel Torres Master


Registrado: 23 Abr 2006Mensajes: 282Ubicación: Siegen, Alemania
|
Publicado: Vie 14 Jul, 2006 2:43 pm Asunto: |
|
|
Que pena, no había leido el otro mensaje tuyo, porque no pruebas con esto y nos cuentas como te fue:
| Código: |
TrackBar1->Update();
TrackBar1->UpdateControlState();
|
Suerte....
pd:(Si necesitas usar una variable que necesitas tanto en una función como en el trackbar, porque no la declaras aparte y haces lo mismo). _________________ Entre más sé, sé que nada sé
----------------------------------
Miguel Angel Torres Arredondo
Siegen - Deutschland |
|
| Volver arriba |
|
 |
Ovat Cdt

Registrado: 27 Feb 2006Mensajes: 16Ubicación: Cali-Colombia
|
Publicado: Vie 14 Jul, 2006 6:52 pm Asunto: soluciones |
|
|
he probado con lo de actualizar el trackbar dentro de For pero no surge efecto. En realidad el trackbar no lo necesito, necesito es la variable que se debe actualizar dentro del For. El trackbar lo estoy usando para probar y como el For no me ayuda pensé que podría tomar el efecto que hace el evento de mover la barrita desde el For para engañar al compilador. Pero nada...
Realizando algunas pruebas, actualicé varias veces la variable de manera directa, es decir, le dí a la variable el valor deseado muchas veces, y dejé intervalos de tiempo para ver si opdía verificar el efcto (no usé el for). Pues bien, según eso parece que el problema no depende estrictamente del For. Ahora quedó en la mismas o peor. ¿Como hago para obtener el efecto que se obtiene desde un evento sin necesidad de realizar dicho evento?
Es más, el problema lo podría resolver si supiera de que manera lograr que el valor de la variable se actualizara de la misma misma manera que se actualiza mientras ocurre el evento, ¿saben como hacer eso?
Les cuento que el comando Update() me sirvió para poder poner unos labels que necesitaba mientras se ejecutaba una barra de progreso dentro del for. Sin embargo, para lo de actualizar la variable finalmente me sirvió usar lo de los timers porque según encontré, estos funcionan a partir de hilos y entonces el proceso no es en secuencia sino en paralelo con el resto del programa. |
|
| Volver arriba |
|
 |
|