请教一个有关事件相应的简单问题(36分)

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

base7

Unregistered / Unconfirmed
GUEST, unregistred user!
打个比方:
我new了一个窗体,写了它的onMouseMove的过程
这时我在窗体上放上若干控件,如何能够让这些控件也相应这个onMouseMove的过程?
(不要告诉我在设计期把每个控件的onMouseMove事件都设成form的那个,因为这个
窗体只是作为模板,另外还有很多窗体要继承这个窗体的,所以无法判断究竟有哪些控件)
 
Button1.OnMouseMove:=Self.OnMouseMove;
 
ft,就怕你们提这个,我特地注明了还不行?
我怎么知道那里有个button1?
 
ft是什么意思,not ft me!
var
i:word;
begin
for i:=0 to form1.ControlCount-1 do
begin
if form1.Controls is tbutton then
tbutton(form1.Controls).OnMouseMove:=Self.OnMouseMove;
end;
end;
 
hehe 放心,不会ft U的[:)]
不过张兄可能受了二楼那位仁兄的误导了,
我没有说form1上的控件都是Tbutton类啊,
我指的是所有的可见控件哦,我想过在formcreate的时候用ControlCount来枚举
但是苦于控件类型众多,不好判断啊:(
 
用鼠标钩子吧,应该可行。
{-----------------------------------------------------------------------------
Procedure: MouseHookCallBack
Author: Chinbo(Chinbo)
Date: 02-八月-2002
Arguments: Code: integer; Msg: WPARAM; MouseHook: LPARAM
Result: LRESULT
-----------------------------------------------------------------------------}
{$IFDEF WIN32}
function MouseHookCallBack(Code: integer; Msg: WPARAM; MouseHook: LPARAM):
LRESULT; stdcall;
{$ELSE}
function MouseHookCallBack(Code: integer; Msg: word; MouseHook: longint):
longint; export;
{$ENDIF}
begin
if Code = HC_ACTION then
{触发鼠标移动事件,可以配合FindVCLWindow函数知道是哪个控件};
Result := CallNextHookEx(whMouse, Code, Msg, MouseHook);
end;

{-----------------------------------------------------------------------------
Procedure: CreateHooks
Author: Chinbo(Chinbo)
Date: 02-八月-2002
Arguments: None
Result: None
-----------------------------------------------------------------------------}
procedure CreateHooks;
{-----------------------------------------------------------------------------
Procedure: GetModuleHandleFromInstance
Author: Chinbo(Chinbo)
Date: 02-八月-2002
Arguments: None
Result: THandle
-----------------------------------------------------------------------------}
function GetModuleHandleFromInstance: THandle;
var
s: array[0..512] of char;
begin
GetModuleFileName(hInstance, s, sizeof(s) - 1);
Result := GetModuleHandle(s);
end;
begin
if not HookActive then
begin
whMouse := SetWindowsHookEx(WH_MOUSE, MouseHookCallBack,
GetModuleHandleFromInstance,
{$IFDEF WIN32}GetCurrentThreadID{$ELSE}GetCurrentTask{$ENDIF});
whKeyboard := SetWindowsHookEx(WH_KEYBOARD, KeyboardHookCallBack,
GetModuleHandleFromInstance,
{$IFDEF WIN32}GetCurrentThreadID{$ELSE}GetCurrentTask{$ENDIF});
end;
end;

{-----------------------------------------------------------------------------
Procedure: RemoveHooks
Author: Chinbo(Chinbo)
Date: 02-八月-2002
Arguments: None
Result: None
-----------------------------------------------------------------------------}
procedure RemoveHooks;
begin
if HookActive then
try
UnhookWindowsHookEx(whKeyboard);
UnhookWindowsHookEx(whMouse);
finally
whKeyboard := 0;
whMouse := 0;
end;
end;
 
O,我试试
不过还是想知道不用鼠标钩子的方法...
 
onMouseMove
var
I : Integer;
with youForm do begin
for I := 0 to ControlCount - 1 do begin
TControl(Controls).OnMouseMove := OnMouseMove;
end;
end;
 
--TControl(Controls).OnMouseMove
Undeclared identifier:'OnMouseMove'
 

TControl(Controls).OnMouseMove := OnMouseMove
前先检查是否有该事件。
也可以看简单地抛弃是不是可以:
try
TControl(Controls).OnMouseMove := OnMouseMove;
except
end;
 
可是TControl(Controls).OnMouseMove这句话编译就通不过啊
加上try也是没用的:(
 
这是因为 TControl没有 OnMouseMove事件,TWinControl也一样,
这时一定要进行“强类型转换”,我试了一下,对 TEdit,TLabel,
TImage和TButton都正常。

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=0 to form1.ControlCount-1 do
TButton(form1.Controls).OnMouseMove:=FormMouseMove;
// ^<<<<< Form的OnMouseMove事件处理过程
end;
///// TButton 改成 TImage 也行。
我现在还没碰到出错的情况。
如果有出错的情况,你可以先根据 Controls.ClassName
把那种类型排除掉。或另作处理。
 
多人接受答案了。
 
后退
顶部