对象方法指针的问题。在动态创建组件时,事件不能被指定。(50分)

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

bunker

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我想在run-time时创建不同的组件并可以用backspace键删掉它,我使用了类引用
和对象方法指针,程序大概如下,但创建的组件的OnkeyPress不能响应键盘,不知为什么?
我只创建一种组件时没有问题。请大家指教。
type
TControlClass=class of TControl;
type
TForm1 = class(TForm)
........
procedure FormMouseDown(Sender: TObject
Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
private
ClassRef:TControlClass;
Counter:Integer;
ToDestroy:TControl;
........
procedure TForm1.FormMouseDown(Sender: TObject
Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
var
MyName:String;
begin
if ClassRef<>nil then
if (Button=mbLeft) then
with ClassRef.Create(self) do//ClassRef可能是多种组件
begin
Visible:=False;
Parent:=self;
........
OnKeyPress:=GetKeyPress;//这句好象不起作用,按键时GetKeyPress不能被激活,
//不知为什么?
SetFocus;
Form1.Caption:=Format('Count Object:%d Components',[Counter]);
end;
end;
end;
 
我也不是很明白,提一个建议,在容易引起歧义的时候,不要用 With ... do
去掉 With ... do 试试!
 
你换用 ONCLICK 事件看看到底是 事件不能被指定 还是 事件本身有问题?
 
说实话,我对这个OnKeyPress不是很确定,我不知道到底是谁的OnKeyPress。如果不用with
...do的话,就象这样:
NewCtrol:=ClassRef.Create(Self);
......
NewCtrol.OnKeyPress:=GetKeyPress;//出错
好象无法引用OnKeyPress这个事件指针,编译器会报错。事件本身没有问题。
请大家再想想!谢谢。
 
>> 好象无法引用OnKeyPress这个事件指针,编译器会报错。

那么错误可能是因为你的 ClassRef 的基类没有 OnKeyPress 事件!
如果是这样,在
>> OnKeyPress:=GetKeyPress;//这句好象不起作用,按键时GetKeyPress不能被激活,

这一句上,GetKeyPress 被赋给了 Form1.OnKeyPress,你试试看!
 
>>被赋给了 Form1.OnKeyPress
Form.KeyPreview:=false;
>>OnKeyPress:=GetKeyPress
OnKeyPress:=GetKeyPress(Sender: TObject
var Key: Char)
//函数圆形需一致
 
940801和abant说的很对,我也发现OnKeyPress被赋给了Form1,但我把ClassRef的基类换为
TWinControl,它可是有OnkeyPress事件的,还是不行,仍然Form1响应这个事件。为什么?
 
不要用 with ... do...
这样试试:
var
NewCtrol: TWinControl
//这儿的 TWinControl 是你的那些控件的基类,
//越高级越好, 必须有你在 with ... do ... 中用到的所有属性,
// 如果不能满足上述条件,最好自己写一个,可以定义 virtual 和 dynamic 的方法
// 和事件让子类 Override
begin
NewCtrol:=ClassRef.Create(Self);
......
end;

 
各位,我已经找到了解决得办法,程序大概如下,谢谢你们的帮助!
if NewCtrl is TRadioButton then
(NewCtrl as TRadioButton).OnKeyPress:=GetKeyPress
else
if NewCtrl is TButton then
(NewCtrl as TButton).OnKeyPress:=GetKeyPress
else
if NewCtrl is TEdit then
(NewCtrl as TEdit).OnKeyPress:=GetKeyPress;
SetFocus;
以上语句在GetKeyPress这个对象方法指针中定义,
 
多人接受答案了。
 
后退
顶部