Ver Mensaje Individual
  #3  
Antiguo 29-06-2012
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Reputación: 22
movorack Va camino a la famamovorack Va camino a la fama
Muchas gracias por tu respuesta.

Estoy haciendo pruebas para poder implementar en el componente lo que llegué a conseguir con los datos que me haz pasado.

Código Delphi [-]
..

//Agregué el tipo de dato a la unidad
TKplProc = procedure (Sender : TObject) of object; //Lo de KPL es solo por el estandar de la empresa

..

//En la unidad agregué una variable para el ejercicio
FStTonteria : String; //En el OnCreate asigné a esta variable el valor 'Tonteria'

..

//Agregué un botón que hace una tonteria
procedure TFrmTestPlanEjecD5.BtnTontoClick(Sender: TObject);
begin
  ShowMessage(FStTonteria);
end;

//Y por ultimo agregué este codigo en otro boton donde alfin obtuve el nombre del procedimiento.
procedure TFrmTestPlanEjecD5.BtnProcClick(Sender: TObject);
  var
    lProc : TKplProc;
begin  
  lProc := BtnTontoClick;
  FStTonteria := MethodName(@lProc);
  lProc(BtnTonto); //Esto me llama el otro procedimiento y el resultado es un mensaje diciendo BtnTontoClick
end;

..

Hasta ahora, en el programa de pruebas funciona. pero cuando aplico el mismo código en el componente no funciona.

Código Delphi [-]
  TKPlAccionProc = procedure(Sender : TObject) of object;
  TKPlAccionItem = class(TCollectionItem)
  private
    FNombre : String;
    FForma  : TForm;
    FEvento : TKPlAccionProc;
    FNomEve : string;
    procedure SetNombre(const Value: String);
    procedure SetEvento(const Value: TKPlAccionProc);
    procedure SetForma(const Value: TForm);
    function GetForma: TForm;
  protected
    function GetDisplayName : String; override;
  public
    procedure Assign(Source: TPersistent); override;
  published
    property Nombre : String read FNombre write SetNombre;
    property Forma  : TForm read GetForma write SetForma;
    property Evento : TKPlAccionProc read FEvento write SetEvento;
    property NomEve : string read FNomEve write FNomEve; //Esto lo publique solo para hacer pruebas en el aplicativo
  end;

  ..

  procedure TKPlAccionItem.SetEvento(const Value: TKPlAccionProc);
  begin
    FEvento := Value;
    FNomEve := MethodName(@Value); //Aquí el codigo tal cual lo hago en el programa de pruebas
  end;

  ..

Y en el programa de pruebas tengo

Código Delphi [-]
procedure TFrmTestPlanEjecD5.BtnAddAccionClick(Sender: TObject);
  var
    lAccion : TKplAccionItem;
    lNomEve : string;
begin
  lAccion := KPlGenDefi.Acciones.Add;
  lAccion.Nombre := 'AccionTonta';
  lAccion.Evento := BtnTontoClick; //Aquí efectivamente llama al SetEvento del componente y aunque ejecuta el MethodName no devuelve el nombre
  lNomEve := MethodName(@lAccion.Evento); //En cambio este MethodName si obtiene el nombre del procedure
  ShowMessage(Format('lAccion.NomEve : %s -- lNomEve : %s',
                     [QuotedStr(lAccion.NomEve),
                      QuotedStr(lNomEve)]));
end;

La verdad no se que estoy pasando por alto al implementar en el componente pero no logro obtener el resultado desde la variable del componente pero la variable local lNomEve si muestra el nombre correspondiente "BtnTontoClick".
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita