Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TFieldGetTextEvent (https://www.clubdelphi.com/foros/showthread.php?t=41038)

jlrbotella 06-03-2007 14:40:07

TFieldGetTextEvent
 
Hola:

Tengo un problema al llamar desde un evento a un procedimiento. He estado revisando el foro y hay un ejemplo de como formatear campos usando el evento TFieldGetTextEvent.

Mi procedimiento lo declaro como:

procedure FormatearFechaHoraEDI(Sender: TField; var Text: string; DisplayText: Boolean);

Pero cuando lo llamo desde una tabla, desde esta forma:

mitabla.ongettext := formatearFechaHora;

El compilador me devuleve el siguiente error:

[Pascal Error] pedidos_entrada.pas(183): E2010 Incompatible types: 'TFieldGetTextEvent' and 'Pointer'

¿Qué error cometo?.

Gracias,
JL

jhonny 06-03-2007 15:07:46

Bueno pues asi a simple vista...

Tu dices que el procedimiento tiene como nombre FormatearFechaHoraEDI pero estas asignando otro llamado formatearFechaHora, ademas de que lo estas asignando a un procedimiento llamado ongettext y asumo de que la tabla se llama mitabla y en ese caso pues las tablas no tienen dicho evento desde la fabrica.

Lepe 06-03-2007 16:30:55

además de lo dicho, tu procedimiento debe estar declarado así:

procedure TForm1.FormatearFechaHoraEDI(Sender: TField; var Text: string; DisplayText: Boolean);

TForm1, TFormXXX, lo que quieras, pero dentro de una clase.

Saludos

jlrbotella 06-03-2007 17:16:56

De eventos a procedures
 
Hola:

He comprobado que me he equivocado en el nombre de función, pero ha sido un error. Aquí teneís un ejemplo más claro:


Código Delphi [-]
unit libedicom;
 
interface
 
uses db, sysutils, ifxsql, classes, ifxconnection, dialogs, ifxdataset;
 
procedure FormatearEstadoDI(Sender: TField; var Text: string; DisplayText: Boolean);






.....


Código Delphi [-]
unit pedidos_entrada;
 
interface
 
uses
db,dialogs, libedicom
 
type
  TfChildPedidoEntrada = class(TForm)
    private
       mitabla : TTable;
   end;
....
 
procedure TfChildPedidoEntrada.FormShow(Sender: TObject);
begin
    miTabla.fieldbyname('estado').OnGetText :=  libedicom.FormatearEstadoEdi;
end;






He comprobado que la función FormatearEstadoEdi, solo funciona cuando la declaro dentro de la clase TfchilpedidoEntrada. ¿Por que no la puedo poner en otro unit?.

Gracias.
JL

Lo Edite para arreglar las etiquetas delphi

jlrbotella 06-03-2007 17:56:39

Llamar a un procedimiento desde un evento
 
Hola:

Para llamar un evento que esta en otro unit, se debe crear una clase llamada "dumy class", consulta la página siguiente:

http://delphi.about.com/cs/adptips20...ltip1003_5.htm

Cuando el evento y el procedimiento están dentro de la misma clase es mucho más sencillo, ya que no hay que hacer nada.

Saludos,
JL

Lepe 06-03-2007 19:51:46

A ver, y digo yo. Ya tienes la tabla dentro de una ventana, useasé la clase TfChildPedidoEntrada, ¿por qué no creas el evento ahí mismo y después dentro, llamas a la rutina que más te guste?, reusas código, no creas un objeto que no necesitas, y reusas la rutina, vamos, algo tan simple como esto:

Código Delphi [-]
unit pedidos_entrada;
 
interface
 
uses
db,dialogs, libedicom
 
type
  TfChildPedidoEntrada = class(TForm)
    private
       mitabla : TTable;
       procedure MiEventoChulo(Sender: TField; var Text: string; DisplayText: Boolean);
   end;
....
 
procedure TfChildPedidoEntrada.MiEventoChulo(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  libedicom.FormatearEstadoEdi(Sender, text,DisplayText);
end;

procedure TfChildPedidoEntrada.FormShow(Sender: TObject);
begin
    miTabla.fieldbyname('estado').OnGetText :=  MiEventoChulo;
end;

El por qué no te deja compilar es bien simple. un evento está declarado como:
Código Delphi [-]
procedure of object
Y un procedimiento fuera de una clase como:
Código Delphi [-]
procedure

La diferencia es que se usan técnicas distintas para identificar a cada uno de ellos, por tanto, da el error de tipos distintos.

Para quien quiera saberlo:
- Para identificar un procedure se usa un puntero de 4 bytes (32 bits)
- Para identificar un procedure of object se usa dos punteros de 4 bytes (64 bits).

Saludos

Saludos.

jlrbotella 06-03-2007 20:59:06

Hola:

Pues tambien funciona.

Gracias.
JL


La franja horaria es GMT +2. Ahora son las 10:36:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi