微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi-如何在MDI应用程序中从子窗口访问表单

如何解决Delphi-如何在MDI应用程序中从子窗口访问表单

我有一个带有子窗口的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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。