5

TImage32から派生したコントロールがあります。

TChromaDisplay = class(TImage32)

TChromaDisplayをフォームにドロップすると、Bitmap.Dataフィールドにガベージデータ(単なるグレー画像)が保存されているため、結果のDFMファイルが巨大(<1KBではなく300KB)になることを除いて、すべて問題ありません。フォームにコントロールをドロップするたびに、ビットマップイメージが作成され、灰色で塗りつぶされます。画像(ゴミ)の内容をDFMファイルに保存したくないのですが、EXEが大きくなるのでどうすればいいのかわかりません。

おそらく、TChromaDisplayのどこかに書き込む必要があります。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

アップデート:

プロパティのデザイン時の画像ダイアログGR32_Dsgn_Bitmap.pasを見ると、そこにあるボタンは、ビットマップサイズを0x0に設定するだけの手順を使用しています。したがって、フォームストリームが保存される前に、それを呼び出してビットマップをクリアすることができます。TImage32.BitmapClearBitmap.Delete

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 に答える
3

これは「ゴミ」ではありません。これはイメージです(割り当てたイメージであるか、コントロールがコンストラクターで作成したイメージであるかは関係ありません)。これは、位置にあるビットマップ00、幅と高さは 1465246です。

これBitmapDataはビットマップ内のデータ(ピクセルなど)であり、16進文字列としてエンコードされているため、テキストdfmに含まれます。

解決策は、ビットマップがどのように割り当てられているかを把握することです。それは次のいずれかです:

  • コンポーネントのコンストラクター(デフォルトのイメージ?)
  • フォーム上(IDEで画像を割り当てました)
  • 前回割り当てられたときからDFMから削除されていません。

1つ目は、コンポーネントのソースコードを詳しく調べて、コンポーネントが割り当てられている場所を特定する必要があります。ビットマッププロパティが内部で呼び出されているかどうかを確認し(たとえば、FBitmapまたは) 、FImage画像が割り当てられる場所を検索できます(LoadFromFile、、、、LoadFromStreamなど)。LoadFromResourceAssign

2番目と3番目:万が一に備えてdfmをバックアップします。フォームからコンポーネントを削除します。ユニットがコンパイルされるように、それに関連するコードをコメントアウトします。それを右クリックして、を選択しますView as TextTChromaDisplay(または単に)を検索TChromaし、それに関連するdfmで見つけたものをすべて削除します。右クリックして選択View as Formし、プロジェクトをビルドします。dfmに戻り、の痕跡がすべて残っていることを確認しますTChroma

于 2012-06-10T16:13:38.967 に答える