【问题标题】:How to change a forms Menu如何更改表格菜单
【发布时间】:2014-05-27 02:56:34
【问题描述】:

我有一个最初使用 Delphi 2005 编写的应用程序。

它有一个页面控件,根据选择的选项卡,它会显示不同的菜单。

case PageControl.ActivePageIndex of
  0: begin
    Menu := HeaderMenu;
  end;
  1: begin
    Menu := DetailMenu;
  end;
end;

在 XE 中这不起作用并且菜单不会改变。选择新标签时,如何将表单菜单替换为另一个?

以下显示了我正在尝试做的事情。不幸的是,它按预期工作。 M app有100多个表格,所以我不能全部发布

主窗体

unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus;

type
  TForm5 = class(TForm)
    MainMenu1: TMainMenu;
    MainMenu2: TMainMenu;
    OpenSecondWindow1: TMenuItem;
    Dummy1: TMenuItem;
    SwitchMenus1: TMenuItem;
    Dummy2: TMenuItem;
    SwitchMenus2: TMenuItem;
    OpenSecondWindow2: TMenuItem;
    procedure SwitchMenus2Click(Sender: TObject);
    procedure OpenSecondWindow1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

uses Unit6;

procedure TForm5.OpenSecondWindow1Click(Sender: TObject);
begin
  Form6.Show();
end;

procedure TForm5.SwitchMenus2Click(Sender: TObject);
begin
  if Menu = MainMenu1 then
    Menu := MainMenu2
  else
    Menu := MainMenu1;
end;

end.

第二种形式

unit Unit6;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ComCtrls, Vcl.ExtCtrls;

type
  TForm6 = class(TForm)
    MainMenu1: TMainMenu;
    MainMenu2: TMainMenu;
    PageControl1: TPageControl;
    Menu11: TMenuItem;
    File1: TMenuItem;
    insert1: TMenuItem;
    save1: TMenuItem;
    Menu21: TMenuItem;
    Stuff1: TMenuItem;
    Save2: TMenuItem;
    Donoting1: TMenuItem;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    Panel1: TPanel;
    procedure PageControl1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.PageControl1Change(Sender: TObject);
begin
  case PageControl1.TabIndex of
    0: Menu := MainMenu1;
    1: Menu := MainMenu2;
    2: Menu := nil;
  end;
end;

end.

【问题讨论】:

  • 问题中代码的上下文是什么。它住在哪里?
  • 它以从我的应用程序主窗体打开的窗体形式存在。
  • 现在这很有趣。我在 Menu := 语句上设置了断点并在调试模式下运行。并且菜单更改正确。当我删除断点时不再更新。
  • 我仍然不知道这段代码的上下文是什么。它存在于一个过程中。该程序何时运行?我们不能有SSCCE吗?如果您提供了一个,我们会为您提供答案。
  • 更多信息。除了将我切换到 XE4 之外,调试器似乎没有做任何事情。如果我在没有调试器和 Alt Tab 的情况下运行以切换到另一个程序并返回菜单重新绘制自己。我尝试将 self.Invalidate 和 self.Repaint 添加到代码中无济于事。

标签: delphi menu delphi-xe4


【解决方案1】:

对此进行了测试,它可以工作:

procedure TfmMain.PageControlChange(Sender: TObject);
begin
  case PageControl.ActivePageIndex of
    0: Menu := MainMenu1;
    else Menu := MainMenu2;
  end;
end;

注意:在窗体上放置第一个 MainMenu 时,窗体属性“Menu”设置为 MainMenu1。
在 XE3 中测试

【讨论】:

  • 这是有效的,因为它是主要形式。如果它在由主窗体创建的窗体上,那么它不会。
  • @farley - 为什么?我认为以辅助形式切换菜单没有问题。
  • 这就是问题所在。这个应用程序在 XE4 之前运行良好。如果我按比例缩小代码工作正常。但是在我的应用程序中,它有超过 100 个表单,它不会更新菜单,直到应用程序失去焦点然后重新获得它。 (例如在另一个应用程序上单击鼠标)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2021-12-11
  • 2014-05-27
  • 1970-01-01
  • 2017-11-30
相关资源
最近更新 更多