0

我们有一个可以在简单或高级模式下运行的应用程序。不同之处在于主菜单条目是可见的。问题是 RAD Studio XE2 默默地删除了 dfm 中设置的 OnClick 属性值。它指向一个在主菜单 > 文件菜单中隐藏一些菜单项的过程。

步骤:
1. 从 subversion 重新签出到磁盘上的一个新文件夹,一个以前从未存在过的文件夹。
2.在notepad++中打开主窗体的dfm和pas文件,确保“OnClick = MenuItem_File1Click”行存在,并且MenuItem_File1Click过程在pas文件的接口和实现中。是的,一切看起来都很好。
3. 在 RAD Studio XE2 中打开项目。
4. Object Inspector 中 File 菜单项的 OnClick 属性为空。

我们还有一些在 FormShow 中处理的其他菜单项,它们按预期工作,在简单模式下隐藏,在高级模式下可见。解决方法是将 MenuItem_File1Click 中的功能移动到 FormShow。但我真的很想了解为什么会发生这种情况。

谁能解释这种行为?有没有其他人遇到过这样的事情?我尝试将过程重命名为绝对不是系统的东西,但 IDE 还是将其删除。

4

1 回答 1

1

如果您将您的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 会是一个更好的测试

于 2012-10-26T18:46:58.337 回答