Модераторы Равиль Зарипов (ZuBy) Опубликовано 17 сентября, 2015 Модераторы Поделиться Опубликовано 17 сентября, 2015 Доброго времени суток! Создание Application.CreateForm(TFormObject, FormObject); FormObject.Show; Уничтожение if Assigned(FormObject) then begin FormObject.Release; FormObject.DisposeOf; FormObject := nil; end; Вопрос, как при закрытии формы сделать уничтожение самой себя? TActionClose.caFree не предлагать, не работает правильно эта форма будет несколько раз создаваться и уничтожаться за время выполнения приложения (обязательное условие) Цитата Ссылка на комментарий
0 Модераторы Andrey Efimov Опубликовано 17 сентября, 2015 Модераторы Поделиться Опубликовано 17 сентября, 2015 (изменено) Альтернативный вариант: Скрываем форму. Перед тем как создать форму, проверяйте её на существование. Если существует, то удаляем и заново создаём. Например, вот так, с фреймами: procedure TForm1.Button1Click(Sender: TObject); begin if FFrame <> nil then begin FFrame.DisposeOf; FFrame := nil; end; FFrame := TFrame2.Create(Self); FFrame.Parent := Self; FFrame.Name := 'TFrame10'; FFrame.bCloseFrame.OnClick := FrameFreeAndNil; end; procedure TForm1.FrameFreeAndNil(Sender: TObject); begin FFrame.Visible := False; end; Изменено 17 сентября, 2015 пользователем Andrey Efimov Kitty 1 Цитата Ссылка на комментарий
0 FIL Опубликовано 17 сентября, 2015 Поделиться Опубликовано 17 сентября, 2015 TActionClose.caFree не предлагать, не работает правильно В каком смысле "не работает правильно"? Lem0nti 1 Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 17 сентября, 2015 Автор Модераторы Поделиться Опубликовано 17 сентября, 2015 Альтернативный вариант: Скрываем форму. Перед тем как создать форму, проверяйте её на существование. Если существует, то удаляем и заново создаём. Например, вот так, с фреймами:procedure TForm1.Button1Click(Sender: TObject); begin if FFrame <> nil then begin FFrame.DisposeOf; FFrame := nil; end; FFrame := TFrame2.Create(Self); FFrame.Parent := Self; FFrame.Name := 'TFrame10'; FFrame.bCloseFrame.OnClick := FrameFreeAndNil; end; procedure TForm1.FrameFreeAndNil(Sender: TObject); begin FFrame.Visible := False; end; Так и сделано, но не то что хочу. Нужно чтобы при закрытия формы, она сама удалилась. Ситуация: создаём форму, показываем, закрываем. И она весит в памяти, а хотелось бы чтобы она почистили за собой Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 17 сентября, 2015 Автор Модераторы Поделиться Опубликовано 17 сентября, 2015 TActionClose.caFree не предлагать, не работает правильно В каком смысле "не работает правильно"? В том что после такого метода форму заного нельзя создать. AV вылетает Цитата Ссылка на комментарий
0 FIL Опубликовано 17 сентября, 2015 Поделиться Опубликовано 17 сентября, 2015 У меня ничего не вылетает. Проверял на андроидэмуляторе. Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 17 сентября, 2015 Поделиться Опубликовано 17 сентября, 2015 Нужно чтобы при закрытия формы, она сама удалилась. Ситуация: создаём форму, показываем, закрываем. И она весит в памяти, а хотелось бы чтобы она почистили за собой сделайте свой менеджер окон, типа стэка, который следит за окнами и при закрытии уничтожает их! Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 18 сентября, 2015 Автор Модераторы Поделиться Опубликовано 18 сентября, 2015 Нужно чтобы при закрытия формы, она сама удалилась. Ситуация: создаём форму, показываем, закрываем. И она весит в памяти, а хотелось бы чтобы она почистили за собой сделайте свой менеджер окон, типа стэка, который следит за окнами и при закрытии уничтожает их! была идея, но как лучше. кто(что) будет проверять что форма закрыта и нужно её уничтожить. только не нужно предлагать таймер Цитата Ссылка на комментарий
0 krapotkin Опубликовано 18 сентября, 2015 Поделиться Опубликовано 18 сентября, 2015 не знаю, у меня формы с Action=caFree нормально убиваются то, что при этом не сразу вызывается деструктор, это описанное поведение но есть еще form.Release кроме того пытаюсь привыкнуть к созданию форм TMyForm.Create(NIL).Show; либо диалогов var f:TMyDialog; begin f:=TMyDialog.Create(NIL); f.showModal(procedure (AResult:TModalResult) begin case AResult of mrOK:begin end; end; end); FreeAndNil(F); end; Равиль Зарипов (ZuBy) и zairkz 2 Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 18 сентября, 2015 Администраторы Поделиться Опубликовано 18 сентября, 2015 Вообще Release. Он выполняет отложенное удаление формы через н-ое количество милисекунд. Поэтому по идеи: Вызываем Release, Очищаем ссылки на форму (обнуляем ваши переменные/поля, держащие форму) Ядерная комбинация: FormObject.Release; FormObject.DisposeOf; FormObject := nil; Форму удаляет, но Release в этом случае не нужен. Это код метода Release. if not (TFmxFormState.Released in FFormState) then begin FWinService.ReleaseWindow(Self); Screen.RemoveForm(Self); FFormState := FFormState + [TFmxFormState.Released]; if TFmxFormState.Engaged in FormState then begin if not (csDesigning in ComponentState) then FWinService.HideWindow(Self); end; inherited Release; TMessageManager.DefaultManager.SendMessage(Self, TFormReleasedMessage.Create); end; Равиль Зарипов (ZuBy) 1 Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 18 сентября, 2015 Автор Модераторы Поделиться Опубликовано 18 сентября, 2015 Вообще Release. Он выполняет отложенное удаление формы через н-ое количество милисекунд. Поэтому по идеи: Вызываем Release, Очищаем ссылки на форму (обнуляем ваши переменные/поля, держащие форму) Ядерная комбинация: FormObject.Release; FormObject.DisposeOf; FormObject := nil; Форму удаляет, но Release в этом случае не нужен. Это код метода Release. if not (TFmxFormState.Released in FFormState) then begin FWinService.ReleaseWindow(Self); Screen.RemoveForm(Self); FFormState := FFormState + [TFmxFormState.Released]; if TFmxFormState.Engaged in FormState then begin if not (csDesigning in ComponentState) then FWinService.HideWindow(Self); end; inherited Release; TMessageManager.DefaultManager.SendMessage(Self, TFormReleasedMessage.Create); end; могу ли я на OnClose формы вызвать Release самой формы? Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 18 сентября, 2015 Администраторы Поделиться Опубликовано 18 сентября, 2015 И еще код самого релиза на уровне TFmxObject: procedure TFmxObject.Release; begin if not (csDestroying in ComponentState) then begin if vPurgatory <> nil then begin Parent := nil; vPurgatory.Add(self); Include(FObjectState, CallingRelease); end else raise EInvalidOperation.CreateFMT(SNotInstance, ['TPurgatory']); if (Application <> nil) and (Action <> nil) then Application.UnregisterActionClient(Self); end; end; vPurgatory - это объект удаляющий объект по истечении определенного интервала времени. Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 18 сентября, 2015 Администраторы Поделиться Опубликовано 18 сентября, 2015 Да, можете вызывать Release. Кстати, caFree, как раз и вызывает Release. Так что я даже не знаю, если вы сказали, что этот вариант вам не подошел. OxyGen 1 Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 18 сентября, 2015 Автор Модераторы Поделиться Опубликовано 18 сентября, 2015 Да, можете вызывать Release. Кстати, caFree, как раз и вызывает Release. Так что я даже не знаю, если вы сказали, что этот вариант вам не подошел. на чистом проекте работает отлично caFree, а вот в рабочем AV ловлю. Проверю еще раз код. Спасибо за разъяснения! Цитата Ссылка на комментарий
0 Rusland Опубликовано 7 октября, 2015 Поделиться Опубликовано 7 октября, 2015 У меня схожая проблема, потому с вашего позволения спрошу здесь. Создал отдельно форму FormAdd (на ней кнопки OK, Cancel и Edit-ы). Из главного модуля убрал Application.CreateForm(TFormAdd, FormAdd); Пытаюсь ее вызвать так: with FormAdd.Create(self) do begin ShowModal( procedure( AResult: TModalResult) begin if (AResult = mrOK) then begin /// действия end; free; end ); и на первой же строке получаю Access Violation. Это я пока запускаю ее в Windows, а не под Android-ом. Как быть? Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 7 октября, 2015 Автор Модераторы Поделиться Опубликовано 7 октября, 2015 (изменено) У меня схожая проблема, потому с вашего позволения спрошу здесь. Создал отдельно форму FormAdd (на ней кнопки OK, Cancel и Edit-ы). Из главного модуля убрал Application.CreateForm(TFormAdd, FormAdd); Пытаюсь ее вызвать так: with FormAdd.Create(self) do begin ShowModal( procedure( AResult: TModalResult) begin if (AResult = mrOK) then begin /// действия end; free; end );и на первой же строке получаю Access Violation. Это я пока запускаю ее в Windows, а не под Android-ом. Как быть?TFormAdd.Create Изменено 7 октября, 2015 пользователем ZuBy Kitty, AngryOwl и Rusland 3 Цитата Ссылка на комментарий
0 Rusland Опубликовано 7 октября, 2015 Поделиться Опубликовано 7 октября, 2015 (изменено) ZuBy, спасибо большое PS. free заменил на Release; Изменено 7 октября, 2015 пользователем Rusland Цитата Ссылка на комментарий
Вопрос
Равиль Зарипов (ZuBy)
Доброго времени суток!
Создание
Уничтожение
Вопрос, как при закрытии формы сделать уничтожение самой себя?
TActionClose.caFree не предлагать, не работает правильно
эта форма будет несколько раз создаваться и уничтожаться за время выполнения приложения (обязательное условие)
Ссылка на комментарий
16 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.