Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Actualizar un dato en pantalla desde un FOR

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Actualizar un dato en pantalla desde un FOR Responder citando

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
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Gracias Responder citando

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
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

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.
    En el evento OnTimer
    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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: soluciones Responder citando

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
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.