VCL组件之主要方法(Methods)和通用事件(Events)

组件的主要方法(Methods)

大多数组件有20多个公用方法,窗口组件有40多个公用方法可以选择。有趣地是,并不是都被广泛使用。组件的多数功能通过属性来完成。例如,隐蔽一组件,可调用其Hide方法或者设置Visible属性为False。另外,组件通常针对目的有明确的方法,它可能是在处理个别组件用的最多的方法。

然而有几个方法值得一提,把它们列在下面。注意一些方法不是对所有控件都有,这不是对每个组件最经常使用的公用方法,而是一般组件最普通使用的方法。

  • BroadCast 用于对所有窗口子组件发送消息
  • ClientToScreen 将客户区坐标转化为屏幕坐标
  • ContainsControl 如果某控件属于当前控件,返回True。
  • HandleAllocated 如果为控件分配了一个系统句柄,返回True;如果没有分配的话,简单去读Handle属性就会自动建立句柄,因此HandleAllocated用于检查句柄的存在,而不建立它。
  • Hide 隐藏控件
  • Invalidate 强迫控件重绘
  • Perform 直接发送消息给组件而不通过Windows消息系统
  • Refresh 要求组件立即被重绘且在重新上色前擦除组件
  • Repaint 要求组件被立即重绘,组件背景在重新上色前不擦除。
  • SetBounds 改变控件的位置和大小,能一次性设置Top、Left、Width及Height属性,这节省单个设置它们的时间。
  • SetFocus 赋予控件输入焦点
  • Update 如果有等待的绘制命令,马上重新绘制控件

下面在来看看组件最可能响应的一些事件。

通用事件(Common Events)

和属性和方法一样,有些事件也是最经常被响应的。最普遍使用的事件如下:

  • OnChange 发生在对象或其数据发生改变时
  • OnClick 发生在鼠标左键单击组件时
  • OnDblClick 发生在鼠标双击组件时
  • OnEnter 发生在组件激活时,即组件接收焦点时
  • OnExit 发生在组件失去焦点时
  • OnKeyDown 发生在用户按下键盘上某个键时,该事件想具有输入焦点的组件发送
  • OnKeyPress 发生在用户按下一个键时,该事件向具有输入焦点的组件发送
  • OnKeyUp 发生在用户松开某个键时,该事件向具有输入焦点的组件发送
  • OnMouseDown 发生在用户按下一个鼠标键时,向鼠标光标所在的组件发送
  • OnMouseMove 发生在用户在组件上移动鼠标时,向鼠标光标所在的组件发送
  • OnMouseUp 发生在用户释放一个鼠标键时,向鼠标光标所在的组件发送
  • OnPaint 发生在组件需要重新上色时

处理鼠标事件

鼠标事件有一对特殊性。某个组件如果想要响应鼠标点击,最简单的就是响应OnClick事件。如果必须要用OnMouseDown和OnMouseUp,你应该注意到,发送OnMouseDown和OnMouseUp的同时也发送了OnClick事件。例如,单击引起一系列事件,事件响应的顺序如下:

OnMouseDown

OnClick

OnMouseUp

类似地当用户用鼠标双击时,结果可能在应用程序中产生比想象的要多的事件,当组件被双击,出现下列事件:

OnMouseDown

OnClick

OnDblClick

OnMouseUp

必须指出的是当响应组件出现双击和单击两事件时需要小心,注意双击事件得到4个事件。

在按一个键盘上的键时也会出现多重事件响应。例如在编辑组件中按下某个键,会导致OnKeyDown、OnKeyPress、OnChange及OnKeyUp事件发生。

下面我们来编写一个程序来证实下鼠标点击和按键时出现多重事件的事实。

1、新建一个应用程序,点击【File | New | Application】;

2、将Form1的Name属性改为MainFrom

3、在窗体上放置一个Memo组件并修改Name属性为TestMemo,双击Lines属性设置文本内容如下图,设置Align属性为alLeft

4、再次在窗体上放置一个Memo组件,Name属性为EventsMemo,双击Lines属性设置文本内容如下图,设置Align属性为alClient;

5、在窗体上再增加一个Timer组件,设置Name属性为Timer,设置其Enabled属性为True,设置Interval为3000,即3秒钟响应一次。现在窗体看起来如下:

0181

5、双击Timer组件,弹出Code Editor,编写OnTimer事件,代码如下:

procedure TMainForm.TimerTimer(Sender: TObject);
begin
  TestMemo.Lines.Clear;  { 清空TestMemo中的文本}
end;

6、点击TestMemo组件,在Object Inspector中选择Events标签,分别双击OnMouseDown、OnMouseUp、OnClick、OnDblClick、OnChange、OnKeyDown,OnKeyPress、OnKeyUp事件,输入以下代码:

procedure TMainForm.TestMemoMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  EventsMemo.Lines.Add('OnMouseDown');
end;
procedure TMainForm.TestMemoMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  EventsMemo.Lines.Add('OnMouseUp');
end;
procedure TMainForm.TestMemoClick(Sender: TObject);
begin
  EventsMemo.Lines.Add('OnClick');
end;
procedure TMainForm.TestMemoDblClick(Sender: TObject);
begin
  EventsMemo.Lines.Add('OnDblClick');
end;
procedure TMainForm.TestMemoChange(Sender: TObject);
begin
  EventsMemo.Lines.Add('OnChange');
end;
procedure TMainForm.TestMemoKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  EventsMemo.Lines.Add('OnKeyDown');
end;
procedure TMainForm.TestMemoKeyPress(Sender: TObject; var Key: Char);
begin
  EventsMemo.Lines.Add('OnKeyPress');
end;
procedure TMainForm.TestMemoKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  EventsMemo.Lines.Add('OnKeyUp');
end;

7、到此位置,我们的测试程序已经完成了,下面我来测试下,看看多重事件怎么发生的。

8、我们在TestMemo中单击鼠标,产生的事件顺序如下:

0182

9、我们在TestMemo中双击鼠标,产生的事件顺序如下:

0183

10、我们在TestMemo中敲击键盘,产生的事件顺序如下:

0184

以上代码均在Delphi 7中测试通过,示例代码下载:测试多重事件.rar

posted on 2012-01-22 15:35  pchmonster  阅读(2428)  评论(2编辑  收藏  举报

导航