【问题标题】:How to find TMainMenu parent of TMenuItem?如何找到 TMenuItem 的 TMainMenu 父级?
【发布时间】:2018-06-04 09:23:47
【问题描述】:

我有一个标准的TMainMenu,其中包含一些TMenuItem 元素。如何从其中一个中动态找到父主菜单对象?

以下代码已经在第一个可执行行中带来了编译器错误:

procedure TMenuItemHelper.AlignToRight;
const
  P3 = False;
var
  info: TMenuItemInfo;
  buffer: array[0..78] of WideChar;
  mainMenu: TMainMenu;
begin
  if Self.Parent is TMainMenu then
    mainMenu := (Self.Parent as TMainMenu)
  else
    raise EMenuItemHelper.Create(strExcMenuItemNotFirstLevel);

  info.cbSize := SizeOf(info);
  info.fMask := MIIM_TYPE;
  info.dwTypeData := buffer;
  info.cch := SizeOf(buffer);
  GetMenuItemInfo(mainMenu.Handle, Self.Command, P3, info);

  info.fType := info.fType or MFT_RIGHTJUSTIFY;
  SetMenuItemInfo(mainMenu.Handle, Self.Command, P3, info);
end;

错误信息如下:

[dcc32 Error] E2010 Incompatible types: 'TMenuItem' and 'TMainMenu'

我看不到任何相关的问题,但解决方案可能很简单。

【问题讨论】:

  • 从GetParentMenu获取。
  • 谢谢你,@Victoria!它有效!
  • 不客气!只是,一个细节。您的例外strExcMenuItemNotFirstLevel 听起来像是一些文本,可以说该项目不是顶级项目(即子项目)。请注意,GetParentMenu 迭代到顶级项目并从该项目获取菜单对象引用。
  • 说的很对,我已经改了。感谢您的支持,@Victoria!

标签: delphi type-conversion tmenuitem


【解决方案1】:

来自Victoria的解决方案:

  if Self.GetParentMenu is TMainMenu then
    mainMenu := (Self.GetParentMenu as TMainMenu)
  else
    raise EMenuItemHelper.Create(strExcMenuItemParentIsNotAMainMenu);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2011-03-10
    • 1970-01-01
    • 2017-01-22
    • 2022-07-08
    • 2021-12-17
    • 2014-08-08
    相关资源
    最近更新 更多