PDA

Ver la Versión Completa : Mostrar Progreso de operaciones


nickolas
21-08-2012, 17:53:06
Buenas a todos.

Estoy trabajando con delphi 2009,mysql 5.1 y los componentes zeos para conectarme a la base de datos, el tema es el siguiente cuando mi aplicacion arranca se conecta a mysql con los datos que paso de un archivo ini, mi duda es como podria yo mostrar el progreso que va teniendo, ya que cuando la conecto a un base de datos que esta en otra maquina, tarda mas que cuando esta en mi maquina.

Gracias por leer, espero sus respuestas.

Casimiro Notevi
21-08-2012, 18:03:36
La conexión debería ser casi instantánea.
Lo que quieres hacer es, creo, muy complicado, ya que en todo caso será problema de conexión, red, router, etc.
Yo revisaría todo porque no es normal que tarde en conectar a otro ordenador, cuando eso es "lo más normal del mundo" :)

nickolas
21-08-2012, 18:09:03
a mi tambien me parece que no deberia tardar tanto pero unos segundos se toma, y por lo que veo todo esta correctamente configurado, anda bien solo que tarda. tengo que ver una forma de evitar que el usuario no pueda hacer nada hasta que yo no confirme que esta correctamente conectado ya que si no me tiraria un error. gracias por las respuesta.

roman
21-08-2012, 21:03:18
Algo a considerar es que acceder a otra máquina, sí o sí va a ser más lento que acceder a tu propia máquina. Si tienes tablas o consultas que se abren en automático al inicio del programa, quizá en local no lo notes pero sí en un acceso remoto. Podrías asegurarte que ninguna tabla se abre automáticamente.

// Saludos

Chris
21-08-2012, 23:10:09
Buenas a todos.

Estoy trabajando con delphi 2009,mysql 5.1 y los componentes zeos para conectarme a la base de datos, el tema es el siguiente cuando mi aplicacion arranca se conecta a mysql con los datos que paso de un archivo ini, mi duda es como podria yo mostrar el progreso que va teniendo, ya que cuando la conecto a un base de datos que esta en otra maquina, tarda mas que cuando esta en mi maquina.

Gracias por leer, espero sus respuestas.

Hola Nickolas!

Quiero empezar aclarando un punto. No puedes medir algo que es impreciso. Lo que buscas es como tratar de determinar el movimiento de las partículas cuánticas.

A cómo ya los compañeros te han comentado, el tiempo de conexión depende de muchos factores. En lugar de tratar de implementar un ProgressBar para esto, mejor utiliza una variante del ProgressBar que fue inventada precisamente para este tipo de procesos. La variante se le conoce como Infinite Progress Bar. Creo que los componentes Jedi traen incluídos una barra con estas prestaciones. Otra alternativa es utilizar un GIF animado (http://preloaders.net/en/horizontal). Nuevamente, los componente Jedi incluyen un control visual para que tus formularios muestren este tipo de animaciones.

Sino tienes los componentes Jedi, puedes utilizar este código que acabo de escribir para tí:
var
CS: Cardinal;
begin
CS := GetWindowLong(Self.ProgressBar1.Handle, GWL_STYLE);
CS := CS or PBS_MARQUEE;
SetWindowLong(Self.ProgressBar1.Handle, GWL_STYLE, CS);
SendMessage(Self.ProgressBar1.Handle, PBM_SETMARQUEE, Integer(True), 0);
end;

El código anterior lo puedes ejecutar al iniciar el formulario que contiene la barra. Necesitarás agregar la unidad CommCtrl a Uses. Es un código nativo, basado completamente en la API de WInd32, a cómo me gusta hacer la cosas :)

¿Cuál solución elegir? Depende del Look and Feel de tu aplicación. Si quieres apegarte al diseño global de Windows, un Infinite Progress Bar es una buena solución. Si quieres darle un toque de personalidad a tu aplicación, un GIF animado y sútil es una buena idea.

roman
21-08-2012, 23:25:42
El código anterior lo puedes ejecutar al iniciar el formulario que contiene la barra. Necesitarás agregar la unidad CommCtrl a Uses. Es un código nativo, basado completamente en la API de WInd32, a cómo me gusta hacer la cosas :)


