Переход на новую среду разработки может быть непростой задачей, особенно если она включает в себя освоение нового языка программирования и инструментов. Это особенно актуально для разработчиков, привыкших к 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 должен быть изменен следующим образом:
В комментариях обсуждается возможность добавления изображений в 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