5

我有一个从 TImage32 派生的控件:

TChromaDisplay = class(TImage32)

一切都很好,除了当我将 TChromaDisplay 放在表单上时,生成的 DFM 文件很大(300KB 而不是 <1KB),因为我在 Bitmap.Data 字段中保存了垃圾数据(它只是一个灰色图像)。每次我将控件放在表单上时,都会创建位图图像并用灰色填充。我不想将图像(垃圾)的内容保存到 DFM 文件,因为它会使 EXE 变大,但我不知道如何。

可能我需要在 TChromaDisplay.Create 的某个地方写下我的 TChromaDisplay 中没有保存/存储任何图像数据。但我不知道在哪里/如何做。

  object Display: TChromaDisplay
    Left = 0
    Top = 0
    Width = 1465
    Height = 246
    Bitmap.Data = {
      C0000000C0000000EBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFF
      EBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFF
      EBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFF
      etc
      etc
      etc

我在 Create 中尝试过,但无济于事:

Bitmap.Width := 1;
Bitmap.Height:= 1;
4

2 回答 2

3

这不是“垃圾”。它是一个图像(无论是您分配的图像还是控件在其构造函数中创建的图像)。它是位于位置 的位图00宽度和高度为 1465, 246

BitmapData是位图中的数据(像素等),编码为十六进制字符串,因此它将进入文本 dfm。

解决方案是弄清楚位图是如何分配的。它是:

  • 在组件的构造函数中(默认图像?)
  • 在您的表单上(您已在 IDE 中分配了一个图像)
  • 它没有从之前分配的 DFM 中删除。

第一个要求您仔细检查组件的源代码以找出它被分配的位置。您可以检查位图属性在内部调用的内容(例如,FBitmapFImage),然后搜索它获得分配图像的位置(、、、、LoadFromFile等等LoadFromStream)。LoadFromResourceAssign

第二和第三:备份你的dfm以防万一。从表单中删除组件。注释掉与之相关的任何代码,以便您的单元编译。右键单击它,然后选择View as Text。搜索TChromaDisplay(或只是TChroma),并删除您在 dfm 中找到的所有相关内容。右键单击并View as Form选择 ,然后构建您的项目。回到 dfm 并确保所有的痕迹TChroma仍然消失。

于 2012-06-10T16:13:38.967 回答
3

更新:

GR32_Dsgn_Bitmap.pas查看TImage32.Bitmap属性的设计时图像对话框,Clear那里的按钮使用将Bitmap.Delete位图大小设置为 0x0 的过程。因此,您可以尝试在保存表单流之前调用它来清除位图:

type
  TChromaDisplay = class(TImage32)
  protected
    procedure WriteState(Writer: TWriter); override;
  end;

implementation

procedure TChromaDisplay.WriteState(Writer: TWriter);
begin
  Bitmap.Delete;
  inherited;
end;

但是它仍然没有解释为什么当你在表单上放置一个控件时你有一个位图数据。您还可以Bitmap.Delete在继承部分完成后(当Bitmap已经实例化时)在您的控件构造函数中调用 。

仍然未经测试,因为我无法模拟您的问题。

于 2012-06-10T16:56:37.780 回答