如果您将您的Menu
(或 a Button
)与连接起来Action
,那么Action
应该接管所有这些属性的控制:
AutoCheck, Caption, Checked, Enabled, HelpContext, Hint, GroupIndex, Bitmap/ImageIndex, ShortCut, Visible
在您的情况下OnClick/Execute
.
这就是第一名的行动的“存在理由”。
因此,如果您在Action
没有Execute
事件处理程序的情况下离开,您实际上是在nil
投入您的控件OnClick
事件。
每当在 dfm 中指定的 Action 与控件挂钩时从 dfm 读取控件时,就会发生这种情况。只需尝试设置 OnClick,然后切换到 View As Text 并返回(Alt+F12 两次),您的 OnClick 就消失了……
查看 VCL 源代码:
procedure TMenuItem.ActionChange(Sender: TObject; CheckDefaults: Boolean);
begin
if Sender is TCustomAction then
with TCustomAction(Sender) do
begin
if not CheckDefaults or (Self.AutoCheck = False) then
Self.AutoCheck := AutoCheck;
if not CheckDefaults or (Self.Caption = '') then
Self.Caption := Caption;
if not CheckDefaults or (Self.Checked = False) then
Self.Checked := Checked;
if not CheckDefaults or (Self.Enabled = True) then
Self.Enabled := Enabled;
if not CheckDefaults or (Self.HelpContext = 0) then
Self.HelpContext := HelpContext;
if not CheckDefaults or (Self.Hint = '') then
Self.Hint := Hint;
if RadioItem and (not CheckDefaults or (Self.GroupIndex = 0)) then
Self.GroupIndex := GroupIndex;
if not CheckDefaults or (Self.ImageIndex = -1) then
Self.ImageIndex := ImageIndex;
if not CheckDefaults or (Self.ShortCut = scNone) then
Self.ShortCut := ShortCut;
if not CheckDefaults or (Self.Visible = True) then
Self.Visible := Visible;
if not CheckDefaults or not Assigned(Self.OnClick) then
Self.OnClick := OnExecute; // <====== use debug dcus and put a break here...
end;
end;
更新:...但是如果您在 OnClick 事件中有代码,则不应发生这种情况。
这看起来像一个错误。从 dfm 读取 MenuItem 时,父窗体尚未完全加载,并且 OnClick 显示为
Name Value
FOnClick ($3,$6142210)
Code $3
Data $6142210
但是Assigned(FOnClick)
回来False
了!!!!
所以if not CheckDefaults or (@Self.OnClick=nil) then
会是一个更好的测试