Delphi 使用两种形式时出现的问题

Delphi 使用两种形式时出现的问题,delphi,Delphi,我不知道怎么问这个问题。问题如下 我使用的是一个主窗体和许多子窗体,但不是MDI窗体。 主窗体包含5个按钮和一个面板。每个按钮将调用一个表单 在该面板内(作为父级)。在该子表单中,一个表单(Sub3)包含TMainMenu组件。 通过单击按钮进行调用时,每个表单都正常工作,但在调用表单(Sub3)时,TMainMenu不可见。我不知道如何使它可见。 请随便帮我 提前谢谢 谢谢和问候 Yuvaraj您可以使用TMainMenu.Merge和TMainMenu.Unmerge将子表单菜单与主表单菜单

我不知道怎么问这个问题。问题如下

我使用的是一个主窗体和许多子窗体,但不是MDI窗体。 主窗体包含5个按钮和一个面板。每个按钮将调用一个表单 在该面板内(作为父级)。在该子表单中,一个表单(Sub3)包含TMainMenu组件。 通过单击按钮进行调用时,每个表单都正常工作,但在调用表单(Sub3)时,TMainMenu不可见。我不知道如何使它可见。 请随便帮我

提前谢谢

谢谢和问候


Yuvaraj

您可以使用TMainMenu.Merge和TMainMenu.Unmerge将子表单菜单与主表单菜单合并/取消合并。在每个子窗体的“OnActivate”中,我将向主窗体发送一条自定义消息,该消息将从另一个窗体(可能尚未设置)中取消合并任何菜单,并合并当前窗体的菜单。

每个窗体上只能有一个主菜单。虽然一个应用程序中可以有多个表单,每个表单都有自己的主菜单,但如果在另一个表单中显示一个表单,则只有“外部”表单的主菜单可见

当您将一个表单“重新出租”给另一个表单(在formA上将formB显示为“组件”)时,您必须将菜单自身合并为前面提到的@skamradt

为此,只需让您的按钮使用“SwitchToForm”功能,如:

type
  TMain_Form
  ...
  private
    FCurrentForm: TForm;
    procedure SwitchToForm(showForm: TForm);
  ...
  end;

procedure TMain_Form.SwitchToForm(showForm: TForm);
begin
  if (FCurrentForm <> nil) and (FCurrentForm.Name = showForm.Name) then begin
    // Naught to do
  end else begin
    // If a form is currently showing, hide it and if it has a menu, unmerge that 
    if FCurrentForm <> nil then 
    begin
      FCurrentForm.Hide;
      if Assigned(FCurrentForm.Menu) then 
      begin
        MainMenu.UnMerge(FCurrentForm.Menu);
      end;
    end;

    // Set the current form to the one passed in and re-parent that to the main form
    // If the form has a menu, merge that with the main menu of the main form and then
    // show it.
    FCurrentForm := showForm;
    with FCurrentForm do begin
      Parent := self;
      Align := alClient;
      BorderIcons := [];
      BorderStyle := bsNone;
    end;
    if Assigned(FCurrentForm.Menu) then begin
      MainMenu.Merge(FCurrentForm.Menu);
    end;
    FCurrentForm.Show;
  end;
end;
类型
T形
...
私有的
fccurrentform:TForm;
程序切换到表单(显示表单:TForm);
...
结束;
程序TMain_Form.SwitchToForm(显示格式:TForm);
开始
如果(FCurrentForm nil)和(FCurrentForm.Name=showForm.Name),则开始
//无事可做
结束,否则开始
//如果窗体当前正在显示,则将其隐藏;如果窗体有菜单,则取消合并该菜单
如果FCurrentForm为零,则
开始
FCurrentForm.Hide;
如果已分配(FCurrentForm.Menu),则
开始
MainMenu.UnMerge(FCurrentForm.Menu);
结束;
结束;
//将当前表单设置为传入的表单,并将其重新设置为主表单的父级
//如果窗体有菜单,请将其与主窗体的主菜单合并,然后
//展示它。
FCurrentForm:=showForm;
使用FCurrentForm开始
父母:=自我;
Align:=alClient;
边框图标:=[];
边框样式:=bsNone;
结束;
如果已分配(FCurrentForm.Menu),则开始
main Menu.Merge(FCurrentForm.Menu);
结束;
FCurrentForm.Show;
结束;
结束;

在本例中:窗体是主窗体本身的父级,但您当然也可以将窗体作为主窗体上的面板或其他容器的父级。

并且主窗体还具有TMainMenu?然后,您可能需要“合并”这两个功能。@Roald这一定不是问题,您可能有两种形式的两个tmainmenu。我认为问题在于辅助Sub3有某种样式(例如borderstyle中的bsDialog)可以禁用菜单。子窗口不能有菜单。当您使用面板创建Sub3的家长时,您将使其成为子窗口。再次感谢您的回复,谢谢。。。由YuvarajHi创建,主窗体不包含主菜单控件。只有子窗体包含主菜单控件。好吧,那就不行了。正如我已经提到的,vcl只显示“外部”窗体的主菜单。因此,给它一个,例如,只是一个“帮助”菜单。甚至可能只在菜单从子窗体合并到主菜单中时才显示它,但我不知道主菜单是否能很好地响应其visible属性的更改。