![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить существование формы ?
smaller © (2007-03-27 14:58:00)Как программно спросить, существует ли форма, чтобы в случае ее несуществования не вызвать события EAccesViolation ?
Anatoly Podgoretsky (2007-03-28 23:56:00) [1]> clickmaker (27.03.2007 15:05:03) [3]
100 процентный вариант (гарантированый) есть - это screen.forms
Плохиш (2007-03-27 22:08:00) [2]
> Регистрируй формы при создании в глобальном списке и удаляй
> их из этого списка при уничтожении.
Это уже в генофонде реализовано.
Loginov Dmitry (2007-03-27 20:42:00) [3]Использование GUID-поля - надежная технология. Проверено :)
Leonid Troyanovsky (2007-03-27 20:38:00) [4]
> Loginov Dmitry © (27.03.07 20:23) [19]
> регистрация в списке (см [12]), а для своих классов можно
> предусмотреть GUID-поле (c) мой.
Предусмотрительность в смысле GUID, неотличима от
иных видов предусмотрительности, например, [2],
однако, также негарантирована.
--
Regards, LVT.
Loginov Dmitry (2007-03-27 20:23:00) [5]Надежные способы определение жизнеспособности объекта, которые мне известны:
регистрация в списке (см [12]), а для своих классов можно предусмотреть GUID-поле (c) мой.
В любом случае, работа с битой ссылкой уже обязана приводить к исключению.
Loginov Dmitry (2007-03-27 20:19:00) [6]> [17] RASkov (27.03.07 19:22)
Думаешь, обращение к Tag для несуществующей формы приведет к ошибке? Ошибаещся.
RASkov (2007-03-27 19:22:00) [7]Тупой способ :)
function ExistForm(Frm: TForm): Boolean;
begin
try
Result:=Frm.Tag=0; //или как нибудь по другому попытаться обратиться к свойствам формы...
Result:=True;
except Result:=False; end;
end;
Вобще таких вопросов не должно возникать если все правильно организовывать в программе....
evvcom (2007-03-27 18:28:00) [8]Ну с формой понятно, а если ж все ж объект иным может быть, то ответ [4] хорош уж больно :)
Leonid Troyanovsky (2007-03-27 18:23:00) [9]
> Loginov Dmitry © (27.03.07 16:00) [12]
> форма есть в списке, значит она существует. Можешь и не
> создавать своего списка. Все формы при создании регистрируются
> в Screen.Forms.
Не "можешь и не", а "и не надо".
Далее - по тексту.
--
Regards, LVT.
Loginov Dmitry (2007-03-27 16:11:00) [10]> Если серьезно, то вариантов этих вообще не должно быть,
> если кодировать правильно.
Варианты всегда есть. Просто о них уже не думаешь :)
Reindeer Moss Eater (2007-03-27 16:06:00) [11]В качестве одного из сотен вариантов:
Если серьезно, то вариантов этих вообще не должно быть, если кодировать правильно.
Loginov Dmitry (2007-03-27 16:00:00) [12]В качестве одного из сотен вариантов:
Регистрируй формы при создании в глобальном списке и удаляй их из этого списка при уничтожении. Соответственно, если форма есть в списке, значит она существует. Можешь и не создавать своего списка. Все формы при создании регистрируются в Screen.Forms.
niko_ (2007-03-27 16:00:00) [13]Reindeer Moss Eater © (27.03.07 15:46) [10]
Ну да, согласен - был не прав :(
Reindeer Moss Eater (2007-03-27 15:46:00) [14]Маленькая поправочка [6]:
form1 := TForm.Create(nil);
form2 := TForm.Create(nil);
form1.caption := 'Предвед';
form2.caption := 'Предвед';
form1.free;
form2 := nil;
niko_ (2007-03-27 15:37:00) [15]Маленькая поправочка [6]:
if Boolean(FindWindow('TForm', Форма.WindowText) then <существует>
Desdechado (2007-03-27 15:15:00) [16]Плохиш © (27.03.07 15:12) [7]
А может это уже и не форма вовсе...
Плохиш (2007-03-27 15:12:00) [17]
> clickmaker © (27.03.07 15:05) [3]
> Для полной гарантии форма должна убиваться FreeAndNil(Form)
Form := TForm.Create(nil);
Form2 := Form;
FreeAndNil(Form);
If Assigned(Form2) then ...
;-)
PS. EAccesViolation 100% гарантирует, что форма или её компонент не существует...
niko_ (2007-03-27 15:08:00) [18]if FindWindow('TForm', Форма.Caption) then <существует>
smaller (2007-03-27 15:08:00) [19]Благодарю за помощь, спасибо.
Desdechado (2007-03-27 15:05:00) [20]if( Application.MessageBox( 'Существует ли форма?', 'Дорогой юзер',
MB_YESNO or MB_ICONQUESTION or
nDefButton or MB_APPLMODAL ) = IDYES ) then
существует;