gpt4 book ai didi

delphi - Delphi中如何在窗体之间传递数据?

转载 作者:行者123 更新时间:2023-12-03 15:03:56 29 4
gpt4 key购买 nike

这可能看起来有点新手,但我确实遇到了问题。我有一个表单(不是主要表单)用于从用户获取许多不同的数据,我想将其传递给管理器类以使用这些数据创建对象。问题是我不能让这个类使用其他单元(获取循环使用),而且它也无法访问管理器类实例(位于主窗体中)。

那么,我该怎么办呢?我已经考虑过使用公共(public)变量,但我对此有不好的感觉(关于 OOD 模式)。

最佳答案

我的建议是将数据与GUI分离,因为这会导致您的问题。如果您有一个从用户收集数据的表单,那么您应该将数据与表单(TForm)区分开来。

例如,假设您有一些 TForm 实例和一个表单,该表单由三个字段构建:用户名、年龄和位置。您希望用户输入这三件事,但是当用户关闭表单时,您应该将此插入的数据传递到某个对象上。窗体关闭,它被释放,但对象仍然存在。然后将此对象传递给管理器对象。

简单的例子:

这是您保存数据的记录

type
TGatheredData = record
Name: String[40];
Age: Byte;
Location: String[40];
end;

您的 TForm1 可能有一个附加构造函数:

constructor TForm1.Create(AOwner: TComponent; var GatheredData: TGatheredData );
begin
inherited Create(AOwner);
FGatheredData := GatheredData;
//you may want to deserialize GatheredData here and show the data in your form controls
end;

您调用它,传递 GatheredData,然后您将显示您的表单。

接下来,当关闭表单时,您将从表单控件中获取数据。

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Self.ModalResult = mrOk then
begin
//serialize your object
FGatheredData.Name := '';//name taken from control f.e. TEdit
FGatheredData.Age := '';//name taken from control f.e. TSpinButton
FGatheredData.Location := '';//name taken from control f.e. TEdit
end;
end;

有了此数据记录,您现在可以以相同的方式将其传递给 Manager 对象。您通过这种方式将数据与 GUI 解耦,并且您可以轻松地将记录插入到多种不同的表单中。

只需记住在外部单元中声明您的记录类型,并在您的经理单元和表单单元中使用该单元。

希望这会有所帮助。

关于delphi - Delphi中如何在窗体之间传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2956164/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com