Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2024, 19:10   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Корректна ли замена BitMap

Код:
Procedure aaa(var bbb:TBitMap);
var
  ddd:TBitMap;
begin
  ddd:=TBitMap.Create;
  {какие-то действия, которые наполняют ddd информацией}
  bbb.free;
  bbb:=ddd;
end;
И потом вызываю процедуру
Код:
aaa(bmp1);
Будет ли корректно работать такой код?
1. Не будет ли создаваться лишнего мусора в памяти?
2. Будет ли за пределами этой процедуры нормально работать новое изображение по старой переменной bmp1?
Kronos913 вне форума Ответить с цитированием
Старый 11.03.2024, 11:36   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Не будет ли создаваться лишнего мусора в памяти?
- будет, конечно. Такие большие объекты, как Bitmap не передаются в полном объеме, передается лишь указатель на них. Если надо несколько вариантов одного и того же изображения - заведите несколько глобальных переменных.
Cuprum5 вне форума Ответить с цитированием
Старый 11.03.2024, 12:56   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
будет, конечно
Ну на первый взгляд не должно, так как он делает bbb.free. А вот подчищает ли за собой весь мусор деструктор класса TBitMap, тут я не знаю...
Arigato вне форума Ответить с цитированием
Старый 12.03.2024, 07:03   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Деструктор подчищает, естественно. Другое дело, что на экземпляр TBitmap могут ссылаться или агрегировать внутри себя другие объекты, поэтому экземпляры классов обычно через var-параметры не передают. TBitmap наследован от TPersistent, поэтому общей практикой является «объектное» присваивание вызовом метода Assign:
Код:
procedure aaa(bbb: TBitmap);
var
  ddd: TBitmap;
begin
  ddd:=TBitmap.Create;
  try
    {какие-то действия, которые наполняют ddd информацией}
    bbb.Assign(ddd);
  finally
    ddd.Free;
  end;
end;
Для некоторых типов графических объектов внутри VCL есть еще глобальный кэш, работающий незаметно для программиста. Не помню, что именно он делает, плюс, кажется, он только для шрифтов и кистей (в Windows 9x нужно было экономить ресурсы GDI), а картинки не кэшируются. По-любому, всегда можно посмотреть отладчиком, что именно происходит внутри VCL, собрав программу с отладочными модулями.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PNG в Bitmap AndreyFreeman Мультимедиа в Delphi 13 02.11.2015 11:24
Замена цвета в bitmap'е на другой new_newbie Помощь студентам 3 26.04.2011 18:59
Фон Bitmap apromix Помощь студентам 5 22.01.2010 08:00
из-за чего появляется полоса (на скрине) при вставке BitMap в TImage? - Проблема с Bitmap Grey@2009 Мультимедиа в Delphi 2 02.01.2010 20:23
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52