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

Вниз

Есть перемнная типа TForm   Найти похожие ветки 

 
Шурик Ш   (2005-10-25 10:41) [0]

В один прекрасный момент форма закрывается (MyForm.Close). Как в последствии по объекту MyForm понять, что форма закрыта, ведь MyForm <> nil?


 
Amoeba ©   (2005-10-25 10:50) [1]

Так присваивай переменной MyForm при закрытии этой формы (в OnDestroy) nil. В чем, собственно, трудность?


 
umbra ©   (2005-10-25 10:51) [2]


> MyForm <> nil


После MyForm.Close можно явно присвоить MyForm := nil


 
Шурик Ш   (2005-10-25 10:53) [3]

Точно!


 
jack128 ©   (2005-10-25 11:43) [4]

Amoeba ©   (25.10.05 10:50) [1]
Так присваивай переменной MyForm при закрытии этой формы (в OnDestroy) nil.


Закрытие формы и OnDestroy вещи друг с другом никак не связанные. Форма может быть уничтожена, но не закрыта, а может быть закрыта, но не уничтожена.

И потом, как с этой формой работать после закрытия если вы предлогаете обнилить ссылку на неё??  Я бы просто проверял свойство Visible формы


 
Amoeba ©   (2005-10-25 13:32) [5]


> jack128 ©   (25.10.05 11:43) [4]

Раз форма при закрытии не уничтожается - тогда присваивать nil в OnClose этой формы.


 
Leonid Troyanovsky ©   (2005-10-25 13:38) [6]


> Amoeba ©   (25.10.05 13:32) [5]
>
> > jack128 ©   (25.10.05 11:43) [4]
>
> Раз форма при закрытии не уничтожается - тогда присваивать
> nil в OnClose этой формы.


Тогда уж проще (да и правильнее) оную переменную вовсе не пользовать.

--
Regards, LVT.


 
Сайбель Алексей ©   (2005-10-25 14:43) [7]


> Как в последствии по объекту MyForm понять, что форма
> закрыта, ведь MyForm <> nil?

Если нужно только для понимания закрыта форма или нет,
то добавь поле Closed в Public своей формы.
При закрытии присваивай true, при открытии false.
И смотри:
If MyForm.Closed then
...


 
Джо ©   (2005-10-25 15:03) [8]


>  [7] Сайбель Алексей ©   (25.10.05 14:43)

Ой.


 
Сайбель Алексей ©   (2005-10-25 18:24) [9]


>Джо ©   (25.10.05 15:03) [8]
>>  [7] Сайбель Алексей ©   (25.10.05 14:43)
>> Ой.

Совсем "Ой"? =)
Т.е. для того чтобы понят, что форма закрыта, лучше

>umbra ©   (25.10.05 10:51) [2]
>> MyForm <> nil
> После MyForm.Close можно явно присвоить MyForm := nil

?


 
IceBeerg ©   (2005-10-25 18:48) [10]

А если что-то пипа Assigned(...,


 
msguns ©   (2005-10-25 18:52) [11]

>Сайбель Алексей ©   (25.10.05 14:43) [7]
>Если нужно только для понимания закрыта форма или нет,
то добавь поле Closed в Public своей формы.
При закрытии присваивай true, при открытии false.
И смотри:
If MyForm.Closed then

В Public КАКОЙ формы добавить это поле ? Если вызываемой, то что будет при обращении к этому полю из вызвавшей, если форма благополучно прибита ?
Если вызывающей, то что делать, если таких "дочерних" форм может быть несколько - для каждой "свою" Closed  ?


 
Сайбель Алексей ©   (2005-10-25 19:02) [12]

Как я понял условие задачи, есть некая форма MyForm.
И требуется понять, закрыта она или нет.
Ну не лучший же вариант - при закрытии присваивать ей значение nil? А потом проверять MyForm <> nil.


 
umbra ©   (2005-10-25 19:20) [13]


> Сайбель Алексей ©   (25.10.05 19:02) [12]


Я не вижу ничего плохого в явном присваивании переременной MyForm значения nil после закрытия, если не предполагается ее дальнейшего использования. Если я чего-то не вижу, скажите, где я не прав.


 
Сайбель Алексей ©   (2005-10-25 22:19) [14]

Да нет, все нормально, если действительно не предполагается ее дальнейшего использования.
А если в будущем она будет нужна, как оптимальней всего следить за ее статусом (открыта, закрыта)?

2 msguns ©  [11]
Имелся ввиду Public вызываемой формы.
В своей пограмме я реализовывал это именно так, соотв. не допуская обрщаения к этому полю формы, после ее "прибития".

Алгоритм не претендует на изящество и оптимальность. С удовольствием выслушаю вариант лучше.


 
Anatoly Podgoretsky ©   (2005-10-25 22:37) [15]

umbra ©   (25.10.05 19:20) [13]
Это не является критичным и при открытой форме, только вопрос, а нафиг нужна эта переменная?


 
wicked ©   (2005-10-25 22:49) [16]

> Шурик Ш   (25.10.05 10:41)

> В один прекрасный момент форма закрывается (MyForm.Close).
>  Как в последствии по объекту MyForm понять, что форма закрыта,
>  ведь MyForm <> nil?

if not MyForm.Visible then ;

остальное - от лукаваго.... ;)


 
Leonid Troyanovsky ©   (2005-10-26 08:47) [17]


