PDA

Ver la Versión Completa : mensaje mientras hay proceso


marcelofabiani
10-02-2006, 17:50:41
Buenas queridos amigos del foro:

Mi pregunta es la siguiente trabajo con el delphi 6.0 y mysql, en el programa hay un proceso que debeo realizar de llenado de datos a una tabla, y deseo que mientras ese proceso este ejecutandose aparezca una ventana que le diga al usuario que se esta procesando y desaparezca cuando termine, por ahora la unica forma que encontre de hacer esto es mostrar un showmessage al principio y cuando finalize otro showmessage que dice que el proceso ha terminado

showmessage('','Texto','');
procedimientos para llenado
..
..
showmessage('','Finalizo');

OSKR
10-02-2006, 18:57:38
El proceso debes crearlo con un hilo, puedes instanciar un objeto de la clase Thread, de eso hay ejemplos en el IDE, mandas tu mensaje y le das al hilo su respectivo Execute.

marcelofabiani
10-02-2006, 19:22:18
Gracias por responder, lamentablemente no tengo los ejemplos ahi asi que quisiera saber si tienes algun ejemplo o algun link donde pueda ver como debo hacer esto?

OSKR
10-02-2006, 19:41:51
Yo lo puedo hacer en Builder, conozco Pascal pero no Object Pascal para aqello de la herencia y objetos, me extraña q tu IDE no traiga ejemplos, puedo entender codigo de ahi y pasarlo a C++ pero no siempre al contrario
ahi te paso un ejemplo q trae el builder de como implementar una, espero q te sirva de algo:
class TSparkyThread : public TThread
{ private:
protected:
void __fastcall Execute();
public:
__fastcall TSparkyThread(bool CreateSuspended);
};
__fastcall TSparkyThread::TSparkyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall TSparkyThread::Execute()
{
while (!Terminated)
{
Beep();
Sleep(500);
}
}
void __fastcall TService1::Service1Start(TService *Sender, bool &Started)
{
SparkyThread = new TSparkyThread(false);
Started = true;
}
void __fastcall TService1::Service1Continue(TService *Sender, bool &Continued)
{
SparkyThread->Resume();
Continued = true;
}
void __fastcall TService1::Service1Pause(TService *Sender, bool &Paused)
{
SparkyThread->Suspend();
Paused = true;
}
void __fastcall TService1::Service1Stop(TService *Sender, bool &Stopped)
{
SparkyThread->Terminate();
Stopped = true;
}

Tambien puedes usar hilos de la WinAPI, es menos engorroso y ese si es standard tanto pa builder como delphi

OSKR
10-02-2006, 19:51:43
Aja!! lo encontre, el ejemplo de como usar una hebra con la WinAPI:
http://www.clubdelphi.com/foros/showthread.php?t=19588

roman
10-02-2006, 20:16:55
Disculpen, no entiendo para qué usar un hilo. Por lo que describe Marcelo, sólo le interesa mostrar un mensaje que indique al usuario que está corriendo el proceso; no menciona nada de correr el proceso en "background" o algo así.

// Saludos

OSKR
10-02-2006, 21:52:43
marcelofabiani:

y deseo que mientras ese proceso este ejecutandose aparezca una
ventana que le diga al usuario que se esta procesando y desaparezca cuando
termine
es q supuse muchas cosas :D y tal vez no supuse otras :p.

roman
10-02-2006, 22:00:13
Yo sólo quería aclarar para no confundir a Marcelo. Sin embargo, es bueno que hayas mencionado los hilos porque quizá sea una posibilidad que no ha considerado (ejecutar el proceso en segundo plano) y por ello piensa en un mensaje mientras se ejecuta.

// Saludos

OSKR
10-02-2006, 22:20:50
roman:
quizá sea una posibilidad que no ha considerado
pues la q consideré q ocurría era q el mensaje le detenía el programa hasta q el user aceptara o algo asi....

AzidRain
13-02-2006, 05:18:27
Yo queria hacer algo igual...me meti con los hilos y se me hizo mucha complicacion solo para un mensaje. Asi que hice lo siguiente: Cree un form con un TLabel con alignment a "aClient". El form lo pongo como centrado y como lo quiero mostrar (sin botones minimizar, cerrar, etc.) obviamente sin dar la posiblidad de cerrarlo mas que por código. Antes de ejecutar la operacion que tomara tiempo, asigno el form a una variable y lo creo al vuelo, modifico lo que quiero que diga el TLabel y muestro el form en forma no-modal para que se quede visible y se siga ejecutando la operacion...durante la operacion que este haciendo puedo inclusive actualizar lo que muestra el form.. al terminar mi opeacion..simplemente libero el form (y la memoria) y listo...
Se que no es una solución muy elegante, pero el resultado es bastante bueno y me ha funcionado muy bien..