En delphi7 hay que declarar esas constantes:


const
PBS_MARQUEE = $08;
PBM_SETMARQUEE = WM_USER+10;


Además, creo que sólo sirve si tienes un xpmanifest.

// Saludos

Chris
21-08-2012, 23:50:07
En delphi7 hay que declarar esas constantes:


const
PBS_MARQUEE = $08;
PBM_SETMARQUEE = WM_USER+10;


Además, creo que sólo sirve si tienes un xpmanifest.

// Saludos

Gracias por la observación. Sí, el código no funcionará si la aplicación no tiene los temas activos.

Saludos!

nickolas
22-08-2012, 00:30:03
Gracias por tomarte las molestia de ayudarme pero solo tengo una duda, que es que yo tengo u procedimiento que se encarga de conectar, y no como hacer para integrar ese codigo con el procedimiento.
Este es el codigo del proceso de coexion si me podes arientar te agradeceria.

begin
with DM_Conecciones do
begin
{En la linea Siguiente Creo o busco la ubicacion del archivo con las opciones}
with TIniFile.Create(ExtractFilePath(Application.ExeName) + '\Configuracion.ini') do
begin
try
begin
Coneccion.Catalog := ReadString('Datos_Servidor','BasedeDatos:', Coneccion.Database);
Coneccion.Database := ReadString('Datos_Servidor','BasedeDatos:', Coneccion.Database);
Coneccion.HostName := ReadString('Datos_Servidor','Servidor:',Coneccion.HostName);
Coneccion.Port := ReadInteger('Datos_Servidor','Puerto:',Coneccion.Port);
Coneccion.User := ReadString('Datos_Servidor','Usuario:', Coneccion.User);
Coneccion.Password := ReadString('Datos_Servidor','Contraseña:',Coneccion.Password);
end;
finally
Free; {Libero un archivo}
end;
end;
try
begin
Coneccion.Connected := TRUE;
end;
except
begin
Application.MessageBox('No ha sido posible conectar con el servidor', 'Conectar Servidor',MB_ICONEXCLAMATION);
end;
end;

end;

Espero tu respuesta Chris gracias.

roman
22-08-2012, 16:11:58
Podrías activarla barra en el evento BeforeConnect del TZConnection y desactivarla en el evento AfterConnect.

// Saludos

nickolas
22-08-2012, 19:30:07
listo gracias cuando lo pruebe les comento.

nickolas
23-08-2012, 00:52:23
probe lo que me dijiste de poner que se active en el BeforeConnect y el afterconnect del zconection el problema con eso es que no muestra nada de lo que este en el formulario principal hasta que este conectado o me tire error que no se pudo conectar, tambien probe que muestre un mensaje mientras esta conectando el problema que si da un error la conexion no me muestra el error hasta que cierro el formulario que habia abierto antes, alguien sabe si el zconection tiene algun evento que detecte si la conexion se hiso corecctamente asi como tiene los otros (afterconect beforeconnect

roman
23-08-2012, 18:16:56
Intenta esto:


const
CM_AFTERSHOW = WM_USER + 100;

type
TForm1 = class (TForm)
...
procedure FormCreate(Sender: TObject);
private
procedure CMAfterShow(var Message: TMessage); message CM_AFTERSHOW;
end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(
ProgressBar1.Handle, GWL_STYLE,
GetWindowLong(ProgressBar1.Handle, GWL_STYLE) or PBS_MARQUEE);

PostMessage(Handle, CM_AFTERSHOW, 0, 0);
end;

procedure TForm1.CMAfterShow(var Message: TMessage);
begin
SendMessage(ProgressBar1.Handle, PBM_SETMARQUEE, 1, 0);

try
ZConnection1.Connect;
finally
SendMessage(ProgressBar1.Handle, PBM_SETMARQUEE, 0, 0);
end;
end;


// Saludos

nickolas
24-08-2012, 01:00:20
gracias por las respuestas pero todavia no encuentro solucion, si llego a encontrar una forma de hacerlo lo paso o lo escribo.

roman
24-08-2012, 06:05:23
Ok. Te esperamos.

// Saludos