PDA

Ver la Versión Completa : Procedimiento Como Parametro


Neeruu
25-09-2013, 16:29:54
Hola a todos...

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


FrmMensaje.BtnOk := (Procedure (Sender:TObject)
begin
FrmMain.RaEdit_ClienteNro.SetFocus;
End);



Donde BtnOk del Formulario FrmMensaje esta definido asi:

property BtnOk:TNotifyEvent read neBtnOk write neBtnOk default nil;


Al compilar el proyecto me dice: [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,


...necesito pasar un procedimiento como parámetro...


Revisa estos links:

How to Use a Function or a Procedure as a Parameter in another Function : http://delphi.about.com/od/adptips2006/qt/functionasparam.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:

...
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 (http://www.clubdelphi.com/foros/showthread.php?t=74923)

Saludos :)

Neeruu
25-09-2013, 18:26:46
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 (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html).

Neeruu
25-09-2013, 18:51:18
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...


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...

FrmMensaje.BtnOk := (procedure (Sender:TObject)
begin
ShowMessage('Presiono el Btn OK');
end);

ecfisa
25-09-2013, 23:11:58
Hola,

Creo que que lo que quieres usar se llama "métodos anónimos". Revisa este enlace (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html).
^\||/ 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/09/delegados-y-mtodos-annimos-en-delphi.html
http://www.compago.it/clng_es/294-i-metodi-anonimi-in-delphi.html