使用两种形式时的问题

时间:2010-10-19 13:03:21

标签: delphi

我不知道如何提出这个问题。问题如下。

我正在使用One Main表单和许多子表单,但不使用MDI表单。 主窗体包含5个按钮和一个面板。每个按钮都会调用一个表单 在该Panel内(作为Parent)。在该子表单中,一个表单(Sub3)包含TMainMenu组件。 通过单击按钮调用时,每个窗体都正常工作,但在调用窗体(Sub3)时,TMainMenu不可见。我不知道如何让它可见。 请帮助我任何人。

先谢谢。

谢谢&的问候,

Yuvaraj

2 个答案:

答案 0 :(得分:1)

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

当你将一个表单“重新表示”给另一个表单时(在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;

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

答案 1 :(得分:0)

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