我不会了,控件开发简单问题?为什么要传递呢?(50分)

  • 主题发起人 主题发起人 我不会了
  • 开始时间 开始时间

我不会了

Unregistered / Unconfirmed
GUEST, unregistred user!
我看《传奇》的代码的控件中DWinctl.pas
为什么在TWincontrol中
procedure KeyDown(var Key: Word; Shift: TShiftState); dynamic;
procedure KeyUp(var Key: Word; Shift: TShiftState); dynamic;
procedure KeyPress(var Key: Char); dynamic;
而在传奇控件DControl(父类TCustomControl)中,
function KeyPress (var Key: Char): Boolean; dynamic;
function KeyDown (var Key: Word; Shift: TShiftState): Boolean; dynamic;
以下是
function TDControl.KeyDown (var Key: Word; Shift: TShiftState): Boolean;
var
i: integer;
begin
Result := FALSE;
if Background then exit;
for i:=DControls.Count-1 downto 0 do //这里????以下
if TDControl(DControls).Visible then
if TDControl(DControls).KeyDown(Key, Shift) then begin
Result := TRUE;
exit;
end;
if (FocusedControl=self) then begin
if Assigned (FOnKeyDown) then FOnKeyDown (self, Key, Shift);
Result := TRUE;
end;
问题一:
传奇过程改成函数?我看过dynamic和virtual的区别,是不是事件不会经常被override,所以通常Event的要写成dynamic比virtual好的多?10分
问题二:
传奇改写了onkeydown,但是为什么使用循环语句目的是为什么?直接什么都不写,从Wincontrol继承下来不好么。难道有什么问题么?40分
 
来学习的
 
TCustomControl是一个可放置控件的类,所以那句的目的是检查所有的放置在内部的控件(要看Count属性是如何产生的,也许是内部控件,也许是表单内的所有DControl控件),然后把消息放下传递给所有的DControl

virtual是在虚拟函数表里,而dynamic要临时查找,具体看帮忙里面的差别,一般event是事件托管的,所以写成dynamic,而属性和方法是继承性较强的,所以一般用virtual
 
楼上:
OK,不过,我看代码也能够理解一点,可以为什么要传递这些呢。
比如我要点击窗口的或者执行OnKeyDown,我执行了一个比如关闭的命令,我这个窗口就关闭并且摧毁了,还传递做什么呢,
可是传奇的MouseDown,KeyDown都是循环语句,都要传递每一个组件知道,为什么。
是不是有个控件必须知道,而且不能不知道啊。才这样做啊。
我感觉不好的情况,就是效率会不会很低???
 
如果是我写,我绝对不会写任何东西。
传递什么消息,而且还循环,麻烦死了。点什么,就什么执行好了。
 
放心,这个不会影响什么效率,现在cpu的速度,才几个纳s就完成了

是否往下传递要看控件本身的作用,做为父控件,他设计的原理是要在自身接收到onkeydown消息时使所有子控件也接入这个消息进行处理,那么就要传递,比如form的keypress属性设为true时,那么他就会向form上的所有控件传递key事件,意思是一样的
 
后退
顶部