Unidad con objetos

Espero que te vaya todo bien. Tengo un pequeño problema. Estoy haciendo una unidad de FTP, en la que creo una instancia del objeto TidFtp. Tengo varios procedimientos, conectar, desconectar, enviar, recibir, los cuales funcionan bien. El problema está en un evento del objeto TidFtp, no se como relacionar el procedimiento que debería estar asociado al evento del objeto, por lo que el evento cuando se dispara no llama al procedimiento. Te pongo parte del código, si se te ocurre algo ... Muchas gracias.
unit UFtp;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdFTP, IdFTPCommon, FileCtrl, ExtCtrls, ComCtrls;
var
IdFTP1: TIdFTP;
g_BytesEnviados : Integer;
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
procedure Conectar(p_Host:String;p_Username:String;p_Password:String;p_Aviso:Integer;out p_Error:Integer);
procedure Desconectar(p_Aviso:Integer; out p_Error:Integer);
procedure Enviar(p_Origen:String;p_Destino:String;p_Aviso:Integer;out p_Error:Integer);
procedure Recibir(p_Origen:String;p_Destino:String;p_Aviso:Integer;out p_Error:Integer);
implementation
....
//------------------------------------------------------------------------------
// EVENTO IDFTP - W O R K
//------------------------------------------------------------------------------
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
g_BytesEnviados := AWorkCount;
end;

1 respuesta

