问题描述
我有一个带有子窗口的MDI程序,该子窗口包含TMemo和按钮,应用程序中还有另一个Form1。 点击按钮:
joins
在Form1上也是一个按钮:
Unit1.Form1.Parent:=Form1; Unit1.Form1.Show;
我的问题是:什么是替换????的正确语法?来访问子窗体上的TMemo。
PS .: TMainForm具有以下过程:
????.(FindComponent('dataMm') as TMemo).lines.append('hallo child');
其中MyChild在公共部分中声明为
var MyChild:TForm;
感谢您的时间和精力 问候
解决方法
在撰写此答案时,您尚未在我要求澄清的地方回复我的评论,但我相信我理解您的问题。
这是主要形式的本质:
unit UMain;
uses
...,UChild,...
type
TMDIMainForm = class(TForm)
MainMenu1: TMainMenu;
CreateChild1: TMenuItem;
ShowForm11: TMenuItem;
...
public
MyChild: TMDIChild;
由于通常有许多子窗体实例,因此需要使用列表或数组而不是MyChild
变量,但这就是您所定义的。
这些菜单项的实现以及CreateMDIChild
方法:
procedure TMDIMainForm.CreateChild1Click(Sender: TObject);
begin
CreateMDIChild('TheOneAndOnly');
end;
procedure TMDIMainForm.ShowForm11Click(Sender: TObject);
begin
Form1.Show;
end;
procedure TMDIMainForm.CreateMDIChild(const name: string);
//var
// Child: TMDIChild; no need for this temporary variable
begin
MyChild := TMDIChild.Create(Application);
MyChild.Parent := self;
MyChild.Visible := True;
// MyChild:=Child;
end;
TMDIChild
类很简单:
unit UChild;
type
TMDIChild = class(TForm)
dataMm: TMemo;
end;
因为它只保存备忘录(出于讨论目的)。
最后是TForm1
类:
unit UForm1;
interface
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
implementation
uses UMain,UChild;
procedure TForm1.Button1Click(Sender: TObject);
begin
MDIMainForm.MyChild.dataMm.Lines.Add('hello child!')
end;
我想我们现在已经解决了您的实际问题,即如何以MyChild
格式处理备忘录。
因此,请注意,您需要添加uses UMain,UChild;
子句以引用这些单位。此uses
子句必须位于implementation
部分中。如果在interface
部分中,它将创建一个循环引用,这是禁止的。
现在,您可以在子表单中引用该备忘录,该备忘录在主表单中具有引用。
修改
在注释中进行澄清后,(“实际上,使Form1可见的按钮在子级上,并且可以在任何子级上发生。比在Form1上,按钮激活:dataMm.Lines.Add('hello child!')
。需要对该当前活动的孩子的引用或连接” ,您可以执行以下操作:
在TForm1
类型中添加一个用于保存MDIChild
引用的新私有字段,以及一个新方法,您可以在其中传递调用MDIChild
的引用,例如
TForm1 = class(TForm)
...
private
CurrentMDIChild: TMDIChild;
public
procedure DoActivate(Sender: TMDIChild);
DoActivate()
的实现变为:
procedure TForm1.DoActivate(Sender: TMDIChild);
begin
if (Sender is TMDIChild) then
begin
CurrentMDIChild := Sender;
Show;
end;
end;
TMDIChild.Button1Click
变成例如
procedure TMDIChild.Button1Click(Sender: TObject);
begin
Form1.DoActivate(self);
end;