最好使用方法指针实现才能确保子窗体的通用性,即:
1、在不同的父窗体中,定义相同的过程(参数类型、个数、顺序需要相同):
procedure ClickButton(HND: THandle; Str: String); //Str表示父窗体的 EdttBox 的值
2、在子窗体中定义方法指针:
private
ChildClick(HND: THandle; Str: String) of object;
3、调用子窗体时,将子窗体的方法指针赋值为父窗体的 ClickButton:
FormChild.ChildClick := Self.ClickButton;
4、在子窗体的点击事件中执行:
if Assigned(ChildClick) then
begin
ChildClick(Self.Handle, Str);
end; 这样就实现了在子窗体中执行父窗体中中的过程,实质是带入了一个函数指针,由子窗体执行父窗体的过程,
HND参数表示父窗体的句柄(Handle)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
怎么编译不了啊.....
1、在不同的父窗体中,定义相同的过程(参数类型、个数、顺序需要相同):
procedure ClickButton(HND: THandle; Str: String); //Str表示父窗体的 EdttBox 的值
2、在子窗体中定义方法指针:
private
ChildClick(HND: THandle; Str: String) of object;
3、调用子窗体时,将子窗体的方法指针赋值为父窗体的 ClickButton:
FormChild.ChildClick := Self.ClickButton;
4、在子窗体的点击事件中执行:
if Assigned(ChildClick) then
begin
ChildClick(Self.Handle, Str);
end; 这样就实现了在子窗体中执行父窗体中中的过程,实质是带入了一个函数指针,由子窗体执行父窗体的过程,
HND参数表示父窗体的句柄(Handle)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
怎么编译不了啊.....
解决方案 »
- 安装EhLib 4.3 Build 4.3.21时遇到问题,请指点
- 本地excel表格内容导入远程sql数据库服务器问题
- 12月6日,CSDN举办与Borland David I面对面访谈活动,你有什么问题要问么?
- DELPHI窗体最大化以后布局变形的问题
- 求新的Edit控件,要求只能输入整数和浮点数,急
- why?
- StringGrid使用按鍵如何移到下一格上
- 高手啊,你们快来啊。。。。。dbgrid问题,难啊,在线等待,即时结帐!!!!
- win2k 下如何隐藏一个进程不出现在ctrl+alt+del列表??
- 谁能帮忙将此vb 转换为delphi
- VC代码翻译成DELPHI
- 关于Tcombobox.text直接赋值的问题
MainForm.xxxx;或者向父窗体发送一自定义消息,父亲收到消息后就执行xx过程。
HND: THandle;——其实self就是了
Str: String——可以固定放在一个子窗体的特定属性里
这样,函数就不要参数了
这样吗type
TForm2 = class(TForm)
private
ChildClick(HND: THandle; Str: String) of object;
end
你管这个叫指针?
Type
TChildClick=Procedure(HND: THandle; Str: String) Of Object; TForm2 = class(TForm)
private
FChildClick:TChildClick;
end;
begin
Form2.FChildClick:=Self.ClickButton;
Form2.ShowModal;
end;
procedure TForm1.ClickButton(HND: THandle; Str: String);
begin
ShowMessage('123');
end;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TChildClick=Procedure(HND: THandle; Str: String) Of Object;
TForm2 = class(TForm)
Button1: TButton;
procedure ChildClick(HND: THandle; Str: String);
procedure Button1Click(Sender: TObject);
private
public
{ Public declarations }
FChildClick:TChildClick;
end;var
Form2: TForm2;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
begin
@FChildClick := Self.MethodAddress('ChildClick');
if Assigned(FChildClick) then
FChildClick(Self.Handle,'Hello world');end;procedure TForm2.ChildClick(HND: THandle; Str: String);
begin
ShowMessage(Str);
end;end.
在独立定义时,才需要加上of object以示区别(与普通的函数)。{@这个不需要的了}FChildClick := Self.MethodAddress('ChildClick');
procedure ChildCreate(Hnd: THandle);
begin
with TChildForm.create(nil) do
begin
try
ParentHnd := Hnd;
ShowModal;
finally
Free;
end;
end;procedure TChildForm.btnclick(Sender: TObject);
begin
(FindControl(ParentHnd) as TParentForm).xxxx;
end;方法2。使用回调函数,和你这个思路差不多,把参数做一致就可以了。
嘿嘿,
这个handle的参数不需要吧?
既然要调用的是父窗体的过程而handle也是父窗体的,是另一个父窗体的句柄?
如果不需要
那可以用
Form2.Button1.OnClick := Form1.Button1Click;