Delphi - TForm和Generics

时间:2015-01-28 09:04:08

标签: forms delphi generics vcl tform

我想知道在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

然而,这似乎没有任何区别。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

也许这种模式符合您的需求。