Форум: "Начинающим";
Текущий архив: 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.044 c