object pascal的问题,反正我是不会的!请大侠帮忙!(100分)

Z

zyf23

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的:
我有20个窗体,form1为主,我想在form1中定义一个按钮就能执行
这20个窗体中定义的过程或函数(名称可能不一样,参数可以一样),
请问该如何实现,我不想一个一个的使用case语句实现!
例:
form1中定义 procedure aa(p1,p2:string);
在button1的onclick中调用aa;
此时,打开form2时,我想将form2中定义的prcoedure bb(p1,p2:string);
和form1中的aa关联起来,并且,点击form1的button.onclick时执行的是form2的
bb。请问该如何做?




 
楼主说说具体内容。
 
试试下面的例子:
Form1:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Unit2;

type
TForm1 = class(TForm)
Button1: TButton;
procedure aa(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.aa(Sender: TObject);
begin
Form2.bb(self);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if not assigned(Button1.onclick) then
Button1.OnClick:=aa;
end;
end.

Form2:

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm2 = class(TForm)
procedure bb(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
implementation
{$R *.DFM}

procedure TForm2.bb(Sender: TObject);
begin
showmessage('bb Execute');
end;
end.
 
我说的还不清楚呀!

确切的说是这样的:
我是使用panel作为容器,其他的窗体显示时是
显示在panel中的,所以此时在主窗体中要想执行显示在panel中的
窗体中的过程或方法的话,必须在运行期将显示的窗体中的过程或函数赋给
主窗体中的某一过程或函数!

you understanded?
 
用函数指针实现:

//Unit1:

type
TfrmMain = class(TForm)
Button1: TButton;
RadioGroup1: TRadioGroup;
procedure Button1Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TPubProc=procedure (Str1,Str2:String) of Object;

var
frmMain: TfrmMain;
PubProc:TPubProc=nil
//共用的函数指针

implementation

uses Unit2, Unit3, Unit4;

{$R *.DFM}

procedure TfrmMain.Button1Click(Sender: TObject);
begin
if @PubProc<>nil then
PubProc('Hello','World');
end;

procedure TfrmMain.RadioGroup1Click(Sender: TObject);
begin
Application.ProcessMessages;
FreeAndNil(Form2);
FreeAndNil(Form3);
FreeAndNil(Form4);
case RadioGroup1.ItemIndex of
0:
begin
Form2:=TForm2.Create(Self);
Form2.Show;
end;
1:
begin
Form3:=TForm3.Create(Self);
Form3.Show;
end;
2:
begin
Form4:=TForm4.Create(Self);
Form4.Show;
end;
end;
end;


//Unit2 (Unit3,Unit4如法炮制)
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure DoForm2(Str1,Str2:String);
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses
Unit1;

{$R *.DFM}

procedure TForm2.DoForm2(Str1, Str2: String);
begin
ShowMessage(Str1+#13#10+Str2+#13#10'By Form2');
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
PubProc:=DoForm2
//创建时改变主单元的函数指针
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
PubProc:=nil
//销毁时将函数指针清零
end;
 
creation-zy,
多谢,呀!

提点建议:如果所有的窗体都继承于 某一父窗体,
那么就不用再每个窗体中如法炮制了!

ok!

 
这样的处理方式太混乱了。

做个dll,将你常用的函数取名分开。

然后通过调用方法实现。

 
用接口啊!
 
定义一个TProcClass
然后from1.button1.onClike=SomeTProcClass
 
to Yukin,
用接口啊! 没用过!愿听高见!


 
to Richard3000,
请说的明明白白!
多谢!
 
枚举窗口,然后执行visible 为 true 的非主窗口中的方法。
 
type TMyEvent = procedure (Sender: TObject;param:type) of object;
 
类似的问题,我遇到过,
最后是用窗体继承及class of机制解决的,代码十分简练。
 
to Richard3000,
再多说点,让俺也开开窍!
type
TMyEvent= procedure (Sender: TObject;param:type) of object;
这其中的 Sender: TObject 指什么? 如果用了sender,此时该如何使用tmevent?
 
/////////////////////////////
//to stargazer, 时间:2002-12-26 14:45:00, ID:1539502 //
//类似的问题,我遇到过,
//最后是用窗体继承及class of机制解决的,代码十分简练。//
//////////////////////////
to stargazer,我用了窗体继承和函数重载,也可以实现,
但现在我这里是窗体之间的嵌套太多,有点混乱,可否把你的思路转换成代码,
详细说一下!

 
事件是以“指针”的方式进行访问的。
你定义一个事件赋给你的OnClike就好了。定义的时候要注意参数。

你所说的实现方式我不推荐。
 
用自定义消息试试
 
to zfy32

我看你自己已经很明白了吗

你在逗别人呢?
 

Similar threads

D
回复
0
查看
737
DelphiTeacher的专栏
D
D
回复
0
查看
741
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
590
DelphiTeacher的专栏
D
顶部