Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Mostrar Progreso de operaciones (https://www.clubdelphi.com/foros/showthread.php?t=79922)

nickolas 21-08-2012 18:53:06

Mostrar Progreso de operaciones
 
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 19: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 19: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 22: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 22-08-2012 00:10:09

Cita:

Empezado por nickolas (Mensaje 440202)
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. 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í:
Código Delphi [-]
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 22-08-2012 00:25:42

Cita:

Empezado por Chris (Mensaje 440276)
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:

Código Delphi [-]
const
  PBS_MARQUEE = $08;
  PBM_SETMARQUEE = WM_USER+10;

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

// Saludos

Chris 22-08-2012 00:50:07

Cita:

Empezado por roman (Mensaje 440280)
En delphi7 hay que declarar esas constantes:

Código Delphi [-]
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 01: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.

Código Delphi [-]
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 17:11:58

Podrías activarla barra en el evento BeforeConnect del TZConnection y desactivarla en el evento AfterConnect.

// Saludos

nickolas 22-08-2012 20:30:07

listo gracias cuando lo pruebe les comento.

nickolas 23-08-2012 01: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 19:16:56

Intenta esto:

Código Delphi [-]
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 02: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 07:05:23

Ok. Te esperamos.

// Saludos


La franja horaria es GMT +2. Ahora son las 21:05:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi