以表单作为变量访问另一个表单上的对象

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);

以上是关于以表单作为变量访问另一个表单上的对象的主要内容,如果未能解决你的问题,请参考以下文章

在服务器上的表单变量中发布 json 对象

从另一个不同的 AngularJS 组件访问表单(用于验证)

访问连续表单:记录状态

将变量从访问表单传递到访问表单

SQL 和 MS 访问 - 过滤表单上的数据

访问VBA:从另一个表单获取复选框的价值