我有一个大型应用程序,其中包含用户单击菜单栏时创建的多个表单。我想通过在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;
如何将字符串作为参数传递给该过程?
答案 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;
使用此项目的小型测试项目以及用于创建您提供的子表单的代码 - FindChildForm
和ErrorMsg
除外,详细说明了未知的内容。
.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