DFM:派生形式包含派生位图

DFM: Derived Form contains derived Bitmaps

使用 C++ Builder XE7

我有一个带有 TImageList 对象的基本表单

object FormBase: TFormBase
  Left = 0
  Top = 0
  Caption = 'FormBase'
  ClientHeight = 200
  ClientWidth = 329
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ImageList1: TImageList
    Left = 32
    Top = 24
    Bitmap = {
      494C010101007800180010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
      snipped
      00000000000000000000000000000000}
  end
end

派生 TFormBase 我注意到 TImageList 的位图已复制到派生形式:

inherited FormBase1: TFormBase1
  Caption = 'FormBase1'
  PixelsPerInch = 96
  TextHeight = 13
  inherited ImageList1: TImageList
    Bitmap = {
      494C010101007800180010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
      snipped
      00000000000000000000000000000000}
  end
end

现在我的应用程序中是否有两个相同的图像列表?

这很有趣。

在运行时,只会为每个 TFormBase 分配一个 TImageList,因此在该级别,您只有一个 TImageList 对象。

但是,根据这些 DFM,您的可执行文件将包含位图数据的两份副本 - 一份用于 TFormBase,另一份用于 TFormBase1。这会使您的可执行文件更大(这是不好的)并且会稍微减慢 TFormBase1 的创建时间(因为位图数据被加载两次)。我认为所有 DFM 资源都保留在内存中,因此它也使用了比必要更多的内存。

尝试手动编辑派生的 DFM 以删除 bitmap={...} 部分,并查看可执行文件是否缩小(以及程序行为是否保持不变!)。