[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