gpt4 book ai didi

delphi - 自定义组件 TImage 事件导致错误 "Does not exist"

转载 作者:行者123 更新时间:2023-12-03 19:00:34 25 4
gpt4 key购买 nike

我有一个包含以下事件的自定义组件

 private
{ Private declarations }
...
fOnImageClick: TNotifyEvent;
fOnImageMouseUp: TMouseEvent;
fOnImageMouseDown: TMouseEvent;
fOnImageMouseMove: TMouseMoveEvent;
fOnImageMouseEnter: TNotifyEvent;
fOnImageMouseLeave: TNotifyEvent;
fOnImageSelect: TNotifyEvent;
fOnImageDblClick: TNotifyEvent;
protected
...
public
{ Public declarations }
...
published
...
property OnImageClick: TNotifyEvent read fOnImageClick write fOnImageClick;
property OnImageSelect: TNotifyEvent read fOnImageSelect write fOnImageSelect;
property OnImageDblClick: TNotifyEvent read fOnImageDblClick write fOnImageDblClick;
property OnImageMouseDown: TMouseEvent read fOnImageMouseDown write fOnImageMouseDown;
property OnImageMouseUp: TMouseEvent read fOnImageMouseUp write fOnImageMouseUp;
property OnImageMouseMove: TMouseMoveEvent read fOnImageMouseMove write fOnImageMouseMove;
property OnImageMouseLeave: TNotifyEvent read fOnImageMouseLeave write fOnImageMouseLeave;
property OnImageMouseEnter: TNotifyEvent read fOnImageMouseEnter write fOnImageMouseEnter;
end;

我将它们分配给一个 TImage,其父级是 TPanel,其父级是 TScrollBox
 img:= TImage.Create(ThumbPnl);
img.Parent:= ThumbPnl;
img.Tag:= I;
img.Align:= alClient;
img.Stretch:= true;
img.OnClick:= fOnImageClick;
img.OnDblClick:= fOnImageDblClick;
img.OnMouseEnter:= fOnImageMouseEnter;
img.OnMouseLeave:= fOnImageMouseLeave;
img.OnMouseDown:= fOnImageMouseDown;
img.OnMouseUp:= fOnImageMouseUp;
img.OnMouseMove:= fOnImageMouseMove;

该组件编译和构建就好了。具有此组件的应用程序也可以正常编译和运行。如果我分配一个 OnClick 事件,它会起作用。所有其他事件,如果我分配它们并尝试运行应用程序,我会收到一条错误消息,指出该事件不存在

有谁知道这是为什么?

最佳答案

对于新组件创建者来说,您犯了一个相当常见的错误。你违反了这条规则:

Component users write event handlers, component writers "fire" events



在您的情况下,您正在做的是在您作为组件开发人员不应该这样做时分配事件。由组件用户指定在 OnClick 中出现的代码。 , OnDblClick等事件。

将事件声明为 Published 和 TNotifyEvent 类型就足够了。
property OnSomeEvent: TNotifyEvent read FOnSomeEvent write FOnSomeEvent;

这就是创建事件所需要做的一切。你的工作是“解雇”他们;也就是说,让它们发生。

这是在适当的时候在您的组件中完成的。通常,您要做的是创建一个方法 DoXXXXX,其中 XXXXX 是正在发生的事情。所以你会创建
procedure TMyImage.DoSomeEvent;
begin
if Assigned(FOnSomeEvent) then FOnSomeEvent(Self);
end;

然后,在您的代码中,当事件应该被触发时,您只需调用 DoSomeEvent .

现在,如果你想增强默认事件的功能,那么你需要重写触发事件的方法。

我讨厌这样做,但我的经典组件 Tsmiley 简单而清晰地说明了这一点:

http://tsmiley.svn.sourceforge.net/viewvc/tsmiley/

看一下那个例子,你应该会看到如何创建事件。

关于delphi - 自定义组件 TImage 事件导致错误 "Does not exist",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15350685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com