以表单作为变量访问另一个表单上的对象
Posted
技术标签:
【中文标题】以表单作为变量访问另一个表单上的对象【英文标题】:Access object on another form with the form as a variable 【发布时间】:2021-10-18 13:11:52 【问题描述】:我正在用 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()
部分的任何表单名称。
如果这完全不可能,请提出其他解决方案来达到同样的效果。
【问题讨论】:
为您的表单创建一个基类,例如TFormWithMemHulp
,有这个属性。然后,让所有应该支持它的表单都从该类继承,而不是直接从TForm
继承。然后,您执行Form: TFormWithMemHulp
并访问该属性。
“它不起作用”再精确不过了。 frmHome
已经是一个变量——去看看它是在哪里声明的。您甚至没有查看Form
的值是否为nil
。此外,您应该通过for i:= 0 to Screen.FormCount- 1 do if Screen.Forms[i].Name= 'frmHome' then ...;
枚举所有表格,并记住可能没有匹配项。
你的这个程序是从哪里调用的?如果它是属于此特定表单的任何方法,那么您可以使用 Self
作为您的程序的输入参数,并通过这样做将引用传递给调用该程序的表单。
【参考方案1】:
Form.memHulp
不起作用,因为Form
是一个普通的TForm
指针,而TForm
没有memHulp
成员。您可以改用Form.FindComponent('memHulp')
,因为您将TForm
对象分配为备忘录的Owner
,但这需要您将Name
分配给备忘录,例如:
memHulp := TMemo.Create(frmHome);
with memHulp do
begin
Parent := frmHome;
Name := 'memHulp';
...
end;
或者,由于您说您一次只创建 1 个 Memo 对象,您可以简单地将 memHulp
设置为某个单元的 interface
部分中的全局变量,然后您可以直接访问它而无需寻找它。
【讨论】:
谢谢 Remy,但在我打电话给Form.FindComponent('memHulp')
之前,我需要先找到正确的表单名称。我该怎么做?
@WilmerKluever 您已经知道如何 - Application.FindComponent()
将适用于 Application
拥有的任何 TForm
并分配有 Name
。或者,循环通过 Screen.Forms
,例如 AmigoJack described to you。
好的,我想我现在很接近了。只有打嗝是Form.findcomponent('memHulp').Lines.Add(sLine);
产生错误''TComponent'不包含名为'Lines'的成员...'我想我必须以某种方式告诉它它使用哪个组件,但是如何?
@WilmerKluever 将TComponent
类型转换为TMemo
,例如:TMemo(Form.FindComponent('memHulp')).Lines.Add(sLine);
以上是关于以表单作为变量访问另一个表单上的对象的主要内容,如果未能解决你的问题,请参考以下文章