首页 > 解决方案 > 以表单作为变量访问另一个表单上的对象

问题描述

我正在用 Delphi 编写一个程序,其中包括在多个表单上创建相同的动态对象(从不同时),然后另一个单元中的一个过程将某些文本写入它。

对象(TMemo)是如何创建的:

memHulp := TMemo.Create(frmHome);
with memHulp do
begin
  Parent := frmHome;
  Top := 208;
  Left := 88;
  Height := 98;
  Width := 209;
  ReadOnly := True;
end;

属性并不那么重要,它只是显示对象的创建以及它是如何被引用的。

现在,我需要从文本文件中将某些文本读入备忘录,这没有问题,但是当涉及的不同表单都使用相同的自定义过程时,问题就来了。

在这种特殊情况下说起来很容易frmHome.memHulp.Lines.Add(),但是当我需要它在备忘录上显示在所有情况下名称完全相同但形式不同的文本时,我遇到了一些麻烦。

frmHome部分需要是一个变量。所以我尝试了这个:

var 
  Form: TForm;
begin
  Form := Application.FindComponent('frmHome') as TForm;
end;

这不会警告我或给出错误,但是一旦我尝试说Form.memHulp.Lines.Add(),它就不起作用,而且我知道它可能没有任何属性Form,但是我如何让它看起来正确的地方? 我需要能够告诉程序查看我作为参数传递给FindComponent()部件的任何表单名称。

如果这完全不可能,请提出其他解决方案来实现相同的目标。

标签: formsdelphimethodsproceduredynamicobject

解决方案


Form.memHulp不起作用,因为Form它是一个普通的香草TForm指针,并且TForm没有memHulp成员。您可以Form.FindComponent('memHulp')改用,因为您将TForm对象分配为备忘录Owner,但这需要您将 a 分配Name给备忘录,例如:

memHulp := TMemo.Create(frmHome);
with memHulp do
begin
  Parent := frmHome;
  Name := 'memHulp';
  ...
end;

或者,由于您说您一次只创建 1 个 Memo 对象,您可以简单地memHulp在某个单元的interface部分中创建一个全局变量,然后您可以直接访问它而无需寻找它。


推荐阅读