- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道在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;
最佳答案
目前,Delphi不支持DFM文件中存在泛型。但是,考虑到您在一些评论中解释的内容后,我知道您遇到的问题与我过去遇到的问题类似。
就我而言,我所做的是视觉形式继承和框架使用的结合。更具体地讲,我必须创建表单的层次结构和框架的层次结构,并将它们一起使用,以便具有可以与特定对象一起使用的特定表单。当处理给定的特定对象时,表单并不多,框架负责这种特定的处理。
框架具有正确的对象类型的属性,因此我从编译器获得了一定级别的类型检查,尤其是在最复杂的代码中,但是在某些部分中,我不得不自己检查类型,正是因为我无法使用泛型。
也许此模型将满足您的需求。
关于forms - Delphi-TForm和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28188224/
我经常将一个 TForm 后代嵌入到另一个 TForm 后代中,如下所示: var Form1: TForm1; Form2: TForm2; begin Form2.Parent
我注意到一些非常奇怪的事情。我在关闭表单时保留表单的顶部、左侧、宽度和高度属性,并使用此信息在通过使用先前存储的信息调用 SetBounds 再次打开表单时恢复表单的最后位置。这很有效,但前提是在设计
我已经在 stackoverflow 上找到了一些东西,但它并没有真正解决我的疑问。我知道创建对象的正确方法是在创建后将代码包围在 try-finally block 中。但是关于: procedur
我目前(在某些情况下依赖于配置文件)为多个表单创建父子关系。 也就是说一个父表单可以有多个子表单。 我遇到的问题是,当我最小化子窗体并且父窗口当前未最大化(我正在根据配置文件设置父窗体的大小)时,我丢
我有一个用 OwlNext 创建的主窗体,它调用一个在 vcl 中创建的对话框。 MyOtherFormClass Form2=new Form2(); void MyMainForm::ShowFo
我制作了一个 TForm 衍生产品,它的作用类似于组合的下拉部分、提示窗口或弹出菜单 - 一个临时的东西。它没有标题 - 它的 BorderStyle 设置为 bsNone。使用 Show 以非模态方
我正在尝试编写一个返回两个 TForm 之一的函数实例,根据用户设置的配置: function TfrmMain.GetCurrentRamEditFrm: TForm; { Get the RAM
我经常将主窗体句柄传递给其他线程,以便它们可以将消息发回主线程。我在 2013 年 9 月 28 日看到 Remy Lebeau 说: ...the TWinControl.Handle proper
我想使用泛型功能在Delphi 2010中实现单例模式。 type TgrsObj = class class function Singleton(O: T): T; static;
我正在编写一个组件,并希望将基本类型更改为 TForm,但是在运行时我收到错误“找不到资源 TMyComp”。我猜这是因为没有 dfm,但我不知道该怎么办。 谢谢 unit Unit65; inter
我的应用程序有一个主表单,该表单上有一个用于关闭/退出应用程序的按钮。目前它是通过调用 Windows 来关闭句柄编写的: SendMessage(Handle, WM_CLOSE, 0, 0); 但
我正在将一些函数转换为与 Windows 7 功能相关的 DLL。我无法通过 DLL 传递 TForm,因此我需要传递它的句柄。除了,一旦我在另一侧有了该句柄,如何将其重建回 TForm 实例?另外,
TForm.TipMode是什么?属性? 它已被添加到 Delphi XE3 中,但文档中没有提及此属性。 最佳答案 TTipMode 在 Controls.pas 中定义,用于跟踪位于 TabTip
我在 Delphi XE2 中编写了代码,运行完美。但在Delphi XE6中它不起作用。我创建了一个 Tform,其属性 AutoSize 为 true。我使用 TPanel 将 alTop 与按钮
当我显示一个表单时,我将它显示在上次使用 TForm.Left 的位置我保存在ini文件中的属性。 我想添加对多台显示器的支持,因为如果有 2 台显示器,Left 可以是 2500,所以 2 台显示器
我想制作使用tform作为参数的dll,简单的计划是如果将该表单传递给dll,则dll文件返回包含组件名称的数组。 可以将 tform 作为参数传递吗? 最佳答案 您的进程中很可能有两个 VCL 实例
作为 this question 的扩展: TForm.OnResize 有时会在首次显示表单之前触发,但并非总是如此。例如,如果 BorderStyle 为 bsDialog 或 bsNone,则
我目前正在为现有的 Delphi 应用程序编写一个窗口系统。 目前,该程序由许多全尺寸表单组成,这些表单按照需要的顺序以模态方式显示,并且用户无法移动其中任何一个。我的目标是让所有这些形式都可以移动。
这个问题看起来很简单,但由于某种原因我很难找到答案。 我有一个应用程序,可以将表单的大小和位置保存在 INI 文件中。这一切都很好,但是当您在最大化时关闭应用程序时,它将保存最大化表单的大小和位置,但
直到今天,我一直在使用以下代码来捕获应用程序主窗体中的 WM_DEVICECHANGE 消息,并且效果良好。但是,如果我尝试在自定义控件中使用它,我不会收到有关设备插入或删除的通知。发生了什么事?
我是一名优秀的程序员,十分优秀!