2

我想知道是否有可能在 Delphi 中定义一个从 TForm 派生的带有泛型的基表单类。我正在处理的应用程序与各种硬件设备(通过串口、usb、以太网等)交互,我希望每个设备都能够显示一个包含特定于该设备的属性的属性表单。

到目前为止,我有以下代码......

// DEVICE MODEL...

// Interface defining a device
IDevice = interface 
    procedure ShowPropertyForm;
    // ... Other procedures and functions
end;

// Abstract base device class
TDevice = class(IDevice)
    protected
        // Override this function to show their property form
        procedure DoShowPropertyForm; virtual; abstract;

    public
        // Calls Self.DoShowPropertyForm;
        procedure ShowPropertyForm;
end;

TSerialDevice = class(TDevice)
    protected
        // Creates and shows the TSerialDeviceForm below
        procedure DoShowPropertyForm; override;
end;

// Represents a device capable of providing positioning information
TGpsDevice = class(TSerialDevice)
    protected
        // Creates and shows the TGpsDeviceForm below
        procedure DoShowPropertyForm; override;
end;

// FORM MODEL...

// Represents a base form, with skinning functionality, etc
TBaseForm = class(TForm)

end;

// Base device properties form, allows the form to access a strongly-typed
// version of the IDevice
TDeviceForm<T : IDevice> = class(TBaseForm)

    private
        FDevice : T;

    public
        // Accessor for the associated IDevice
        property Device : T read FDevice write FDevice;
end;

// Property form for a TSerialDevice, has controls for controlling port name
// baud rate, stop/start bits, etc
TSerialDeviceForm = class(TDeviceForm<TSerialDevice>)

end;

// Property form for a TGpsDevice, has controls in addition to what is
// provided by the TSerialDeviceForm
TGpsDeviceForm = class(TSerialDeviceForm) 

end;

尝试访问表单设计器时会出现问题。例如,TBaseForm 包含一个“确定”和一个“取消”按钮。我想向 TDeviceForm 添加其他功能,但是当我尝试打开设计器时,出现以下错误...

创建表单时出错:找不到根类:“”。

同样,如果我尝试打开 TGpsDeviceForm 设计器,我会收到以下错误...

创建表单时出错:找不到“TSerialDeviceForm”的祖先。

我假设 Delphi 表单设计器无法处理泛型,但有没有更好的方法来解决这个问题?

在 DFM 文件中,对于 TBaseForm 以外的所有内容,我已将第一行从以下内容更改为:

对象 DeviceForm: TDeviceForm 到继承的 DeviceForm: TDeviceForm

然而,这似乎没有什么区别。

请问有人可以提供任何建议吗?提前致谢!

4

1 回答 1

0

目前 Delphi 不支持在 DFM 文件中存在泛型。但是,考虑到您在一些评论中解释的内容,我了解到您遇到的问题与我过去遇到的问题相似。

就我而言,我所做的是将视觉形式继承和框架的使用结合起来。更具体地说,我必须创建表单层次结构和框架层次结构并将它们一起使用,以便拥有应该能够与特定对象一起使用的特定表单。在处理给定的特定对象时,表单并没有太多作用,框架负责这种特定的处理。

框架具有正确对象类型的属性,因此我从编译器获得了一定程度的类型检查,特别是在最复杂的代码中,但在某些部分我必须自己检查类型,正是因为我不能使用泛型。

也许这个模型会满足你的需要。

于 2015-01-28T13:42:18.843 回答