[Lazarus-es] asignar un procedimiento
Maxi
maximiliano.duarte en gmail.com
Mar Jun 15 21:11:45 CEST 2010
2010/6/15 José Mejuto <joshyfun en gmail.com>:
> Hello christian,
>
> Tuesday, June 15, 2010, 7:05:39 PM, you wrote:
>
> cO> *type *Tlaclase = class
> cO> *public *
> cO> *Procedure *Elprocedimiento(sender:tobject)
> cO> ----
> cO> *end*
> cO> ----------
> cO> *public *
> cO> *procedure *button.click(sender:tobject);
> cO> *procedure *OtroProcedure(sender:tobject);
> cO> .......
> cO> *implementation*
> cO> *procedure *Totraclase.button.click(sender:tobject);
> cO> var instancia: Tlaclase;
> cO> *begin*
> cO> instancia:= Tlaclase.create (..)
> cO> instancia.Elprocedimiento :=@OtroProcedure * --> Esto me genera error *
> cO> *end*
> cO> *procedure *Totraclase.OtroProcedure(sender:tobject);
>
> ElOtroprocedimiento no es un evento, es un procedimiento, que no se
> puede cambiar. Para eso "ElOtroprocedimiento" tendría que ser un
> evento, al estilo de "OnElOtroProcedimiento", vamos una property o
> variable.
>
> --
> Best regards,
> José
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
Si se puede cambiar solo que tenes que respetar el los parametros que
espera, y el error esta en @ eso es para punteros a funciones, cuando
queres llamar aun metodo de una dll. No para lo que estas haciendo
Te paso un estracto para cargar procedimientos dinamicos buscandolos por nombre
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
published
Procedure LoadFormConsultaPadron;
end;
implementation
uses
windows, Constantes,inifiles;
{$R *.dfm}
Type
TExecute0 = procedure of object;
TExecute1 = procedure (aPerms:Integer)of object;
TExecute2 = procedure (aParams:string;aPerms:Integer)of object;
Implementation
//******************************************************************************
//***************************** Metodos dinamicos *****************************
//******************************************************************************
Procedure TForm1.ExecByName(aFormName:string);//,aParams:string;aPermisos:Integer);
var
Routine: TMethod;
begin
// Acceder al procedimiento
Routine.Code := MethodAddress(aFormName);
try
if Assigned(Routine.Code) then // Encontrado?
//para delphi {$WARNINGS OFF}
TExecute0(Routine)//(aParams,aPermisos);
//para delphi {$WARNINGS ON}
else
Application.MessageBox(pchar(format('No se encuentra la función
"%s".',[aFormName])),'Información',MB_OK+MB_ICONHAND);
except
raise Exception.CreateFmt('Error al cargar la función "%s".',[aFormName]);
end;
END;
Procedure TIWUserSession.LoadFormConsultaPadron;
begin
TFormConsultaPadron.Create(application).Show;
end;
Dependiendo de tu necesidad podes usar un metodo con mas de un parametro.
--
Twitter: @nenunocomar
Maximiliano Duarte
Linux User #495070
Ubuntu User #28504
El que pregunta aprende, y el que contesta aprende a responder.
More information about the Lazarus-es
mailing list