我想知道是否有可能在 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
然而,这似乎没有什么区别。
请问有人可以提供任何建议吗?提前致谢!