【发布时间】: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作为您的程序的输入参数,并通过这样做将引用传递给调用该程序的表单。
标签: forms delphi methods procedure dynamicobject