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...
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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.