![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Задача очень простая. При активизации формы проверяется некое условие. Если оно выполняется, то корректная работа формы невозможна, и её надо закрыть до устпанения причин.
Имеем текст программы Код:
procedure TF_AddValueParam.FormActivate(Sender: TObject); begin .... .... if n =0 then Close; .... .... end; Наверно все правильно. Только вот мне то что делать? |
|
#2
|
||||
|
||||
|
Application.Terminate
|
|
#3
|
|||
|
|||
|
Способ кардинальный. Закрывается программа, а не форма.
Дело в том, что вызываю и уничтожаю эту форму так: Код:
F_AddValueParam := TF_AddValueParam.Create(Self); F_AddValueParam.User := User; F_ValueList.Visible := False; F_AddValueParam.ShowModal; F_AddValueParam.Free; F_ValueList.Visible := True; |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
Мне надо выйти из формы, а выходит только из процедуры. В любой другой процедуре Close закрывает форму где бы он ни стоял. Exit завершает работу процедуры. В обработчике события OnActivate Close не хочет закрывать форму, просто выходит из процедуры. Форма, из которой надо выйти, создаётся динамически см. #3
Последний раз редактировалось VANNIK002, 09.07.2011 в 23:18. |
|
#6
|
||||
|
||||
|
1. Обязательно закрыть, спрятать недостаточно?
2. В каком контексте используется Close? Как привёл в примере, или имеется что то ещё? 3. Зачем вообще активизировать форму? Сделай проверку раньше. |
|
#7
|
|||
|
|||
|
Цитата:
1. Спрятал, а дальше что, Вернуться то в вызывающую форому всёравно надо. Мало того, хотелось бы через выход, а не через другое место. 2. В этом Unit два Close. Один почти один в один как в примере. Другой в обработчике события кнопки Выход. К кнопке Выход вопросов нет. 3. Зачем активизировать форму? Я не знаю как работать с не активизированной формой. Сделать проверку раньше конечно можно, но это повлечёт серьёзное усложнение и увеличение кода. Более - менее "нормальный" выход я нашел. Сделал на форме неактивным всё, кроме кнопки Выход. Работает, но смотреть противно. Проблема закрыта, вопрос остался. Почему с помощью функции Close не закрывается форма, и не происходит возврат в вызывающую форму. Неужели я первый, кто столкнулся с этой проблемой??? |
|
#8
|
|||
|
|||
|
Выйти из формы?
Код:
Form2.close; Серьёзное усложнение и увеличение кода? Код:
... if твоя_переменная = нужному_значению then Form2.show; ... |
|
#9
|
|||
|
|||
|
Я ЧАЙНИК но прежде, чем беспокоить занятых людей, читаю книги. У меня их много. Ваш вариант в одной из них описан и мной опробован....
Чтобы определить, можно ли работать с этой формой, делается запрос к базе данных. Прежде, чем сделать запрос, надо определиться с параметрами запроса. Если в запросе нет ни одной записи, то тогда не стоит открывать форму. |
|
#10
|
||||
|
||||
|
Цитата:
|
|
#11
|
|||
|
|||
|
Конечно, только из под одной кнопки пока открывается одна из трёх форм, в зависимости от положения курсора в наборе данных SQL запрса. Дальше будет больше.
Еще раз.... Как обойти возникшую проблему, я для себя решил. ОСТАЛСЯ ВОПРОС. ПОЧЕМУ НЕ РАБОТАЕТ CLOSE? Вот на какой вопрос я хочу получить ответ. |
|
#12
|
||||
|
||||
|
Цитата:
|
|
#13
|
|||
|
|||
|
Могу сбросить исходники вместе с базой данных любому, кто готов помочь разобраться в причинах такого поведения Close.Только скажите куда.
|
|
#14
|
||||
|
||||
|
|
|
#15
|
||||
|
||||
|
Цитата:
Код:
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;Код:
function TCustomForm.ShowModal: Integer;
var
WindowList: Pointer;
SaveFocusCount: Integer;
SaveCursor: TCursor;
SaveCount: Integer;
ActiveWindow: HWnd;
begin
CancelDrag;
...
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end; |