我想知道在Delphi中是否可以使用泛型定义从TForm派生的基本表单类。我正在处理的应用程序与各种硬件设备(通过串行端口,USB,以太网等)进行交互,并且我希望每个设备能够显示包含特定于该设备的属性的属性表单。 / p>
到目前为止,我有以下代码......
// 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包含一个&#34; OK&#34;和&#34;取消&#34;按钮。我想为TDeviceForm添加其他功能,但是当我尝试打开设计器时,会出现以下错误...
创建表单时出错:找不到根类:&#34;&#34;。
同样,如果我尝试打开TGpsDeviceForm设计器,我会收到以下错误......
创建表单时出错:“TSerialDeviceForm”的祖先&#39;没找到。
我假设Delphi表单设计师无法处理泛型,但是可以更好地解决这个问题吗?
在DFM文件中,对于TBaseForm以外的所有内容,我改变了第一行:
对象DeviceForm:TDeviceForm 至 继承了DeviceForm:TDeviceForm
然而,这似乎没有任何区别。
请有人可以提供任何建议吗? 提前谢谢!
答案 0 :(得分:0)
目前,Delphi不支持DFM文件中存在泛型。但是,考虑到你在一些评论中解释的内容,我知道你遇到的问题类似于我过去的问题。
就我而言,我所做的是视觉形式继承和框架的使用。更具体地说,我必须创建一个表单层次结构和一个框架层次结构,并将它们一起使用,以便拥有一个能够处理特定对象的特定表单。在处理给定的特定对象时,表单并不多,框架负责这种特定的处理。
框架具有正确的对象类型的特性,所以我从编译器获得了一定级别的类型检查,特别是在最复杂的代码中,但在某些部分我必须自己检查类型,正是因为我不能使用泛型。
也许这种模式符合您的需求。