当单击某一按钮时,怎样调用另一个按钮的事件?(50分)

  • 主题发起人 主题发起人 chemstar
  • 开始时间 开始时间
如果是两个Form之间的事件调用,应尽量避免使用Form1.XXX,Form2.XXX,因为在执行此句时,你的另一个Form可能还没创建,实例还不存在,毫无疑问会出错,作为一个成熟的程序员需全面多方位考虑代码的健壮性;建议采用如下策略:
在一个新建的Unit,如,PublicUnit.pas 建立一个处理过程,
unit PublicUnit
...
procedure ProcessButtonDown(****)
begin
......
end;
...
实现你所需要的Button按下的功能;
然后分别在Form1,Form2中引用PublicUnit,并将对应Button.Click指向ProcessButtonDown,如:

Unit unit1

use ...,PublicUnit;
...
procedure TForm1.Button1Click(Sender: TObject)
begin
ProcessButtonDown(Sender,**,**...)
end;
...

同样在Form2中也实现一次,如
Unit unit2

use ...,PublicUnit;
...
procedure TForm2.Button2Click(Sender: TObject)
begin
ProcessButtonDown(Sender,**,**...)
end;
...
 
to cheylin:
你的这句:
ProcessButtonDown(Sender,**,**...)
里面的**.**代表什么?能不能说的详细一点?对不起,我很菜。

象你所说的建立一个公用的子过程然后分别调用我也用过。但是如果在这个子过程里涉及
到了对某个窗体中控件的操作,比如label1.caption:='ABC' ,那么在不同的窗体中调用
时岂不是出现错误?
 
ProcessButtonDown(Sender,**,**...)
里面的**.**代表你还需要传递其他的参数,就如你要将Form的Lable1传进去的话,那就是:
procedure ProcessButtonDown(Sender: TObject; mLabel: TLabel)
begin
mLabel.Caption := 'ABC'
end;

调用
procedure TForm1.Button1Click(Sender: TObject)
begin
ProcessButtonDown(Sender,Label1);
end;
 
TForm1.ButtonClick(nil),就可以了,当然,前提是你的Form1已经被创建,且,在Form2中有Use该单元
 
当然如果你要操作窗口上的多个其他控件,那也好办,把窗体当作过程的参数就行了,如:
procedure ProcessButtonDown(Sender: TObject)
begin
TForm(Sender).Label1.Caption := 'ABC';
TForm(Sender).***; //对其他控件的操作代码
end;

调用
procedure TForm1.Button1Click(Sender: TObject)
begin
ProcessButtonDown(self); //把窗体作为Sender传过去
end

//说明:
这种方法要求对不同的对象做类似的操作,要求Form1,Form2中都有“相同类型的同名控件做相同的操作”,比如前面要求两个Form中都有Label1这一控件;

如果对Form1做操作A,对Form2做操作B的话,这不能引起代码重用,也就没必要调用相同过程或事件了。
 
to cheylin
你的方法很好,但是我试了一下,不能通过,
错误提示:undeclared identifier Label1
但是我的窗体上有label1呀,请高手给解答一下好吗,你的例子能否发给我呀
lijw@mail.csoft.com.cn
 
例子已发出
 
Button2Click(nil);
我就是这样子用的啊。
 
后退
顶部