Ver Mensaje Individual
  #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
Reputación: 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