Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-03-2007
soivago soivago is offline
Registrado
 
Registrado: abr 2006
Posts: 6
Poder: 0
soivago Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 21-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 21-03-2007
soivago soivago is offline
Registrado
 
Registrado: abr 2006
Posts: 6
Poder: 0
soivago Va por buen camino
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'

Última edición por soivago fecha: 21-03-2007 a las 20:58:58.
Responder Con Cita
  #4  
Antiguo 21-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bueno, tienes que implementar el método, de eso no te salvas :

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
Responder Con Cita
  #5  
Antiguo 21-03-2007
soivago soivago is offline
Registrado
 
Registrado: abr 2006
Posts: 6
Poder: 0
soivago Va por buen camino
Smile 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;
Responder Con Cita
  #6  
Antiguo 21-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener el nombre de la aplicacion en modo consola jlrbotella API de Windows 2 05-03-2009 07:39:39
Ocultar aplicación hecha en modo 'Console' tiel Varios 6 10-05-2006 00:01:59
Aplicacion sin form que maneje eventos Sotrono Varios 10 10-10-2005 17:17:57
¿Es posible utilizar Console.WriteLine desde una Aplicación Web ASP.NET? mamen .NET 6 01-04-2005 18:39:39
eventos de teclado en una aplicacion CLX ctronx Varios 5 12-06-2004 18:55:02


La franja horaria es GMT +2. Ahora son las 12:37:16.


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