其实很简单,但还有点不确定(散分了) (298分)

  • 主题发起人 主题发起人 beeta
  • 开始时间 开始时间
B

beeta

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]我们在编写程序的时候都是将代码放在相应的事件触发器中,通过系统对相应事件[?]
[?]的触发使其执行我们编写的代码,但是如需要得到一些特殊的效果,就必须自己捕[?]
[?]获消息了,这就是面向对象开发的障碍。我在开发程序时,经常需要动态的控制事件[?]
[?]触发后执行的代码,但去在很多情况下我却无能为力,现在我要跟大家讨论的就是这[?]
[?]个问题,我的要求是这样的,根据不同的情况写出不同的执行代码,在需要的时就[?]
[?]这组代码放到一个事件触发器内让其执行。[?]
举个例子,如在一个窗体中有两个控件,一个按钮一个页面控件,现我要当在多页
切换的时候,按钮的事件也跟着变;
如有tabsheet1..tabsheet10共10个页面及编写的btnClick0..btn..Click10共10个
事件代码,当在tabsheet1的时候按钮button1的单击动作执行btnClick0事件代码,
如此类推。
当然,大家可能觉得这样太复杂了,但如果在一些系统自动触发的事件中,并且这些
事件无法在开发期进行设置的话,那么这种方法就可能解决我们需要的问题了,让系统
未卜先知。诸如动态建立的数据查询Query控件发生的记录增加,修改,删除等一系列的
事件;如何我们得到一个可以置换事件的方法,即先进行事件的代码编写,再将事件
象赋值一样置换给某一个事件,如此一来,我们就可以很灵活地控制程序了。
如自定义的事件过程为evern1
当button1单击需要时给button1的单击,
当form2.show事件需要时就给form2.show;
 
只需要写你的过程,
Button1.OnClick := Event1;
或者
Form2.OnShow := Event1;
其中需要注意的是参数相符。
 
唉,你把事情想弯了,这样又何必象你说的那样呢?
你可以在事件中分析现在的PAgeControl.ActivePageIndex,然后写相应的代码。
如页面少,可以用if PAgeControl.ActivePageIndex = 0 then .... else ....
页面多可以用Case PAgeControl.ActivePageIndex of
case 0: ....;
case 1,2: .....;
case 3..5:.....;
end;
当然,也可以按你的想法在PAgeControlr的Change事件中动态为按钮指定事件句柄,但那样做太麻烦了。
 
1。可以直接给事件赋值:
button1.onclick=myclick;

2.可以在触发事件中判断
procedure button1Click(sender:Tobject)
begin
case DoWhat of
0: dosomething0
1: dosomething1
....
end
end
 
[yellow][blue]既然事件可以赋值,那如取消事件里的代码需要怎么做,如我已经在事件中已经写了固定
的代码,那用什么方法将这些代码清除掉,如清除后,有没有办法将其恢复回来,能否跟
处理某指针变量一样处理事件过程?[/[/blue]yellow][green]另外先感谢楼上的兄弟,恕我再多提一个问题如我
需要直接给某个事件写代码了,如在按钮单击的事件里写一段双击
时触发的代码,如何解决?[/green]
 
Button.OnDblClick=Button.OnClick;
Button.OnClick=nil;
 
你看看这个最常见的事件的定义,在classes单元里:
[red]TNotifyEvent = procedure(Sender: TObject) of object;[/red]
事件就是个指针,它指向了事件处理过程的地址.
动态赋值如:
button1.onClick = button1.onDbclick;
注意的是赋植时要保证参数一致.
你想取消相应事件的处理过程就:
yourcontrol.yourevent := nil;

 
[gold]原来事件也有这种特性,但如何才能禁止一个控件事件的发生,就像禁止一个按钮的
Enabled:=Flase一样,让事件失效,在需要的时候再让其激活,而不是简单地将其指
向空指针。[[/gold]8D][8D][8D][8D][8D][8D][8D][8D][8D][8D][8D][8D][8D][8D][8D][8D]
 
让他失效的时候指向空指针, Button1.OnClick:=nil;
需要激活的时候在指向原来的函数不就得了. Button1.OnClick:=Button1Click
 
假如其原来的指针并不是指向一个过程,如
procedure Tform1.button1onclick(sender:TObject);
begin
showmessage('This is a Testing Everns');
end;

有没有办法让其"开启事件触发"与"关闭事件触发"
 
事件要么为nil,要么指向过程,
怎么会"并不是指向一个过程"

"开启事件触发"与"关闭事件触发"最简单的办法就是对事件赋值.
 
