Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Procedimiento Como Parametro (https://www.clubdelphi.com/foros/showthread.php?t=84245)

Neeruu 25-09-2013 16:29:54

Procedimiento Como Parametro
 
Hola a todos...

Quería saber si en Delphi se puede hacer algo así y como:

Código Delphi [-]
      FrmMensaje.BtnOk      := (Procedure (Sender:TObject)
                                begin
                                  FrmMain.RaEdit_ClienteNro.SetFocus;
                                End);

Donde BtnOk del Formulario FrmMensaje esta definido asi:

Código Delphi [-]
property BtnOk:TNotifyEvent read neBtnOk write neBtnOk default nil;


Al compilar el proyecto me dice:
Cita:

[DCC Error] E2009 Incompatible types: 'method pointer and regular procedure'

En resumen, necesito pasar un procedimiento como parámetro y me gustaría definirlo directamente en el parámetro...
Es posible?

Saludos...

nlsgarcia 25-09-2013 17:45:52

Neeruu,

Cita:

Empezado por Neeruu
...necesito pasar un procedimiento como parámetro...

Revisa estos links:
Cita:

How to Use a Function or a Procedure as a Parameter in another Function : http://delphi.about.com/od/adptips20...ionasparam.htm

Procedure : http://www.delphibasics.co.uk/RTL.asp?Name=Procedure

Function : http://www.delphibasics.co.uk/RTL.asp?Name=Function
Espero sea útil :)

Nelson.

ecfisa 25-09-2013 18:06:50

Hola.

El error se produce por que estas asignando a la propiedad BtnOk un procedimiento normal y no un mètodo de clase.

En un TForm agrega un TButton y un TEdit y proba este ejemplo:
Código Delphi [-]
...
type
  TFrmMensaje = class(TForm)
    Button1: TButton;
    Edit1  : TEdit;
    procedure FormCreate(Sender: TObject);
  private
    FBtnOk : TNotifyEvent;
    procedure MiProc(Sender: TObject);
  public
    property BtnOk: TNotifyEvent read FBtnOk write FBtnOk;
  end;

var
  FrmMensaje: TFrmMensaje;

implementation  

procedure TFrmMensaje.MiProc(Sender: TObject);
begin
  ShowMessage(TControl(Sender).Name); 
end;

procedure TFrmMensaje.FormCreate(Sender: TObject);
begin
  BtnOk           := MiProc;
  Button1.OnClick := BtnOk;
  Edit1.OnClick   := BtnOk;
end;
...

Tal vez tambièn te puede interesar este enlace : Punteros de Metodos

Saludos :)

Neeruu 25-09-2013 18:26:46

Cita:

Empezado por ecfisa (Mensaje 467350)
El error se produce por que estas asignando a la propiedad BtnOk un procedimiento normal y no un mètodo de clase.

Claro... cuando lo defino como lo definiste tu como un método de una clase anda de 10...

dec 25-09-2013 18:35:49

Hola,

Creo que que lo que quieres usar se llama "métodos anónimos". Revisa este enlace.

Neeruu 25-09-2013 18:51:18

Código Delphi [-]
type
  TFrmMensaje = class(TForm)
    RxTheme1: TRxTheme;
    PnlBase: TPanel;
    ListBox1: TListBox;
    Panel1: TPanel;
    BtnOk: TButton;
    BtnCancel: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtnOkClick(Sender: TObject);
    procedure BtnCancelClick(Sender: TObject);    
  private
    neBtnOk:TNotifyEvent;
    neBtnCancel:TNotifyEvent;
    { Private declarations }
  public
    procedure ShowMessage(sCaption:String; sMensaje:TStrings; CantBtn:Integer);

    property BtnOk:TNotifyEvent read neBtnOk write neBtnOk default nil;
    property BtnCancel:TNotifyEvent read neBtnCancel write neBtnCancel default nil;
    { Public declarations }
  end;

var
  FrmMensaje: TFrmMensaje;

implementation

{$R *.dfm}

procedure TFrmMensaje.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caHide;
end;

procedure TFrmMensaje.BtnCancelClick(Sender: TObject);
begin
  Close;
  if Assigned(BtnCancel) then
    BtnCancel(Self);
end;

procedure TFrmMensaje.BtnOkClick(Sender: TObject);
begin
  Close;
  if Assigned(BtnOk) then
    BtnOk(Self);
end;

procedure TFrmMensaje.ShowMessage(sCaption:String; sMensaje:TStrings; CantBtn:Integer);
begin
  Case CantBtn of
    1:begin
        BtnOk.Left := PnlBase.Width-BtnOk.Width - 6;
        BtnCancel.Visible := False;
        BtnCancel.Enabled := False;
      end;
    else
      begin
        BtnOk.Left := 6;
        BtnCancel.Visible := True;
        BtnCancel.Enabled := True;
      end;
  end;


  FrmMensaje.Caption := sCaption;
  ListBox1.Items.Clear;
  ListBox1.Items := sMensaje;

  FrmMensaje.ShowModal;
end;


Al Form lo llamo de esta manera...

Código Delphi [-]
FrmMensaje.BtnOk := MiProc o Nil dependiendo de que quiero que haga;
FrmMensaje.BtnCancel := MiProc o Nil dependiendo de que quiero que haga;
FrmMensaje.ShowMessage('',MyStringList, 2);

Como debería modificar las propiedades BtnOK y BtnCancel para poder hacer lo siguiente...
Código Delphi [-]
FrmMensaje.BtnOk := (procedure (Sender:TObject)
                               begin
                                     ShowMessage('Presiono el Btn OK');
                               end);

ecfisa 25-09-2013 23:11:58

Cita:

Empezado por dec (Mensaje 467354)
Hola,

Creo que que lo que quieres usar se llama "métodos anónimos". Revisa este enlace.

^\||/ Muy interesante ese nuevo (para mi) tipo de puntero a método. Curioseando un poco, parece que se implementó a partir de la versiòn 2009.

Todavía no lo puedo usar, pero está muy bueno conocerlo ;)

Un saludo :)

Neeruu 26-09-2013 00:17:25

Acá anexo un par de links que me parecieron entretenidos leerlos para entender como trabaja....

Y si creo que es esto lo que andaba buscando... solo que ahora tengo que hacer un re analisis de lo que tengo programado...:mad:

Gracias Dec!!!


http://markdelphi.blogspot.mx/2008/0...en-delphi.html
http://www.compago.it/clng_es/294-i-...in-delphi.html


La franja horaria es GMT +2. Ahora son las 13:01:21.

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