Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Переход с C# и Visual Studio на Delphi 10.1 Berlin: создание и управление списками изображений с использованием паттерна Singleton

Delphi , Графика и Игры , Изображения

Переход на новую среду разработки может быть непростой задачей, особенно если она включает в себя освоение нового языка программирования и инструментов. Это особенно актуально для разработчиков, привыкших к C# и Visual Studio, которые теперь сталкиваются с необходимостью использовать Delphi 10.1 Berlin. Одной из таких сложных задач является создание и управление списками изображений, что может быть особенно трудоемким, если вы хотите реализовать это в виде синглтона для повышения производительности и упрощения управления ресурсами.

Проблема

Разработчик, переходящий с C# и Visual Studio на Delphi 10.1 Berlin, столкнулся с проблемой при создании TImageList в runtime и его сохранении в синглтон-объекте. При попытке добавления изображения в TImageList произошел сбой из-за ошибки чтения памяти.

Контекст

В коде, предоставленном разработчиком, используется класс ImagesRessource, который предназначен для инициализации и управления ресурсами изображений. В методе Initialize происходит создание экземпляра TPngImage, загрузка изображения из ресурсов, преобразование PNG в TBitmap с помощью функции GetBmpOf, а затем добавление изображения в TImageList. Ошибка возникает в строке, где используется метод AddMasked.

Решение

Проблема заключается в двух моментах: 1. Функция GetBmpOf не возвращает созданный экземпляр TBitmap. Необходимо присвоить результат создания TBitmap переменной Result. 2. Переменная _man24 типа TPngImage создается в куче, но не используется локально, что потенциально может привести к утечке памяти. Лучше всего объявить её как локальную переменную внутри метода Initialize. 3. Размер изображения жестко задан как 24 в некоторых частях кода, но не в других. Это может привести к несоответствию размеров, если изображения имеют другой размер. 4. Блок try...except не выполняет никаких действий после перехвата исключения, поэтому его можно удалить.

Исправленный код функции GetBmpOf будет выглядеть так:

function ImagesRessource.GetBmpOf(png: TPngImage): TBitmap;
begin
  Result := TBitmap.Create;
  Result.Width := png.Width;
  Result.Height := png.Height;
  png.Draw(Result.Canvas, Rect(0, 0, Result.Width, Result.Height));
end;

А метод Initialize должен быть изменен следующим образом:

procedure ImagesRessource.Initialize(owner: TComponent);
var
  bmp: TBitmap;
  RS: TResourceStream;
  man24: TPngImage;
begin
  _imageList := TImageList.Create(owner);
  _imageList.ColorDepth := clMDIB;
  _imageList.Width := 24;
  _imageList.Height := 24;
  try
    RS := TResourceStream.Create(HInstance, 'MAN_24', RT_RCDATA);
    man24 := TPngImage.Create;
    man24.LoadFromStream(RS);
    bmp := GetBmpOf(man24);
    _imageList.AddMasked(bmp, bmp.PixelFormat = pfDIB ? bmp.Transparent : $FFFFFFFF);
  finally
    bmp.Free;
    man24.Free;
  end;
end;

Альтернативные подходы

В комментариях обсуждается возможность добавления изображений в TImageList во время проектирования формы или модуля данных, а также преимущества использования ресурсов вместо их добавления в файл .dfm. Это может упростить процесс контроля версий и уменьшить размер проекта.

Заключение

Переход на Delphi 10.1 Berlin требует внимания к деталям и понимания особенностей работы с ресурсами и объектами. Использование паттерна Singleton для управления ресурсами изображений может быть эффективным, но важно правильно реализовать такие паттерны, чтобы избежать ошибок и проблем с производительностью.

Создано по материалам из источника по ссылке.

Разработчик, переходящий с C# и Visual Studio на Delphi 10.1 Berlin, столкнулся с техническими сложностями при создании и управлении списками изображений с использованием паттерна Singleton, в частности, при работе с TImageList и его синглтон-объектом, ч


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Изображения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:37:28/0.0022060871124268/0