forms - 以表单作为变量访问另一个表单上的对象
问题描述
我正在用 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()
部件的任何表单名称。
如果这完全不可能,请提出其他解决方案来实现相同的目标。
解决方案
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
部分中创建一个全局变量,然后您可以直接访问它而无需寻找它。
推荐阅读
- javascript - Select2 和 Datetimepicker 在克隆的 div 中不起作用
- c - 在C中使用空格将char转换为int
- r - 如何使用ggplot在表示数据框两列的两点之间绘制多条线
- verilog - 如何在实例向量中对每个实例进行逻辑操作
- ssis - 与 IBM DB2 Provider for SSIS 连接时默认为 DT_STR (ANSI 1252)
- .net - .NET Core 2.2 - 种子管理员用户
- marklogic - 进行自动化 CloudFormation 部署时是否可以指定 MarkLogic Developer 许可证?
- python - 使用 cx_Oracle 包从 python 环境执行的 oracle SQL 查询中获取动态日期
- javascript - GridView 中的 JavaScript/krajeeDialog.alert 似乎有问题
- reactjs - 提升状态替代从其他组件调用方法