Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Dialogo con barra de progreso (https://www.clubdelphi.com/foros/showthread.php?t=88070)

AgustinOrtu 09-04-2015 00:36:37

Dialogo con barra de progreso
 
Que tal Club

En virtud de hilos como este

Y similares que perdi de vista y no anote :(

Estuve esta tarde jugando un rato con Delphi XE7 y la Parallel Library y llege a esta solucion:

Simplemente para hacer uso de esta libreria, el compañero Nelson ya ha dejado excelentes soluciones tambien:

Lo que hice fue lo siguiente:

Digamos que tengo un DataModule que llame DM, en el coloque mis componentes de acceso a datos preferidos (en este caso opte por FireDAC) y realice una conexion normal (en localhost) a SQL Server. Es decir, puedo hacer sin problemas esto

Código Delphi [-]
  Connection.Connected := True;

Y conecta instantaneamente, no hay ningun problema. Ahora supongamos que la conexion es por internet y puede tardar como se sugeria en el el post de por arriba. Emule ese delay de la siguiente manera, defini un metodo en la seccion publica del DataModule, asi:

Código Delphi [-]
  public
    { Public declarations }
    procedure Conectar;

Y su implementacion:

Código Delphi [-]
procedure TDM.Conectar;
begin
    Connection.Connected := True;
    Sleep(5000);
end;

Entonces el objetivo a lograr era que mientras estaba "conectando", mostrar una barra de progreso infinita (marquesina) como para decir, "ey, no desesperes, estoy intentando conectar"

Para eso agrege un nuevo Form y al que llame FProgressDialog. Simplemente tiene un TStaticText (podria ser un TLabel) y un TProgressBar, en la que coloque las siguientes propiedades:

Código Delphi [-]
  MarqueeInterval := 50;
  Style := pbstMarquee;

Es necesario agregar la unidad System.Threading en la seccion interface -> uses de la unidad del ProgressDialog. Esta es la unidad que contiene la Parallel Library.

De igual manera que en el DataModule, se agrega un nuevo procedimiento en la seccion publica del Form:

Código Delphi [-]
  public
    { Public declarations }
    procedure Initialize(ATask: TProc; const ACaption, AText: string);

Y ahora la parte "jugosa", su implementacion:

Código Delphi [-]
procedure TFProgressDialog.Initialize(ATask: TProc; const ACaption, AText: string);
var
    // este arreglo va a contener una lista de "tareas" que quiero que se ejecuten en paralelo
    Tasks: array of ITask;
begin
    // colocamos en el Caption del Form un texto que enviamos como parametro
    Caption := ACaption; 
    // Display Text es mi TStaticText, es un texto que coloque por encima de la barra de progreso
    DisplayText.Caption := AText;

    // es un array dinamico, debo decirle su tamaño
    SetLength(Tasks, 1);
    // creo una nueva tarea, a la cual le indico que el proceso que debe ejecutar,
    // es a su ves un un metodo anonimo que me llega como parametro
    Tasks[0] := TTask.Create(ATask);
    // comienza a ejecutarse el proceso
    Tasks[0].Start;
    // esto es para mostrar el Formulario, inicialmente no estaba visible
    Show;

    // hasta que no termine el proceso, tengo que seguir procesando los mensajes de Windows,
    // esto es para que la barra de progreso "se mueva"
    while Tasks[0].Status = TTaskStatus.Running do
        Application.ProcessMessages;

    // una ves terminada la tarea, cierro el form automaticamente
    Close;
end;

Ejemplo de uso:

Código Delphi [-]
procedure TFLogin.BtnAceptarClick(Sender: TObject);
begin
    try
        // creamos nuestro dialogo con barra de progreso
        Application.CreateForm(TFProgressDialog, FProgressDialog);
        // llamamos al metodo Initialize, aqui le estoy enviando el metodo de mi DataModule que esta definido mas arriba
        FProgressDialog.Initialize(DM.Conectar, 'Conectando', 'Conectando, por favor espere...');
    finally
        // liberamos el form
        FProgressDialog.Free;
    end;
end;

Un saludo y espero que les sirva, quiza es algo muy basico y simple pero apenas estoy explorando esta libreria

ElKurgan 09-04-2015 08:57:03

Gracias por el aporte


La franja horaria es GMT +2. Ahora son las 03:07:59.

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