Respuesta
1
Bueno mira ahorita estoy trabajando con .net y la maquina donde esta delphi la esta usando otro compañero... así que no podría revisar tu código rapido...
Pero me dices que tu no tienes una form... que lo tienes solo en una unidad, lo cual significa que estas creando tu el componente eso no me habías dicho jejejeje, bueno entonces supongo que no has asociado el procedure al objeto, es muy sencillo asociarlo simplemente pon idFTP. OnWork := IdFTP1Work; y es todo logicamente tomando en cuenta que los parametros son los mismo que requiere. Ok intentalo así.
Ahora si no te funciona es probable que haya algo muy extraño pero eso ya seria con el componente, así que lo recomendable seria que hagas un DataModule y ahí pongas ese componente idFTP en vez de crearlo en la unidad lo hagas ahí de forma gráfica, es decir arrastrar el componente a tu DataModule crearle su método, agregar en el uses de tu unidad la unidad del dataModule y ya poder accesar a tu componente.
Hola,
he estado mirando varias demos, todas las demos usan un form donde insertan el objeto idFtp, esto no me vale, pues yo no tengo form, solo la unidad, con el form si se hacerlo, ahí no hay problema. Si me dices un mail te mando el proyecto y quizás así me comprendas mejor.
¿Supongo qué lo que quieres hacer es que te vaya indicando cuantos bytes esta enviando como para poner un progress e ir viendo el avance correcto?...
Aunque no entendí tu problema... ¿lo qué intentas decirme es que este evento de Work no se esta disparando nunca?... ponle un break Point si se detiene entonces si esta entrando... pero quizá la variable AWorkCount no esta trayendo nada... dime primero si el evento al menos si se esta ejecutando... ok.
Saludos ah y dime que delphi esta utilizando.
Utilizo delphi 7. Efectivamente no se dispara el evento, y no se dispara porque no se de que manera relacionar el evento work con el objeto idftp, no existe enlace en una unidad a diferencia de un form en el que haciendo doble click sobre la propiedad del evento work del objeto idftp creas un enlace consiguiendo así que se ejecute el código del procedure cuando se dispara el evento. Si me dices un mail te mando el código y puedes verlo tranquilamente, es pequeño.
Muchas gracias por tu atención.
Lobo.
Haz lo siguiente...
Delphi trae un folder llamado Demos y ahí vienen demos de varios componentes, entre ellos viene un folder de INDY que son los componentes que estas usando, no vienen los demos pero ahí viene un archivo texto donde te da el sitio para que bajes estos demos, bajalo y ahí veras el código que ocupas.. checalo y si tienes alguna duda me escribes de nuevo. Por si no encuentras el folder las direcciones son:
www.nevrona.com/indy
www.groups.yahoo.com/group/indy-demos
Buenas, no estoy creando el componente (por eso no te lo he dicho), solo una unidad (unit) con funciones sobre el componente TIdFtp. El como asociar el evento con el procedimiento que me dices que es tan fácil, hace tiempo que lo probé y me da un error de compilación, indicando incompatibilidad de tipos. El componente va bien porque he trabajado con el dentro de formularios y he trabajado con ese evento y no hay ningún problema. El DataModule queda descartado porque los DataModule dan muchos problemas a la hora de convertir una aplicación en bpl. Me temo que hasta que no veas el código no me vas a entender. Saludos.
ok, enviala aquí: [email protected]
En cuanto pueda verla te contesto...
Muchas gracias por tu ayuda, me ha servido de mucho, ya lo tengo funcionando, mi problema era el no reconstruit la clase. Pego el código por si alguien lo necesita. De nuevo, muchas gracias Manuel.
unit UFtp;
interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdFTP, IdFTPCommon, {ileCtrl,}ExtCtrls, ComCtrls;
type TFTP = class
IdFTP1: TIdFTP;
private
g_BytesEnviados : Integer;
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
public
constructor create;
end;
var
MiFTP: TFTP;
procedure Conectar(p_Host:String;p_Username:String;p_Password:String;p_Aviso:Integer;out p_Error:Integer);
procedure Desconectar(p_Aviso:Integer; out p_Error:Integer);
procedure Enviar(p_Origen:String;p_Destino:String;p_Aviso:Integer;out p_Error:Integer);
procedure Recibir(p_Origen:String;p_Destino:String;p_Aviso:Integer;out p_Error:Integer);
implementation
constructor TFTP.create;
begin
IdFTP1 := TIdFTP.Create(IdFTP1);
IdFTP1.OnWork := IdFTP1Work;
end;
{*******************************************************************************
U N I D A D FTP
*******************************************************************************}
(* TABLA DE ERRORES - p_Error = 0 : Todo OK
p_Error = 1 : Error genérico
p_Error = 2 : Error al no encontrar el fichero
p_Error = 3 : Error al intentar hacer acciones sin conexión
*)
//------------------------------------------------------------------------------
// C O N E C T A R
//------------------------------------------------------------------------------
procedure Conectar(p_Host:String;p_Username:String;p_Password:String;p_Aviso:Integer;out p_Error:Integer);
begin
try
MiFTP := nil;
MiFTP := TFTP.create;
p_Error := 0; //0 - Indica que NO hay error
MiFTP.IdFTP1.Host := p_Host; //'111.1.2.22';
MiFTP.IdFTP1.Username := p_Username; //'usuario';
MiFTP.IdFTP1.Password := p_Password; //'password';
MiFTP.IdFTP1.Connect;
if MiFTP.IdFTP1.Connected then
begin
if p_Aviso = 1 then MessageDLG('Conectado.',mtInformation,[mbOk],0);
end
else
begin
p_Error := 1; //Error en la conexión.
end;
except
on e:exception do
begin
p_Error := 0; //No mandamos el error pq ya lo indicamos aquí
MessageDLG(e.Message,mtWarning,[mbOk],0);
end;
end;
end;
//------------------------------------------------------------------------------
// D E S C O N E C T A R
//------------------------------------------------------------------------------
procedure Desconectar(p_Aviso:Integer; out p_Error:Integer);
begin
try
p_Error := 0; //Indica que NO hay error
MiFTP.IdFTP1.Quit;
MiFTP.IdFTP1.Disconnect;
except
on e:exception do
begin
if p_Aviso = 1 then MessageDLG(e.Message,mtWarning,[mbOk],0);
p_Error := 1; //Indica que hay error
end;
end;
end;
//------------------------------------------------------------------------------
// E N V I A R
//------------------------------------------------------------------------------
procedure Enviar(p_Origen:String;p_Destino:String;p_Aviso:Integer;out p_Error:Integer);
//p_Origen : Path y fichero
//p_Destino : Path y fichero
var Tam, FHandle : integer;
begin
if FileExists(p_Origen) then
begin
p_Error := 0;
//Tratamiento del fichero
FHandle := FileOpen(p_Origen, 0);
Tam := Getfilesize(FHandle,nil); //Cogemos el Tamaño para indicar la barra de progreso
FileClose(FHandle);
if MiFTP.IdFTP1.Connected then
begin
MiFTP.IdFTP1.TransferType := ftBinary;
MiFTP.IdFTP1.BeginWork(wmWrite);
try
MiFTP.IdFTP1.Put(p_Origen,p_Destino);
MiFTP.IdFTP1.EndWork(wmWrite);
finally
if MiFTP.g_BytesEnviados < Tam then
begin
p_Error := 1;
end
else
begin
if p_Aviso = 1 then MessageDLG('Transferencia completada.',mtWarning,[mbOk],0);
end;
end;
end
else
begin
p_Error := 3; //No puede realizar esta acción, no está conectado.
end;
end
else
begin
p_Error := 2; //El fichero no se ha encontrado.
end;
end;
//------------------------------------------------------------------------------
// R E C I B I R
//------------------------------------------------------------------------------
procedure Recibir(p_Origen:String;p_Destino:String;p_Aviso:Integer;out p_Error:Integer);
var Tam, FHandle : integer;
begin
if MiFTP.IdFTP1.Connected then
begin
MiFTP.IdFTP1.TransferType := ftBinary;
Tam := MiFTP.IdFTP1.Size(p_Origen);
MiFTP.IdFTP1.BeginWork(wmRead);
try
MiFTP.IdFTP1.Get(p_Origen,p_Destino,true);
MiFTP.IdFTP1.EndWork(wmRead);
finally
FHandle := FileOpen(p_Destino, 0);
MiFTP.g_BytesEnviados := Getfilesize(FHandle,nil);
FileClose(FHandle);
if MiFTP.g_BytesEnviados < Tam then
begin
p_Error := 1; //Error en la transferencia.
end
else
begin
if p_Aviso = 1 then MessageDLG('Transferencia completada.',mtWarning,[mbOk],0);
end;
end;
end;
end;
//------------------------------------------------------------------------------
// EVENTO IDFTP - W O R K
//------------------------------------------------------------------------------
procedure TFtp.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
g_BytesEnviados := AWorkCount;
end;
end.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas