Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-12-2005
AFilth AFilth is offline
Miembro
 
Registrado: ago 2005
Posts: 119
Poder: 19
AFilth Va por buen camino
Question Barra progreso con IdSMTP...Como hacerla??

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.
Responder Con Cita
  #2  
Antiguo 18-12-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.

Código Delphi [-]
{ 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;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-12-2005 a las 15:37:22. Razón: Edición del código fuente.
Responder Con Cita
  #3  
Antiguo 19-12-2005
AFilth AFilth is offline
Miembro
 
Registrado: ago 2005
Posts: 119
Poder: 19
AFilth Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 20-12-2005
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Ok

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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:29:45.


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
Copyright 1996-2007 Club Delphi