将 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
,然后定义两个不同的类类型,它们派生自tMyBaseClass
、tClassA
和tClassB
。
J
被声明为类型 tClassA
。编译器知道J
指的是tClassA
对象的一个实例,因此您可以访问J.X
、J.Y
和J.Z
。但是K
的类型是tMyBaseClass
。你可以引用K.X
,因为它是在基类中定义的,但是你不能访问K.Y
或K.Z
,因为它们是tClassA
的字段,编译器无法知道K
是引用tClassA
的一个实例。
这基本上就是您的代码中发生的事情。基类是tForm
,您定义了类tMobileForm
和tDesktopForm
,它们都派生自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 以在其他单元中使用的主要内容,如果未能解决你的问题,请参考以下文章