我比较倾向于LeeChange的方法,如果你实在要问还有没有其他的方式的话,那么也还可以
用一个全局变量来控制你是不是触发该事件。要么在底层代码中实现,要么在该事件中加
代码:
procedure Tform1.button1onclick(sender:TObject);
begin
if Flag then //Flag为一全局变量
showmessage('This is a Testing Everns');
end
 
关注,同时我亦有一个问题,就是当我将几个控件的同一个事件指向一个原目标的时候,
如:button1,button2,button3的onClick事件都是指向button1click;另外又有一个
标准事件DefaultClick,当我在程序将button1指向这个事件,我发现另外两个按钮无效
不知道是何故
 
学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~


共破共用
 
//让他失效的时候指向空指针, Button1.OnClick:=nil;
//需要激活的时候在指向原来的函数不就得了. Button1.OnClick:=Button1Click

这不是已经解决了吗?还拖什么?
btw: 你的名字何我的真像:)
 
<<原来事件也有这种特性,但如何才能禁止一个控件事件的发生,就像禁止一个按钮的
<<Enabled:=Flase一样,让事件失效,在需要的时候再让其激活,而不是简单地将其指
<<向空指针。
这句话本来就有问题,让事件失效的办法就是把事件指向一个空指针,并不是所谓的简单
的指向一个空指针,就好象你要给一个Button的标题清空必须删除Caption属性的值一样.

其实控件的事件本身都是指向过程类型的指针,只不过这个指针所指向的过程必须是对象的成员,
且它的参数必须与事件本身定议的参数一样而已.就算我没在设计期双击一个Button给
它的OnClick事件写代码,也不过是给由IDE自动生成了一个Form的成员过程Button1Click,
并把它赋给Button1.OnClick事件,你完全可以在写完代码后找到属性编辑器中的Events而
并找到OnClick然后删除后面的Button1Click,这时Button1的OnClick事件没有了,
单击也不会执行任何操作了,但Button1Click过程还在,你可以在需要的时候通过
Button1.OnClick:=Button1Click来恢复Button1的OnClick事件!
当然你也可以参照Button1Click过程的格式来写一个MyButtonClick过程,定义部份写在
Form1的private段,然后在实现部份写与Button1Click不同的实现代码,并在需要的时候把
MyButtonClick赋给Button1.OnClick,然后你在运行的时候再单击Button1它就会执行MyButtonClick的过程.
请看例子:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
Button1: TButton;
procedure PageControl1Change(Sender: TObject);
//Button1在设计时并没有给它写OnClick事件而是只给PageControl1的OnChange事件写了代码.
private
procedure Button1Click_1(Sender: TObject);
procedure Button1Click_2(Sender: TObject);
procedure Button1Click_3(Sender: TObject);
procedure Button1Click_4(Sender: TObject);
procedure Button1Click_5(Sender: TObject);
//这里定义了五个过程以便在适当的时候赋给Button1.OnClick;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click_1(Sender: TObject);
begin
ShowMessage('PageControl ActivePageIndex = 1');
Button1.OnClick:=nil;
//事件只执行一次,执行完成后就把它指向nil,这时再单击这个Button就不会有反应了
end;

procedure TForm1.Button1Click_2(Sender: TObject);
begin
ShowMessage('PageControl ActivePageIndex = 2');
Button1.OnClick:=nil;
//事件只执行一次,执行完成后就把它指向nil,这时再单击这个Button就不会有反应了
end;

procedure TForm1.Button1Click_3(Sender: TObject);
begin
ShowMessage('PageControl ActivePageIndex = 3');
Button1.OnClick:=nil;
//事件只执行一次,执行完成后就把它指向nil,这时再单击这个Button就不会有反应了
end;

procedure TForm1.Button1Click_4(Sender: TObject);
begin
ShowMessage('PageControl ActivePageIndex = 4');
Button1.OnClick:=nil;
//事件只执行一次,执行完成后就把它指向nil,这时再单击这个Button就不会有反应了
end;

procedure TForm1.Button1Click_5(Sender: TObject);
begin
ShowMessage('PageControl ActivePageIndex = 5');
Button1.OnClick:=nil;
//事件只执行一次,执行完成后就把它指向nil,这时再单击这个Button就不会有反应了
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
case PageControl1.ActivePageIndex of
0:Button1.OnClick:=Button1Click_1;
1:Button1.OnClick:=Button1Click_2;
2:Button1.OnClick:=Button1Click_3;
3:Button1.OnClick:=Button1Click_4;
4:Button1.OnClick:=Button1Click_5;
end;
//当PageControl1的页而改变时单击Button1会有不同的效果!
end;

end.
 
接受答案了.
 
后退
顶部