将 TForm 分配给一个变量 Delphi 以在其他单元中使用

Posted

技术标签:

【中文标题】将 TForm 分配给一个变量 Delphi 以在其他单元中使用【英文标题】:Assign TForm to a variable Delphi to be used in other units 【发布时间】:2019-11-04 14:10:05 【问题描述】:

我有一个包含三个表单(一个用于手机、平板电脑和桌面)的应用程序,它们都具有相同的组件,并且每个表单上的所有组件都具有相同的名称。应用程序启动时仅创建一个表单,具体取决于屏幕解决方案。

然后我有一个从表单单元调用的单元,我需要在调用表单/单元上显示结果

现在我必须这样做:

If assigned(mobileform1) do
   mobileform1.Memo1.Text := MyText
else if assigned(mobileform2) do
   mobileform1.Memo1.Text := MyText
else if assigned(desktopform) do
   mobileform1.Memo1.Text := MyText;

有没有办法将创建的表单分配给一个变量并且只有一行?

CreatedForm.Memo1.Text := MyText;

我试图将它分配给一个 TForm 变量,但我无法使用它或者我不知道如何使用它。

谢谢, 寻求帮助。

【问题讨论】:

这是复制/粘贴错误,所有分支都分配给mobileform1.Memo1.Text 吗?如果不是,您的解决方案是删除“如果”。 解决这个问题的方法很多。也许您可以只使用一种形式并根据目标进行不同的布局。或者将表单实现隐藏在接口后面。这里可能没有足够的信息让任何人给出明确的建议。 反正我觉得你们不会交流的。在这个级别,解决方案是使用基本形式。从具有 Memo1 的表单中继承所有前端表单,并使用该表单类型的变量。 【参考方案1】:

根据 cmets,解决问题的正确方法是使用 基本形式

与此同时,这应该可以快速解决您的问题:

  (CreatedForm . FindComponent ( 'Memo1' ) as tMemo)
     . Text := 'I love peanut butter sandwiches.';

为什么引用CreatedForm.Memo1 不起作用?考虑以下代码:

type
  tMyBaseClass = class
    X : double;
  end;

  tClassA = class ( tMyBaseClass )
    Y : integer;
    Z : string;
  end;

  tClassB = class ( tMyBaseClass )
    Y : array[1..100]of integer;
    Z : string;
  end;

var
  J : tClassA;
  K : tMyBaseClass;
begin
  J := tClassA . Create;
  J . X := 3.14;
  J . Y := 4;
  J . Z := 'Hello';

  K := J;
  K . X := 2.71828;
  K . Y := 7;       // Does not compile
  K . Z := 'There'; // Does not compile

我们首先定义一个基类tMyBaseClass,然后定义两个不同的类类型,它们派生自tMyBaseClasstClassAtClassBJ 被声明为类型 tClassA。编译器知道J 指的是tClassA 对象的一个​​实例,因此您可以访问J.XJ.YJ.Z。但是K 的类型是tMyBaseClass。你可以引用K.X,因为它是在基类中定义的,但是你不能访问K.YK.Z,因为它们是tClassA的字段,编译器无法知道K是引用tClassA 的一个实例。

这基本上就是您的代码中发生的事情。基类是tForm,您定义了类tMobileFormtDesktopForm,它们都派生自tForm。这些表单中的每一个都有一个名为Memo1 的字段。你有CreatedForm,它的类型是tForm。您无法访问CreatedForm.Memo1,因为tForm 类没有名为Memo1 的字段。

一种解决方案是将Memo1 字段移动到基类中。所以你可以有

type
  tSharedForm = class ( tForm )
    Memo1 : tMemo;
  end;

  tDesktopForm = class ( tSharedForm )
    SomeOtherControl : tPanel;
  end;

  tMobileForm = class ( tSharedForm )
    SomeOtherControl : tComboBox;
  end;

如果您随后将CreatedForm 声明为tSharedForm 类型,那么您可以访问CreatedForm.Memo1,因为它现在位于基类中。

这就是基本表单将为您做的事情。

【讨论】:

谢谢,所以我将创建表单 tSharedForm 并添加我需要访问该表单的所有组件。然后我使用类 tSharedForm 而不是 TForm 创建其他表单?那么每个表单上的所有过程(如 onclick)都必须将它们移动到 tSharedform 吗? 也许最好找一个在线教程来教你如何创建基本表单。我的回答是用最笼统的术语介绍这个概念。 谢谢,在我制作基本表单时出现了许多错误。 OnClick 不起作用。回到如果分配。 在我回答的开头,我给你一个替代方案,使用 FindComponent。这对您有用吗?

以上是关于将 TForm 分配给一个变量 Delphi 以在其他单元中使用的主要内容,如果未能解决你的问题,请参考以下文章

delphi 常量数组赋值给变量数组

DELPHI如何获取并赋值给一个对象的方法

如何从 Delphi 6 对象中获取类以分配给元类变量?

在DELPHI中怎么设置全局变量

delphi 子窗体如何继承主窗体的方法

如何以编程方式将组件分配给 Delphi GridPanel 行和列?