Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Методы формы

Автор: sheka 27.01.2011 21:33

Какая разница между методами формы hide, close? Где и когда они используются?

Автор: мисс_граффити 27.01.2011 21:37

это не свойства.
а разница - скрыть (спрятать) форму или закрыть.

Автор: sheka 27.01.2011 22:45

Очепятался. smile.gif Исправил.
Логично. good.gif А более подробно? Мои поиски в инете не увенчались успехом.

Автор: volvo 27.01.2011 22:49

Цитата
Исправил.
Исправляй еще раз. Это не события, это методы...

Цитата
А более подробно?
Первоисточник:
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Controls_TControl_Hide.html
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TCustomForm_Close.html

Автор: sheka 27.01.2011 22:53

Это уже 3й раз smile.gif)) Сразу же я исправил на методы, но потом зашел в ИДЕ и посмотрел, что там написано Events.
Т. е. это означает, что метод выполняется по событию(или как-то так)?

Автор: volvo 27.01.2011 22:58

Это означает, что при вызове метода Hide выполняется обработчик события OnHide, а при вызове метода Close - обработчик события OnClose.

P.S. Уточнение. Скорее, не при вызове, а после того, как метод произведет некоторые действия. Скажем, если вызван метод Hide - то произойдет то, что должно произойти: свойство Visible перебросится в False. А вот когда это произойдет - вызовется обработчик OnHide.

То же самое и с закрытием формы. Либо ты напрямую в коде повесишь на кнопку Form1.Close, либо попытаешься закрыть форму нажатием на крестик или Close в меню формы (которое Alt+F4). В любом из этих случаев будет вызван метод Close, что инициирует срабатывание события OnClose.

Автор: sheka 27.01.2011 23:00

Все равно не понятно: если form.close, а потом form.show, то форма показывается, при чем данные которые были в ней записаны, те и остаются. Значит это есть одно и то же, а различие состоит только для главной формы?

Автор: volvo 27.01.2011 23:24

Цитата
если form.close, а потом form.show, то форма показывается, при чем данные которые были в ней записаны, те и остаются.
Неправда. Смотря как ты показываешь форму. Если так:

// (в файле DPR надо закомментировать создание второй формы при создании приложения.
// создавать будет форму только тогда, когда она понадобится)
procedure TForm1.ShowSecondFormClick(Sender: TObject);
begin
with TForm2.Create(Self) do
begin
Show;
end;
end;
, то будут показаны не те данные, которые были записаны при предыдущем показе, а те, которыми форма инициализируется. Если у тебя при старте формы в Edit записывается "1", а ты руками на уже стартовавшей форме изменишь это значение на "2", и потом закроешь/откроешь форму - то там опять (неожиданно, правда?) будет "1".

А ты наверняка применяешь Close к той форме, которая инициализирована вместе с основной, при старте программы. Как же ты хочешь, чтоб она полноценно удалилась?

Автор: volvo 28.01.2011 0:01

P.S. А теперь - твой случай, то есть, когда ты пытаешься закрыть/открыть форму, созданную через Application/CreateForm. Посмотри внимательно на описание параметров в обработчике http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TForm_OnClose.html
Видишь там параметр Action? А чуть ниже:

Цитата
If a form is an SDI child form, Action defaults to caHide.
заметил? То есть, фактически, дочерняя форма просто скрывается, не закрываясь. Закрытие формы возложено на Application, в его деструкторе форма закроется. Именно поэтому у тебя сохраняются все введенные данные. Если создать форму динамически - к ней тоже будет применен caHide, но при повторном создании экземпляр класса формы будет другой, поэтому форма поведет себя более адекватно. Но это утечка, ибо деструктор Application знать ничего не знает о вновь созданной форме, и позаботиться о корректном закрытии ее (при завершении приложения) не может, надо в OnClose при динамическом создании выставлять Action := caFree...

Автор: buy zithromax without prescripti 26.09.2021 13:13

Viagra India Pharmacy

Автор: how long does it take for gabape 3.10.2021 0:48

levitra boutique

Автор: nishaknapp 16.01.2023 6:51

Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://trueonlinecbd.com/baccarat-4-things-people-should-know-about-this-game/