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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2019, 22:16   #1
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье Переменная TBitmap, поочередное присвоение значений других переменных этого типа

Здравствуйте!
Задача такая:
Есть 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;
Подскажите, пожалуйста, почему выскакивает эта ошибка?
Изображения
Тип файла: jpg error.jpg (6.8 Кб, 98 просмотров)
Женя32 вне форума Ответить с цитированием
Старый 26.09.2019, 01:56   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Что вы делаете при закрытии программы?
Например такая ошибка возникает при попытке уничтожения объекта более одного раза.

Последний раз редактировалось northener; 26.09.2019 в 02:04.
northener вне форума Ответить с цитированием
Старый 26.09.2019, 11:05   #3
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Что вы делаете при закрытии программы?
Например такая ошибка возникает при попытке уничтожения объекта более одного раза.
Т.е., не нужно прописывать переменную vbmap в Destroy?
Код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  vbmapFs.Destroy;
  sbmapFs.Destroy;
  vbmapRs.Destroy;
  sbmapRs.Destroy;
  vbmap.Destroy;
end;
Женя32 вне форума Ответить с цитированием
Старый 26.09.2019, 11:57   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да. удали
Цитата:
Сообщение от Женя32 Посмотреть сообщение
Код:
vbmap.Destroy;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2019, 03:17   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Женя32 Посмотреть сообщение
Т.е., не нужно прописывать переменную vbmap в Destroy?
Лично я вообще не вижу смысла в написании события обработчика TForm.OnDestroy.
OnDestroy нужен в самописных компонентах/объектах. Но не в оконном TForm.
northener вне форума Ответить с цитированием
Старый 27.09.2019, 10:26   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Лично я вообще не вижу смысла в написании события обработчика TForm.OnDestroy.
а если объекты созданы вручную (программистом) в TForm.FormCreate(),
то где их освобождать? Разве TForm.FormDestroy() не наиболее подходящий метод?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.09.2019, 01:28   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
если объекты созданы вручную (программистом) в TForm.FormCreate(),
то где их освобождать? Разве TForm.FormDestroy() не наиболее подходящий метод?
Ну да, ну да. Именно это и написано в справке ещё Д1.
Вот только я не вижу смысла в TForm.FormCreate() создавать объекты с владельцем nil. А именно в этом и только в этом случае их нужно удалять ручками в TForm.FormDestroy(). Если же указать владельцем саму форму (ну это как бы должно являться нормой), то они удалятся автоматом как члены списка Components.
northener вне форума Ответить с цитированием
Старый 28.09.2019, 07:49   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А объекты вообще без владельца? Bitmap тот же. Или явно захваченная память?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.09.2019, 02:23   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А объекты вообще без владельца? Bitmap тот же. Или явно захваченная память?
Ну тоже "ну да, ну да".
Для объектов создаваемых в OnCreate главной формы, имхо, нет необходимости ручками уничтожать их. Память им выделенная всё равно вернётся в ОС.
А у ТС похоже речь идёт именно о главной форме.

В неглавной/вторичной форме действительно нужно уничтожать такие объекты ручками, если эта форма создается и уничтожается неоднократно при работе приложения.

Но во-первых много ли вы вспомните примеров таких вторичных форм? А во-вторых почему именно OnDestroy, а не OnClose?

Не ну я ни в коем разе не возражаю против существования метода OnDestroy у TForm. Лишняя соломка не повредит.

Последний раз редактировалось northener; 29.09.2019 в 02:53.
northener вне форума Ответить с цитированием
Старый 02.11.2019, 16:23   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

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


Купить рекламу на форуме - 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