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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2019, 01:53   #11
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
То есть, создаем в OnCreate кучу объектов без владельца и уничтожать их потом не нужно? Это как так?
Да так. Уничтожение объекта есть не что иное как освобождение памяти выделенной ОС для этого объекта. Но при завершении работы приложения вся память выделенная ему ОС освобождается автоматом.

P.S. Это ответ практика.
Ведь как правило в OnCreate главной формы создаются объекты, которые должны жить до окончания работы приложения.
northener вне форума Ответить с цитированием
Старый 04.11.2019, 10:34   #12
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

как-то это бестолково немного получается.
Открыл кран, ушел (не закрыл) - квартиру затопило.
BLACK_RAIN вне форума Ответить с цитированием
Старый 05.11.2019, 01:09   #13
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
как-то это бестолково немного получается.
Открыл кран, ушел (не закрыл) - квартиру затопило.
Смысла нет отключать воду в одной квартире, если в момент вашего ухода исчезает из бытия весь дом, город, страна, планета, звездная система, галактика, etc. Нечего затапливать. Да и нечем затапливать, ибо одновременно из бытия исчезает и вода тоже.
northener вне форума Ответить с цитированием
Старый 05.11.2019, 08:08   #14
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от Женя32 Посмотреть сообщение
Здравствуйте!
Задача такая:
Есть PageControl с двумя вкладками. Нужно чтоб в PaintBox1 отображалась картинка, в зависимости от активной вкладки.
Картинки хранятся в двух переменных, vbmapFs и vbmapRs: TBitmap;

Я пытался делать так, но, при закрытии программы, выходит ошибка:
Код:
 if PageControl1.ActivePageIndex = 0 then vbmap:=vbmapFs else vbmap:=vbmapRs;
............
with PaintBox1 do begin
    Width  := nw;
    Height := nh;
    Canvas.Lock;
    // Задать режим масштабирования со сглаживанием
    SetStretchBltMode(Canvas.Handle, HALFTONE);
    // Скопировать картинку с масштабированием
    StretchBlt(Canvas.Handle, 0, 0, Width , Height, vbmap.Canvas.Handle,
               0, 0, vbmap.Width , vbmap.Height, SRCCOPY);
    Canvas.Unlock;
  end;
Подскажите, пожалуйста, почему выскакивает эта ошибка?
Если вернуться к теме разговора.
Подобная ошибка, так -же может выскакивать если вы пытаетесь уничтожить объект у которого уже уничтожен родитель, а дети по какой то причине остались целы, либо был уничтожен класс где этот объект был зарегистрирован.
К примеру:

Код:
TMyForm= class(TForm)
private
  FBitMap1: TBitmap;
  FBitMap2: TBitmap;
end
var
  MyForm: TMyForm;
Очистка следующего рода даст Вашу ошибку:
Код:
  FreeAndNil(MyForm)
  FreeAndNil(FBitMap1) //<-- Вот тут получим ошибку, поскольку объекта MyForm, уже не существует. Но сам FBitMap1 продолжает занимать место в памяти и там реально лежит картинка
  FreeAndNil(FBitMap2) //<-- А до сюда уже не дойдет
А Вот так, уже не будет ошибки:
Код:
  FreeAndNil(FBitMap1)
  FreeAndNil(FBitMap2) 
  FreeAndNil(MyForm)
Это ооочень условный пример. northener Вам уже писал про наследтственность Components и.т.д. Я Вам посоветую включить следующее:
Project - View Sorce
Код:
 Application.Initialize;
  ReportMemoryLeaksOnShutdown := True;
  Application.MainFormOnTaskbar := False;
  Application.CreateForm(TВАША ФОРМА, ВАША ФОРМА);
  Application.Run;
Это включит оповещение о утечке памяти и покажет, что не очищено. Может помочь разобраться в каком месте кода искать проблему.
Чтобы решить вашу задачу, нужно видеть как вы реализовали создание объектов и как реализовано их уничтожение. Чтобы проследить наследственность - если она есть разумеется. Причина ошибки может быть как в ваших TBitMap так и в другом.
P:S: Я отчасти согласен с northener, про тему вселенных =). Но если Вы решили программировать, то посоветую разобраться с этой ошибкой, найти и исправить, а не забить болт на вселенную не разобравшись =))).

Для вашего случая с 1 формой это вообще не критично, но в больших проектах подход (мусорю как хочу, все равно при смерти процесса все вычистится) не допустимо.
У меня в свое время была точно такая же ошибка, связанная с битмапами. Проблема была в том, что я с начало уничтожил класс где они были зарегистрированы, а потом стал уничтожать сами TBitMap. И Алегоп -ошибка. TBitMap уничтожать надо обязательно, имхо его создание TBitMap.Create. И он не уничтожиться Сам, если будет уничтожен класс, где он был создан.
Для классов типа TPanel. Даже если вы создаете их динамически, прописывать уничтожение не нужно. Если создавать TPanel.Create(Form1). Панель сама уничтожиться в событии Form.Destroy. Если создадите TPanel.Create(nil), то очищать нужно. Иначе будет утечка.
Это я так, подытожил все написаное тут =))
Пишу много и развернуто

Последний раз редактировалось Heneken87; 05.11.2019 в 09:17.
Heneken87 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как присвоить одной переменной последовательность текстовых значений других переменных WildWhiteRabbit Помощь студентам 4 01.06.2015 09:58
я ничего из этого не понимаю надеюсь на других (понимающих) Жуан Фриланс 9 28.01.2012 23:23
если я хочу чтобы переменная была рандом, нужно просто написать, что типа а:=random? какой это будет тип переменных? gylayko Помощь студентам 6 04.10.2011 12:58
Присвоение значений SilentM Общие вопросы C/C++ 4 15.09.2011 13:10
Отображение значений переменных типа float и double(Языки Pascal и C) Сырно Помощь студентам 3 17.10.2010 18:37