Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2014, 00:12   #1
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию Правильное закрытие формы

Всем доброго времени суток!

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

Подскажите, что я делаю не так (процеда, выполняемая по клику на первой форме:

Код:
procedure TForm11.sSpeedButton2Click(Sender: TObject);
begin
...
...
if (result=8) then begin
Form33.Image1.Picture.Create.LoadFromFile('greet/right.jpg');
Form33.sLabel1.Caption:='Вы набрали '+inttostr(result)+' баллов';
Form33.Caption:='Здорово! Вы молодец!';
Form33.sLabel1.Font.Color:=clWhite;
Form33.sLabel1.Left:=round((Form33.ClientWidth-Form33.sLabel1.Width)/2);
Form33.ShowModal;
end;
Close;
end;
Ошибка выскакивает в 20 процентах случаев после закрытия модальной формы.
Я предполагал, что до того, как модальную форму не закроют, событие Close в первой форме вызываться не будет. Но получается, что время от времени оно срабатывает неверно.

Как можно поступить более грамотно?)

Закрывать основную форму через команду в модальной - не очень приемлемо, потому что эта модальная форма вызывается еще также для 100 других форм. И вводить новую переменную для отлова того, из какой формы была вызвана модальная, а потом обрабатывать результат - не очень хочется, ибо очень много работы.
Интересный проект по изучению английского:
Английский в формате путешествия по США

Последний раз редактировалось Dennis777; 06.12.2014 в 00:19.
Dennis777 вне форума Ответить с цитированием
Старый 06.12.2014, 00:40   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Вместо Close вызывайте Form<номер_формы>.close
Вадим Мошев вне форума Ответить с цитированием
Старый 06.12.2014, 00:42   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

какая ошибка то выскакивает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.12.2014, 00:42   #4
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию

А ошибка, access violation чего то там. Сейчас попробую вызвать её еще разок.

Вадим Мошев, сейчас попробую. Но по идее ведь одно и то же должно быть? Просто ошибку эту специально трудно словить. Она каким-то рандомным образом появляется в определенные дни, потом не встречается неделю. А сегодня вот - 5 раз за день...
Интересный проект по изучению английского:
Английский в формате путешествия по США
Dennis777 вне форума Ответить с цитированием
Старый 06.12.2014, 01:20   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Но по идее ведь одно и то же должно быть?
Не думаю.
Что такое Close сам по себе - не интересовался никогда, а метод класса TForm с таким названием, который вызывается так: <переменная_класса_TForm>.close (например, form1.close), закрывает форму, от имени которой мы вызывали этот метод.
Вадим Мошев вне форума Ответить с цитированием
Старый 06.12.2014, 02:27   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

А где создание Form33.Create?
Access Violation выскакивает, если вы обращаетесь к чему-то несуществующему...
Так что вы не стесняйтесь, дайте весь текст procedure TForm11.sSpeedButton2Click(Sender: TObject);
kropotkina-alice вне форума Ответить с цитированием
Старый 06.12.2014, 16:02   #7
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А где создание Form33.Create?
Access Violation выскакивает, если вы обращаетесь к чему-то несуществующему...
Так что вы не стесняйтесь, дайте весь текст procedure TForm11.sSpeedButton2Click(Sender: TObject);
Кстати, ссылка по теме
http://www.delphi-manual.ru/lesson8.php
Вадим Мошев вне форума Ответить с цитированием
Старый 06.12.2014, 16:09   #8
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Кстати, ссылка по теме
http://www.delphi-manual.ru/lesson8.php
А при чём тут эти азы?
Вы полагаете, что все 33 формы (или сколько их там у ТС) создаются автоматически?
Тоды - "ой"...
kropotkina-alice вне форума Ответить с цитированием
Старый 04.01.2015, 15:11   #9
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию

Нет, формы создавались не автоматически. После закрытия удалялись, при открытии создавались. Но проблема, была таки в том, что вместо Form1.Close я писал просто Close.
Хотя для меня это странно, учитывая то, что с Клоз оно все равно закрывает спокойно. Разьве что в случае с модальной формой тупит иногда)
Интересный проект по изучению английского:
Английский в формате путешествия по США
Dennis777 вне форума Ответить с цитированием
Старый 05.01.2015, 08:36   #10
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Код:
Form33.Image1.Picture.Create.LoadFromFile('greet/right.jpg');
что-то тут лишнее
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 05.01.2015 в 08:39.
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
закрытие формы по escape - "правильное" решение и проблемы AnTe Общие вопросы Delphi 3 05.06.2014 08:13
Правильное уничтожение формы с веббраузером. Dennis777 Общие вопросы Delphi 1 21.03.2014 08:59
Правильное применение методов формы Shouldercannon Общие вопросы Delphi 5 15.10.2013 13:35
Закрытие формы Dennis777 Общие вопросы Delphi 5 20.06.2013 22:46
Правильное закрытие приложения в Delphi 7 Alex Cones Общие вопросы Delphi 5 18.04.2009 22:06