Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   mostrar Guage mientras envio correo (https://www.clubdelphi.com/foros/showthread.php?t=58924)

jocey 06-08-2008 13:53:15

mostrar Guage mientras envio correo
 
hola a la familia del club, tengo un form donde envio un correo con adjunto y s me demora un poco, entonces los usuarios piensan que esta colgada... ahora me gustaria mostrar un Guage mientras ocurre este proceso... les pongo la unit para que vean y me dicen cual podria ser la solucion... a, ya busque y no encuentro nada que se ajuste a lo que necesito.

Gracias de antemano.

Código Delphi [-]
procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var SMTP: TIdSMTP;
   Mensaje: TIdMessage;
   Adjunto: TIdAttachment;
begin

  // Creamos el componente de conexión con el servidor
  SMTP := TIdSMTP.Create( nil );
  SMTP.Username := sUsuario;
  SMTP.Password := sClave;
  SMTP.Host := sHost;
  SMTP.Port := 25;
  SMTP.AuthenticationType := atLogin;

  // Creamos el contenido del mensaje
  Mensaje := TIdMessage.Create( nil );
  Mensaje.Clear;
  Mensaje.From.Name := sDestino;
  Mensaje.From.Address := sDestino;
  Mensaje.Subject := sAsunto;
  Mensaje.Body.Text := sMensaje;
  Mensaje.Recipients.Add;
  Mensaje.Recipients.Items[0].Address := sDestino;

  // Si hay que meter un archivo adjunto lo creamos y lo asignamos al mensaje
  if sAdjunto <> '' then
  begin
    if FileExists( sAdjunto ) then
      Adjunto := TIdAttachment.Create( Mensaje.MessageParts, sAdjunto );

  end
  else
    Adjunto := nil;

  // Conectamos con el servidor SMTP
  try
    SMTP.Connect;
  except
    raise Exception.Create( 'Error al conectar con el servidor.' );
  end;

  // Si ha conectado enviamos el mensaje y desconectamos
  if SMTP.Connected then
  begin
    try
      SMTP.Send( Mensaje );
    except
      raise Exception.Create( 'Error al enviar el mensaje.' );
    end;

    try
      SMTP.Disconnect;
    except
      raise Exception.Create( 'Error al desconectar del servidor.' );
    end;
  end;



procedure TFormemail.btnenviarClick(Sender: TObject); // le paso parametros al proc enviarmensaje
var path : string;
begin
EnviarMensaje ('usuario', 'pass', 'ejemplo.com',
               path , 'Reporte de Calidad',
               'usuario@ejemplo.com', 'Reporte de Calidad' );
end;

coso 06-08-2008 14:55:30

Hola, lo mejor seria incluir un componente TTimer, y en su onTimer, actualizar alguna barra de progreso, poniendo Timer.enabled := true, false justo antes de empezar y al acabar. Eso si, para que fuese correcto deberas averiguar antes de empezar a bajar de cuantos kb es el fichero, para asi tener el tope de tu barra o gauge.

jocey 06-08-2008 15:49:10

mostrar Guage mientras envio correo
 
si, me imagino que debe ser por esa via, el problema es que no tengo la minima idea de como empezar, me serviria igual un progressbar, lo que no se hacer es como yo puedo declarar el MAX del con respecto al tamaño del fichero......

Omega 06-08-2008 15:51:31

Revisa este post, es para IdHTTP pero creo que IdSMTP también tiene esos eventos.

Espero que te sirva.:)

PD: 2º vez en el día que linkeo a ese post xD

Saludos.

dec 06-08-2008 15:57:39

Hola,

Quizá puedas aprovechar ciertos eventos del componente "IdSMTP". Aquí puedes ver más o menos cómo podría quedar:

Código Delphi [-]
procedure TForm1.IdSMTPWork(ASender: TObject;
 AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  Gauge1.Progress := AWorkCount;
  //Application.ProcessMessages();
end;

procedure TForm1.IdSMTPWorkBegin(ASender: TObject;
 AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  Gauge1.MaxValue := AWorkCountMax;
end;

procedure TForm1.IdSMTPWorkEnd(ASender: TObject;
 AWorkMode: TWorkMode);
begin
  Gauge1.Progress := 0;
end;

Sin embargo, he dicho quizá puedes aprovechar, y es que, hasta donde yo llego, estos eventos no funcionan todo lo bien que se espera, igual porque dependen también de información que debe proporcionar el servidor SMTP, y que, no sé si a veces es que no la proporciona, o si están obligados a hacerlo o qué.

En todo caso, por ahí irían los tiros... quiero decir, esos son los eventos que proporciona el componente "IdSMTP" (y en general el resto de los componentes Indy) para hacer lo que quieres.

jocey 06-08-2008 17:01:00

mostrar Guage mientras envio correo
 
dec y omega, sus respuestas han sido como siempre sensacionales, a ver, a mi se me ocurrio crear el componente IdSMTP en tiempo de ejecuacion, se que estoy bloqueado con esto, nunca lo habia hecho y no me entra la forma de hacerlo, no lo logro cuadrar como lo voy a hacer... si me pueden ayudar bien y si no.... no hay problemas... ya bastantehan hecho.

Omega 06-08-2008 18:33:22

Revisa esto:

Código Delphi [-]
 SMTP.OnWorkBegin := IdSMTPWorkBegin;
 SMTP.OnWork := IdSMTPWork;
 SMTP.OnWorkEnd := IdSMTPWorkEnd;

PD: Yo también quiero dar las gracias a dec, ya que con el post que cite antes he podido hacer para bajar un archivo con barra de progreso.


La franja horaria es GMT +2. Ahora son las 00:03:25.

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