我有一个源自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;
答案 0 :(得分:3)
这不是“垃圾”。它是一个图像(无论是你指定的图像还是控件在其构造函数中创建的图像)。它是位于0
,0
的位图,其宽度和高度为1465
,246
。
BitmapData
是位图中的数据(像素等),编码为十六进制字符串,因此它将以文本dfm格式显示。
解决方案是弄清楚如何分配位图。它是:
第一个要求您仔细检查组件的源代码,以确定它的分配位置。您可以检查内部调用的位图属性(例如,FBitmap
或FImage
),然后搜索分配了图像的位置(LoadFromFile
,{{1} },LoadFromStream
,LoadFromResource
等等。
第二个和第三个:备份你的dfm以防万一。从表单中删除组件。注释掉与之相关的任何代码,因此您的单元将进行编译。右键单击它,然后选择Assign
。搜索View as Text
(或仅TChromaDisplay
),并删除与dfm相关的所有内容。右键单击并选择TChroma
,然后构建项目。返回到dfm并确保View as Form
的所有痕迹仍然消失。
答案 1 :(得分: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
已经实例化时)。
尚未经过测试,因为我无法模拟您的问题。