Удаление ненужных данных DFM из TImage32 (библиотека Graphics32)

У меня есть элемент управления, полученный из TImage32:

TChromaDisplay = class(TImage32)

Все хорошо, за исключением того, что когда я опускаю TChromaDisplay на форму, полученный файл DFM становится огромным (300 КБ вместо <1 КБ), потому что у меня есть данные мусора (это просто серое изображение), сохраненные в поле Bitmap.Data. Растровое изображение создается и заполняется серым цветом каждый раз, когда я опускаю свой элемент управления в форме. Я не хочу сохранять содержимое изображения (мусора) в файл 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;

2 ответа

Решение

Обновить:

Глядя на диалог времени разработки изображения 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 уже создан).

Все еще не проверено, так как я не могу смоделировать вашу проблему.

Это не "мусор". Это изображение (будь то назначенное вами или созданное элементом управления в его конструкторе). Это растровое изображение, расположенное в позиции 0, 0 с шириной и высотой 1465, 246,

BitmapData это данные в растровом изображении (пиксели и т. д.), закодированные в виде шестнадцатеричной строки, поэтому они будут помещены в текст dfm.

Решение состоит в том, чтобы выяснить, как назначается растровое изображение. Это либо:

  • В конструкторе компонента (изображение по умолчанию?)
  • В вашей форме (вы назначили изображение в IDE)
  • Он не удаляется из DFM в предыдущий раз, когда он был назначен.

Первый требует, чтобы вы внимательно изучили исходный код компонента, чтобы выяснить, где он назначен. Вы можете проверить, как свойство bitmap вызывается внутри (например, FBitmap или же FImage), а затем искать места, которым он получает назначенное изображение (LoadFromFile, LoadFromStream, LoadFromResource, Assign, и так далее).

Второй и третий: сделайте резервную копию вашего dfm на всякий случай. Удалите компонент из вашей формы. Закомментируйте любой код, связанный с ним, чтобы ваш модуль скомпилировался. Щелкните правой кнопкой мыши и выберите View as Text, Ищи TChromaDisplay (или просто TChroma) и удалите все, что вы найдете в dfm, связанной с ним. Щелкните правой кнопкой мыши и выберите View as Form, а затем построить свой проект. Вернитесь в DFM и убедитесь, что все следы TChroma все еще нет

Другие вопросы по тегам