Delphi MDI创建子表单

时间:2017-08-17 07:09:01

标签: delphi

我有一个大型应用程序,其中包含用户单击菜单栏时创建的多个表单。我想通过在Edit组件中键入其名称来为他们提供调用子表单的功能。 ChildForms通常通过以下过程创建:

procedure CreateChildForm(ChildClass: TComponentClass; var Reference);
 begin
   Screen.Cursor := crHourGlass;
   try
     if (FindChildForm(ChildClass, TObject(Reference))) then
begin
  (TObject(Reference) as TForm).WindowState := wsNormal;
  (TObject(Reference) as TForm).Show;
end
else
  Application.CreateForm(ChildClass,Reference);
  except
  on e: exception do
    ErrorMsg('Exception -> CreateChildForm ' + e.message);
  end;
  Screen.Cursor := crDefault;
end;
像这样。

procedure TMain.acPN010Execute(Sender: TObject);
begin
  CreateChildForm(TfrmPN010,frmPN010);
end;

如何将字符串作为参数传递给该过程?

1 个答案:

答案 0 :(得分:1)

要扩展我的评论,请在此处使用TCombobox创建子表单的示例。这可能会用于基本上重复使用您的菜单代码并自动调整以更改菜单 - 例如何时将新的子表单添加到项目中。

您没有提及您的菜单类类型或结构,但这应该根据实现细节进行调整。

使用以下代码,您可以使用Items的所有子项填充组合框的TMenuItem

procedure FillCombobox(AMenuItem: TMenuItem; ACombobox: TCombobox);
var
  I: Integer;
begin
  for I := 0 to AMenuItem.Count - 1 do
    ACombobox.Items.AddObject(AMenuItem.Items[I].Caption, AMenuItem.Items[I]);
end;

使用组合框的OnSelect事件,您可以完成对给定菜单项的点击所做的事情:

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  TMenuItem(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).Click;
end;

使用此项目的小型测试项目以及用于创建您提供的子表单的代码 - FindChildFormErrorMsg除外,详细说明了未知的内容。

.PAS:

interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    FormNo11: TMenuItem;
    FormNo21: TMenuItem;
    ComboBox1: TComboBox;
    Panel1: TPanel;
    procedure FormNo21Click(Sender: TObject);
    procedure FormNo11Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Select(Sender: TObject);
  private
    { Private declarations }
    FChild1: TForm;
    FChild2: TForm;
  public
    { Public declarations }
  end;

  TChild1 = class(TForm)
    constructor Create(AOwner: TComponent); override;
  end;

  TChild2 = class(TForm)
  public
    constructor Create(AOwner: TComponent); override;
  end;

    procedure FillCombobox(AMenuItem: TMenuItem; ACombobox: TCombobox);

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CreateChildForm(ChildClass: TComponentClass; var Reference);
Begin
  Screen.Cursor := crHourGlass;
  try
//    if (FindChildForm(ChildClass, TObject(Reference))) then
//    begin
//      (TObject(Reference) as TForm).WindowState := wsNormal;
//      (TObject(Reference) as TForm).Show;
//    end
//    else
    Application.CreateForm(ChildClass,Reference);
  except
  on e: exception do
    raise;
//    ErrorMsg('Except/on -> CreateChildForm ' + e.message);
  end;
  Screen.Cursor := crDefault;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  TMenuItem(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).Click;
end;

procedure FillCombobox(AMenuItem: TMenuItem; ACombobox: TCombobox);
var
  I: Integer;
begin
  for I := 0 to AMenuItem.Count - 1 do
    ACombobox.Items.AddObject(AMenuItem.Items[I].Caption, AMenuItem.Items[I]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FillCombobox(N1, ComboBox1);
end;

procedure TForm1.FormNo11Click(Sender: TObject);
begin
  CreateChildForm(TChild1, FChild1);
end;

procedure TForm1.FormNo21Click(Sender: TObject);
begin
  CreateChildForm(TChild2, FChild2);
end;

{ TChild1 }

constructor TChild1.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);
  FormStyle := fsMDIChild;
  Caption := 'No. I';
end;

{ TChild2 }

constructor TChild2.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);
  FormStyle := fsMDIChild;
  Caption := 'No. II';
end;

end.

.DFM:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 344
  ClientWidth = 649
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsMDIForm
  Menu = MainMenu1
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 303
    Width = 649
    Height = 41
    Align = alBottom
    Caption = 'Panel1'
    TabOrder = 0
    ExplicitTop = 309
    object ComboBox1: TComboBox
      Left = 8
      Top = 12
      Width = 145
      Height = 21
      AutoCompleteDelay = 2500
      AutoDropDown = True
      TabOrder = 0
      OnSelect = ComboBox1Select
    end
  end
  object MainMenu1: TMainMenu
    Left = 24
    Top = 8
    object N1: TMenuItem
      Caption = 'Forms'
      object FormNo11: TMenuItem
        Caption = 'Form No. 1'
        OnClick = FormNo11Click
      end
      object FormNo21: TMenuItem
        Caption = 'Form No. 2'
        OnClick = FormNo21Click
      end
    end
  end
end