PDA

Ver la Versión Completa : Barra progreso con IdSMTP...Como hacerla??


AFilth
18-12-2005, 14:23:32
Buenas a todos. La pregunta es la siguiente:
¿Cómo podría crear una barra de progreso para que cuando mando el mail con el componente IdSMTP vaya subiendo hasta el final y no de la sensación de que se ha kedado colgado?
Esto viene pq al adjuntar archivos de unos cuantos cientos de Kbs el programa se keda un tiempo sin hacer nada. La solución sería hacer algún tipo de barra de progreso pero no sé a q asociarla...
Salu2.

dec
18-12-2005, 15:27:14
Hola,

He escrito algo para que hagas unas pruebas y tal. Parece funcionar, pero, de todos modos, no dejes de revisar la ayuda de los eventos, de los componentes, en fin, de lo que sea menester, porque puedo estar olvidándome de cosas, por poner un ejemplo de lo que puedo estar haciendo mal. No va con mala intención, desde luego. ;)


{ Se asumen cuatro componentes en un formulario:

- ProgressBar, de tipo TProgressBar
- Button, de tipo TButton
- IdSMTP, de tipo TIdSMTP
- IdMessage, de tipo TIdMessage
}

{ Cambia estas constantes por los valores adecuados. }
const
ADJUNTO = 'C:\adjunto.zip';
ORIGEN = 'origen@wanadoo.es';
DESTINO = 'destino@correo.com';
SERVIDOR = 'smtp.correo.es';

{ Cortesía de Lepe, para calcular el tamaño de un archivo.
(http://www.clubdelphi.com/foros/showthread.php?t=17105)
}
function GetFileSize(FileName: string): int64;
var
Srec: TSearchRec;
begin
if FindFirst(FileName, $01+$04+$20, Srec) = 0 then
Result := Srec.FindData.nFileSizeHigh *MAXDWORD +
Srec.FindData.nFileSizeLow
else
Result := 0;
findclose(Srec);
end;

{ Evento "OnClick" de "Button1": en este caso nos
vale para enviar el correo desde aquí mismo.
}
procedure TForm1.ButtonClick(Sender: TObject);
begin
IdMessage.From.Address := ORIGEN;
IdMessage.Recipients.Add;
IdMessage.Recipients[0].Address := DESTINO;

{ Preparamos el archivo que ha de adjuntarse al correo }
TidAttachment.Create(IdMessage.MessageParts, ADJUNTO);

{ La barra de progreso tendrá el valor máximo
correspondiente al tamaño del archivo adjunto
}
ProgressBar.Max := GetFileSize(ADJUNTO);

IdSMTP.Host := SERVIDOR;
try
IdSMTP.Connect; // Conectamos
try
IdSMTP.Send(IdMessage); // Enviamos
finally
if IdSMTP.Connected then IdSMTP.Disconnect;
ShowMessage('El correo se ha enviado correctamente');
end;
except
on E: Exception do
MessageDlg(E.Message, mtError, [mbOK], 0);
end;

ProgressBar.Position := 0; // Ponemos la barra a 0
end;

{ Evento "OnWorkBegin" del componente "TIdSmtp".
Según la ayuda de este evento junto con "OnWork"
y "OnWorkEnd" puede utilizarse para mantener in-
formado al usuario (en una aplicación con GUI)
del progreso de la tarea que está realizándose.

Revísese la ayuda de estos eventos, en fin.
}
procedure TForm1.IdSMTPWorkBegin(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
{ Deberíamos tener en la constante "AWorkCount"
el número de bytes implicados en la operación
de lectura o escritura que acaba de comenzarse.
Sin embargo, esto no es así a veces (no me pre-
guntes porqué) y así, solamente en caso de que
la constante "AWorkCountMax" valga algo asigna-
remos a la barra de progreso ese "algo", que es
lo que nos interesa en este caso.
}
if (AWorkCountMax <> 0) then
ProgressBar.Max := AWorkCountMax;
end;

{ Evento "OnWork" del componente "TIdSmtp". Tenemos
aquí a nuestra disposición, entre otras cosas, la
constante "AWorkCount". Esta constante nos ofrece
el número de bytes que se han leído o escrito en
en la operación de lectura/escritura que se esté
llevando a cabo.
}
procedure TForm1.IdSMTPWork(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
Application.ProcessMessages;
// Actualizamos la barra de progreso
ProgressBar.Position := AWorkCount;
end;

{ Evento "OnWorkEnd". Se produce cuando se termina
una operación de lectura o escritura. Haz unas prue-
bas con el mismo, "descomenta" la línea comentada
y ves qué ocurre y si te interesa, en definitiva,
para algo, utilizar este evento en tu caso.
}
procedure TForm1.IdSMTPWorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
begin
// ProgressBar.Position := 0;
end;

AFilth
19-12-2005, 16:08:26
Ok, muchas gracias por la información, en cuanto tenga un poco de tiempo lo pruebo, pero ya me has indicado el camino a seguir.
Un saludo.

AGAG4
20-12-2005, 00:59:49
Muchas Gracias DEC, tengo un envio de correos y me faltaba algo así, que cosas también tengo un envio por FTP y aqui ya lo tenía ;)....

Que tengan buen día.