Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Eventos en aplicacion modo Console (Delphi) (https://www.clubdelphi.com/foros/showthread.php?t=41644)

soivago 21-03-2007 17:02:47

Eventos en aplicacion modo Console (Delphi)
 
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:

Código Delphi [-]
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:

Código Delphi [-]
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:

Código Delphi [-]
type
  TEvents = class
    class procedure IdLogEvent1ReceivedNEW(Sender: TObject ... );
  end;

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

Código Delphi [-]
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:

Código Delphi [-]
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

Perfecto solucionado!!!!
 
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!!!




Código Delphi [-]
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

Cita:

Empezado por soivago
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


La franja horaria es GMT +2. Ahora son las 07:11:13.

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