【发布时间】:2020-12-05 22:54:28
【问题描述】:
下面的问题讨论了 TButton 和 TBitBtn 之间的继承链是如何变化的,即引入了一个共同的祖先,TCustomButton。
What happened to TBitBtn and TButton inheritance chain?
过去,那些想要在按钮上显示图形的人会选择 TBitBtn,因为它提供了位图字形的使用。
在较新的 Delphi 版本中,标准 TButton 允许指定 TImageList 以支持 png / jpg,而 TBitBtn 则不允许。
我的(长期)按钮子类继承自 TBitBtn,更改它意味着潜在的应用程序范围的按钮重新设计。没时间了。我希望能够随着时间的推移逐步迁移事物,而无需删除和重新创建按钮(有可能错过属性或事件的迁移)。最好选择一个按钮,擦除其字形,将 png 放入其图像列表中。
查看 VCL.Buttons 和 VCL.StdCtrls 的源代码,ImageList、ImageIndex ... 的大部分工作都是在共同的祖先 TCustomButton 上完成的。 TButton 只发布那些在设计时使用的属性。
太好了,我可以简单地让我的 TBitBtn 子类发布这些相同的属性。这些属性现在在对象检查器中可见。我可以选择一个图像列表组件,甚至可以从可用图像中选择一个图像索引。
这就是事情停止工作的地方:所选图像不会在设计时显示,也不会在运行时显示。分配一个字形,它会毫无问题地显示出来。我尝试查看可能会干扰 png 绘制的其他属性(可能是某种透明度选项),但徒劳无功。
编辑:
此链接提到 TBitBtn 故意禁用 ImageList 的使用以支持其自己的绘图:
http://codeverge.com/embarcadero.delphi.graphics/tbitbtn-with-png-on-d2009/1077124
不过,对于如何尽可能顺利地实现上述从 bmp 图标到 png 图标的“婴儿步骤”迁移,有什么建议吗?
版本信息:10.3.1
谢谢!
【问题讨论】:
-
TBitBtn和TButton之间存在显着差异,这将使您的“婴儿步”变得非常困难。你看到的标准TButton总是只显示一个图像TBitBton实际上可以包含多达四个存储在同一个图像中的字形。这四个图像用于显示按钮的不同状态(Up、Disabled、Clicked、Down)。为了绘制所需的图像,它使用 ImageList 代码从提供的图像中提取所需的字形。这使得无法从图像列表加载图像到 TBitBtn。 -
现在查看 Delphi 10.4 的文档,
TCustomButton类似乎发生了重大变化,它引入了额外的属性来确定不同按钮状态的图像索引,基本上允许任何按钮具有多个状态的多个图像. -
因此,无论您在当前版本中所做的“小步骤”如何,请注意,当您决定迁移到 Delphi 10.4 或更高版本时,它们可能会被破坏。在您的情况下,我会考虑在对您的自定义版本
TButBtn进行任何更改之前升级到最新版本的 Delphi。也许对TCustomButton的新更改也将帮助您简化自定义按钮的代码。 -
正确,因此迁移到 10.4 将有效地允许我一次更改一个按钮,而不会在整个应用程序中产生任何副作用。这似乎确实是最佳选择。现在,这是否使 TButton 和 TBitBtn 之间的区别成为历史区别,还是仍然有任何用例可以选择这个而不是那个?
-
另外,如果你不介意把它写下来作为答案,我可以接受。谢谢!