我不知道如何提出这个问题。问题如下。
我正在使用One Main表单和许多子表单,但不使用MDI表单。 主窗体包含5个按钮和一个面板。每个按钮都会调用一个表单 在该Panel内(作为Parent)。在该子表单中,一个表单(Sub3)包含TMainMenu组件。 通过单击按钮调用时,每个窗体都正常工作,但在调用窗体(Sub3)时,TMainMenu不可见。我不知道如何让它可见。 请帮助我任何人。
先谢谢。
谢谢&的问候,
Yuvaraj
答案 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”中,我会向主表单发送一个自定义消息,该表单将从另一个表单(可能尚未设置)中取消合并任何菜单,并合并当前表单的菜单。