Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Как правильно удостовериться, что форма убита?   Найти похожие ветки 

 
Form   (2004-06-04 17:26) [0]

Например у меня есть
MyForm: TMyForm;

В процессе выполнения кода мне нужно узнать жива ли форма или убита.


 
Семен Сорокин ©   (2004-06-04 17:29) [1]

1. При уничтожении присваивай MyForm := nil;
и проверяй на Assigned()
2. Пробежаться по Screen.Forms


 
BFG9k   (2004-06-04 17:30) [2]

Точно форма ?  Может быть процесс ? С формой совсем просто :

if not Assigned(Form1) then
//форма убита

или

if Form1=nil then
//форма опять убита


 
Fay ©   (2004-06-04 17:33) [3]

2BFG9k   (04.06.04 17:30) [2]
var
 Form1, Form2 : TForm1;
begin
 Form1 := TForm1.Create(nil);
 Form2 := Form1;
 Form1 := nil;
 if not Form1 = nil then ShowMessage("Убита")
 else ShowMessage("Не убита");
 Form2.ShowModal;
end;


 
Form   (2004-06-04 17:47) [4]

То есть если я сделаю
Form1.Free
и не сделаю
Form1:= Nil,
то я не смогу точно проверить есть ли это форма или нет? (не вызывая эксепшен)


 
Fay ©   (2004-06-04 17:53) [5]

Совершенно верно


 
Anatoly Podgoretsky ©   (2004-06-04 18:14) [6]

Form   (04.06.04 17:47) [4]
Можешь - совет 2 Семен Сорокин ©   (04.06.04 17:29) [1]
При том это единственно гарантированый способ, в отличии от проверки по глобальной переменной и необходимостью эту переменную иметь.


 
BFG9k   (2004-06-07 12:34) [7]

procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;

... о чем это вы ?!

"...то я не смогу точно проверить есть ли это форма или нет? (не вызывая эксепшен)"  - пусть даже так , в этом нет ничего страшного  .его всегда можно отловить в защищенном блоке.


 
Snipers ©   (2004-06-07 12:52) [8]

С эксепшенами могут быть пролемы - реализовал определение убита или нет форма через обращение к Caption - заключил все в try except end. На одной машине выдает сообщение об ошибке - все работает, но окно раздражает. Пришлось переделать по способу присвоения nil"a ссылке в обработчике уничтожения.


 
evvcom ©   (2004-06-07 12:54) [9]


>  if Self <> nil then
>    Destroy;

Здесь Self, можно сказать, всегда будет не nil. Исключением будет если этот метод вызвать, используя ассемблер или манипуляции с TMethod. Поэтому этот пост, я считаю, совсем не в тему.


 
nejest   (2004-06-07 14:43) [10]

Может стоит передавать форме сообщение и проверять отреагировала она на него?
P.S. В форме, которую надо проверить, необходимо поставить обработку этого сообщения.


 
KSergey ©   (2004-06-07 14:57) [11]

> [10] nejest   (07.06.04 14:43)

А передать, простите, как?

> [7] BFG9k   (07.06.04 12:34)
> ... о чем это вы ?!

А вы? Я не мойму, что в этом коде вам не нравится и как он соотносится с темой? (к стати, это из какой дельфи такой код, интересно?)

> [7] BFG9k   (07.06.04 12:34)
> его всегда можно отловить в защищенном
> блоке.

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


 
nejest   (2004-06-07 15:43) [12]

2 KSergey ©   (07.06.04 14:57) [11]
>А передать, простите, как?
SendMessage


 
KSergey ©   (2004-06-08 06:45) [13]

> [12] nejest   (07.06.04 15:43)
> 2 KSergey ©   (07.06.04 14:57) [11]
> >А передать, простите, как?
> SendMessage

А хендл где возьмем?? frm.Handle? И что? Либо AV, либо вообще проканает, либо этот хендл может уже быть выдан другому окну в системе, еще фиг знает как оно прореагирует... Так что это то же, что пытаться обратиться к какому-либо св-ству в надежде словить AV. Бесперспективно, короче.


 
©   (2004-06-08 07:09) [14]

FindWindow(
Класс и имя окна можно знать точно


 
piople ©   (2004-06-08 07:14) [15]

Обсалютно согласен с <R>!
Просто поискать хэндл данного окна, если окно есть, то найдет иначе нет.


 
KSergey ©   (2004-06-08 07:16) [16]

> [15] piople ©   (08.06.04 07:14)
> Обсалютно согласен с <R>!

Да, вариант хорош
Однако не отличается от ранее озвученного Пробежаться по Screen.Forms


 
piople ©   (2004-06-08 07:19) [17]


> KSergey

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

З.Ы. Риторический вопрос!!!


 
KSergey ©   (2004-06-08 07:26) [18]

> piople ©   (08.06.04 07:19)

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


 
piople ©   (2004-06-08 07:35) [19]


> KSergey


Вот именно!!!!! На кой тебе самому все писать если за тебя все сделает Дэлфи?????


 
KSergey ©   (2004-06-08 08:33) [20]

> [19] piople ©   (08.06.04 07:35)

Ну не дельфи... Ну да это детали



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

Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.047 c
14-1086176313
Gero
2004-06-02 15:38
2004.06.20
Баннер


1-1086258035
nitro
2004-06-03 14:20
2004.06.20
Сохранение в файл jpg все что находится в Groupbox ?


1-1086590783
Alexxx
2004-06-07 10:46
2004.06.20
Stringgrid (выравнивание в ячейке)


1-1086759000
Иван1
2004-06-09 09:30
2004.06.20
Как избавиться от звука при нажатии Enter в Edt1 ?


14-1086262861
Li_
2004-06-03 15:41
2004.06.20
как сделать Дельфи-сайт ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский