PDA

Ver la Versión Completa : Eventos en aplicacion modo Console (Delphi)


soivago
21-03-2007, 17:02:47
Desearia la colaboracion de los companeros de foro...

Estoy haciendo una aplicacion en modo console {$APPTYPE CONSOLE}
en delphi, utilizo los componentes de INDY IdTCPClient y IdLogEvent funciona bien solo que no consigo hacer que IdLogEvent responda a los eventos (necesito respuestas del otro equipo) al intentar ejecutar el siguiente codigo genera un error
al asociar el evento IdLogEvent1ReceivedNEW
IdLogEvent1 := TIdLogEvent.Create(nil);
TcpClient1 := TIdTCPClient.Create(nil);
try
IdLogEvent1.OnReceived := IdLogEvent1ReceivedNEW;
TcpClient1.BoundIP := '172.23.8.4';
TcpClient1.BoundPort := 1050;
TcpClient1.ReadTimeout := int_TimeOut;
except
end;

Desde ya muchas gracias por su colaboracion

roman
21-03-2007, 18:08:08
Trata siempre de poner el error que te marca y si sucede durante la ejecución o la compilación, porque de otra manera tenemos que estar adivinando, y eso es lo que voy a intentar hacer.

Dado que estás en una aplicación de consola, no tienes un formulario donde poner los eventos, de manera que me imagino que has declarado IdLogEvent1ReceivedNEW como un procedimiento normal:


procedure IdLogEvent1ReceivedNEW(Sender: TObject ... );


pero los eventos en Delphi deben ser métodos. Lo que puedes hacer es declarar una clase específica para acoger los eventos:


type
TEvents = class
procedure IdLogEvent1ReceivedNEW(Sender: TObject ... );
end;


No podría asegurarlo en estos momentos pero creo que ni siquiera tienes que instanciar un objeto TEvents si declaras el método con class:


type
TEvents = class
class procedure IdLogEvent1ReceivedNEW(Sender: TObject ... );
end;


De forma que en tu código original pondrías:


IdLogEvent1.OnReceived := TEvents.IdLogEvent1ReceivedNEW;


// Saludos

soivago
21-03-2007, 19:53:56
Gracias por responder tan rapido!
No me di cuenta que no coloque el error , pido disculpas, el error al compilar es el siguiente:

Incompatible types: 'method pointer and regular procedure'

roman
21-03-2007, 19:56:15
Bueno, tienes que implementar el método, de eso no te salvas :D:


type
TEvents = class
class procedure IdLogEvent1ReceivedNEW(Sender: TObject ... );
end;

implementation

class procedure TEvents.IdLogEvent1ReceivedNEW(Sender: TObject ... );
begin
bla, bla, bla
end;


// Saludos

soivago
21-03-2007, 20:26:40
Te comento que funciono, y que si le colocas implementation da error al compilar dice que falta un punto (.)

aca te muestro mas o menos como quedo el programa...
lo que hace es enviar un mensaje , y con el evento que creamos cuando recibe una respuesta la escribe en un archivo
lo que esta en rojo es lo que me daba problemas y ahora funciona,
MUCHAS GRACIAS!!!





program ActualizaHoraMD400_Console;

{$APPTYPE CONSOLE}

uses
// *********Estas son las que usaba la version con UI
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, etc...

type
TEvents = class
class procedure IdLogEvent1ReceivedNEW(ASender: TComponent; const AText, AData: String);
end;

//implementation

var
//********** Aca van los componentes
TcpClient1: TIdTCPClient;
IdLogEvent1: TIdLogEvent;
//**********

Relojes : array of TReloj;
archLog : String;
cuanto : integer;
const Const_Un_Minuto : Real = 0.00069445; // = 1 minuto
FUNCTION Loguear(mensaje : String; archivoLog : String = sys_directorio + 'archivo.log') : Boolean;
var
Arch : TextFile;
begin
try
result := TRUE;
try
AssignFile(Arch, archivoLog);
if NOT FileExists(archivoLog) then // NO existe un archivo de log
Rewrite(Arch) // Crea Archivo log
else
Append(Arch); // SI ya existe lo abre para agregar datos
finally
Writeln(Arch, mensaje); // escribe en el archivo
Flush(Arch); // vacia el buffer del archivo texto
CloseFile(Arch); // lo cierra de nuevo
end;
except
Result := FALSE;
end;
end;
Class PROCEDURE TEvents.IdLogEvent1ReceivedNEW(ASender: TComponent; const AText, AData: String);
begin
Loguear(AText + ' Respuesta de ' + TIdTCPClient(IdLogEvent1.Connection).Host + ' >> ' + Adata, archLog);
TcpClient1.Disconnect;
end;
PROCEDURE ActualizaDatosPC();
begin
try
IdLogEvent1 := TIdLogEvent.Create(nil);
TcpClient1 := TIdTCPClient.Create(nil);
try
IdLogEvent1.OnReceived := TEvents.IdLogEvent1ReceivedNEW;
IdLogEvent1.Active := TRUE;
TcpClient1.Intercept := IdLogEvent1;
TcpClient1.BoundIP := '172.23.8.4'; //GStack.LocalAddress;
TcpClient1.BoundPort := 0;
TcpClient1.ReadTimeout := int_TimeOut;
except
Loguear('Error al obtener el IP Local', archLog);
raise
end;
except
Loguear('Error al obtener el IP Local', archLog);
raise;
end;
end;

roman
21-03-2007, 20:30:41
si le colocas implementation da error al compilar

¡Claro! No sé en qué estaba pensando. No estamos en una unidad, de manera que no hay secciones de interfaz e implementación.

Bueno, me alegra que te haya funcionado.

// Saludos