Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Как определить существование формы ?   Найти похожие ветки 

 
smaller   (2007-03-27 14:58) [0]

Как программно спросить, существует ли форма, чтобы в случае ее несуществования не вызвать события EAccesViolation ?


 
Elen ©   (2007-03-27 15:02) [1]

if Assigned(<Форма>) then  <существует>


 
Reindeer Moss Eater ©   (2007-03-27 15:03) [2]

if Assigned(<Форма>) then  <существует>

форма := TForm.Create(nil);
форма := nil;
if Assigned(<Форма>) then  ?


 
clickmaker ©   (2007-03-27 15:05) [3]


> smaller   (27.03.07 14:58)

100% варианта нет. Потому что, даже если Assigned(Form) вернет не nil - это не означает, что форма существует.
Для полной гарантии форма должна убиваться FreeAndNil(Form)


 
Desdechado ©   (2007-03-27 15:05) [4]

if( Application.MessageBox( "Существует ли форма?", "Дорогой юзер",
                                     MB_YESNO or MB_ICONQUESTION or
                                     nDefButton or MB_APPLMODAL ) = IDYES ) then
существует;


 
smaller   (2007-03-27 15:08) [5]

Благодарю за помощь, спасибо.


 
niko_ ©   (2007-03-27 15:08) [6]

if FindWindow("TForm", Форма.Caption) then <существует>


 
Плохиш ©   (2007-03-27 15:12) [7]


> clickmaker ©   (27.03.07 15:05) [3]
> Для полной гарантии форма должна убиваться FreeAndNil(Form)

Form := TForm.Create(nil);
Form2 := Form;
FreeAndNil(Form);
If Assigned(Form2) then ...

;-)

PS. EAccesViolation 100% гарантирует, что форма или её компонент не существует...


 
Desdechado ©   (2007-03-27 15:15) [8]

Плохиш ©   (27.03.07 15:12) [7]
А может это уже и не форма вовсе...


 
niko_ ©   (2007-03-27 15:37) [9]

Маленькая поправочка [6]:

if Boolean(FindWindow("TForm", Форма.WindowText) then <существует>


 
Reindeer Moss Eater ©   (2007-03-27 15:46) [10]

Маленькая поправочка [6]:

form1 := TForm.Create(nil);
form2 := TForm.Create(nil);
form1.caption := "Предвед";
form2.caption := "Предвед";

form1.free;
form2 := nil;


 
niko_ ©   (2007-03-27 16:00) [11]

Reindeer Moss Eater ©   (27.03.07 15:46) [10]

Ну да, согласен - был не прав :(


 
Loginov Dmitry ©   (2007-03-27 16:00) [12]

В качестве одного из сотен вариантов:

Регистрируй формы при создании в глобальном списке и удаляй их из этого списка при уничтожении. Соответственно, если форма есть в списке, значит она существует. Можешь и не создавать своего списка. Все формы при создании регистрируются в Screen.Forms.


 
Reindeer Moss Eater ©   (2007-03-27 16:06) [13]

В качестве одного из сотен вариантов:

Если серьезно, то вариантов этих вообще не должно быть, если кодировать правильно.


 
Loginov Dmitry ©   (2007-03-27 16:11) [14]

> Если серьезно, то вариантов этих вообще не должно быть,
> если кодировать правильно.


Варианты всегда есть. Просто о них уже не думаешь :)


 
Leonid Troyanovsky ©   (2007-03-27 18:23) [15]


> Loginov Dmitry ©   (27.03.07 16:00) [12]

> форма есть в списке, значит она существует. Можешь и не
> создавать своего списка. Все формы при создании регистрируются
> в Screen.Forms.

Не "можешь и не", а "и не надо".
Далее - по тексту.

--
Regards, LVT.


 
evvcom ©   (2007-03-27 18:28) [16]

Ну с формой понятно, а если ж все ж объект иным может быть, то ответ [4] хорош уж больно :)


 
RASkov   (2007-03-27 19:22) [17]

Тупой способ :)
function ExistForm(Frm: TForm): Boolean;
begin
 try
  Result:=Frm.Tag=0; //или как нибудь по другому попытаться обратиться к свойствам формы...
  Result:=True;
 except Result:=False; end;
end;

Вобще таких вопросов не должно возникать если все правильно организовывать в программе....


 
Loginov Dmitry ©   (2007-03-27 20:19) [18]

> [17] RASkov   (27.03.07 19:22)


Думаешь, обращение к Tag для несуществующей формы приведет к ошибке? Ошибаещся.


 
Loginov Dmitry ©   (2007-03-27 20:23) [19]

Надежные способы определение жизнеспособности объекта, которые мне известны:
регистрация в списке (см [12]), а для своих классов можно предусмотреть GUID-поле (c) мой.
В любом случае, работа с битой ссылкой уже обязана приводить к исключению.


 
Leonid Troyanovsky ©   (2007-03-27 20:38) [20]


> Loginov Dmitry ©   (27.03.07 20:23) [19]

> регистрация в списке (см [12]), а для своих классов можно
> предусмотреть GUID-поле (c) мой.

Предусмотрительность в смысле GUID, неотличима от
иных видов предусмотрительности, например, [2],
однако, также негарантирована.

--
Regards, LVT.


 
Loginov Dmitry ©   (2007-03-27 20:42) [21]

Использование GUID-поля - надежная технология. Проверено :)


 
Плохиш ©   (2007-03-27 22:08) [22]


> Регистрируй формы при создании в глобальном списке и удаляй
> их из этого списка при уничтожении.

Это уже в генофонде реализовано.


 
Anatoly Podgoretsky ©   (2007-03-28 23:56) [23]

> clickmaker  (27.03.2007 15:05:03)  [3]

100 процентный вариант (гарантированый) есть - это screen.forms



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.055 c
1-1171616348
_Mouse_
2007-02-16 11:59
2007.04.15
Подключение библиотеки к Pascal Scripts


2-1174889808
Megabyte
2007-03-26 10:16
2007.04.15
Отлов нужного исключения


9-1147104863
except 2.0
2006-05-08 20:14
2007.04.15
VCL окно во весь экран.


5-1151310743
georgius
2006-06-26 12:32
2007.04.15
Component has no parent window - отчего???


4-1163969418
Dmitry_177
2006-11-19 23:50
2007.04.15
Прозрачное STATIC-окно