> umbra ©   (25.10.05 19:20) [13]

> Я не вижу ничего плохого в явном присваивании переременной
> MyForm значения nil после закрытия, если не предполагается
> ее дальнейшего использования. Если я чего-то не вижу, скажите,
>  где я не прав.


А зачем, вообще, чего-то присваивать, если не предполагается
ее дальнейшее использование?

Если она одноразовая, то можно просто with TFormX.Create(..) do.
Если она существует на протяжении всей жизни приложения, то
найти форму можно (из любого места) в Screen.Forms/DataModules/...

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-10-26 09:18) [18]


> wicked ©   (25.10.05 22:49) [16]

> >  ведь MyForm <> nil?

> if not MyForm.Visible then ;


Не все так просто.
Если MyForm - глобальная переменная (как нам навязывает Борланд), то
она может быть разрушена из любого места. А, сл-но, первой проверкой д.б.
if Assigned(MyForm) then ..

Однако, вполне возможно, что в какой-то части кода форму разрушили не
путем FreeAndNil (MyForm), а, скажем, получив к.л. образом ссылку на нее,
например, FindControl(wnd).Free.
В подобных случаях, объектно-ориентированный подход предполагает, что
ссылки на форму, используемые заинтересованными формами, должны
обнуляться с помощью механизма Notification (override):

procedure TFormX.Notification (AComponent: TComponent; oper: TOperation);
begin
  inherited;
  if (AComponent = MyForm) {поле формы TFormZ} and
     (oper = opRemove) then
    MyForm := nil;
end;

а после получения ссылки MyForm необходимо ее зарегистрировать:
FreeNotification(MyForm).

Ну, и, в данном случае, if Assigned(MyForm), также, всегда идет первым.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-10-26 09:20) [19]


> Leonid Troyanovsky ©   (26.10.05 09:18) [18]

> procedure TFormX.Notification (AComponent: TComponent; oper:
..
>   if (AComponent = MyForm) {поле формы TFormZ} and


if (AComponent = MyForm) {поле формы TFormX},

sorry

--
Regards, LVT.


 
msguns ©   (2005-10-26 09:31) [20]

А вообще неплохо бы уточнить общую идею интерфейса. Если это MDI, то никаких переменных не требуется, все необходимые средства имеются у самой "мамки" (MDIChildren,MDIChildCount,ActiveMDIChild,...) Прочие же формы обычно создаются модально и прибиваются самим "инициатором" по схеме, указанной Леонидом в [17]

 whith TSecondForm.Create(nil) do
   begin
    ....
    ShowModal;
    ...
    Free;
   end;

Если же это SDI приложение, то "отслеживание" надо делать "ручками", используя опять же централизацию (в данном случае через класс TApplication)

Ни в коем случае нельзя обращаться к форме по имени MyForm.XXXX := .., т.к. это может работать только до тех пор, пока существует один и только один экземпляр класса TMyForm



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

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

Наверх





Память: 0.5 MB
Время: 0.054 c
9-1120178057
Strech
2005-07-01 04:34
2005.11.13
Edit в DirectX


9-1119735681
NewWonder
2005-06-26 01:41
2005.11.13
Сайт mirg.ru


14-1130224821
syte_ser78
2005-10-25 11:20
2005.11.13
програмирование сом/лпт


2-1130125812
SamProf
2005-10-24 07:50
2005.11.13
работа с БД без установки BDE


6-1122396939
Ильичев С.А.
2005-07-26 20:55
2005.11.13
WSACleanup





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский