Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизМастера почему не работает процедура Close. На onShow Найти похожие ветки
← →
Vt (2003-09-24 07:16) [0]я проверяю существование пароля через булевую переменную если
да то работаем, если нет то закрываю. Код ниже. Форма модальная.
Но Close не срабатывает, форма все равно открывается.
Подскажите что не так? Точку останова я ставил на Close до этого шага программа доходит.
procedure TForm1.FormShow(Sender: TObject);
begin
try
If not Pass Then
begin
MessageBeep(MB_ICONHAND);
Close;//Не срабатывает
end;
except
end;
end;
← →
Anatoly Podgoretsky (2003-09-24 07:45) [1]Не понятно логика, зачем показываешь, если показывать не собираешься?
Не делай этого и проблемы не будет.
← →
Vt (2003-09-24 08:02) [2]Я так и сделал, зачечем первый раз хотел на onShow
потому что окно запускается из разных мест программы и из разных форм, не хотелось увеличивать код.
Почему не срабатывает Close я так и не разобрался.
Предполагаю что идет какой либо конфликт между модальной формой
InputQuery куда вводится пароль и модальным окном которое хочу закрыть если пароль не верен.
← →
ЮЮ (2003-09-24 08:25) [3]Сначала вызови InputQuery а затем, если пароль верен, уже свою форму.
Да и постоянно спрашивать один и тот же пароль во время работы программы - это как-то "недружественно"
← →
Vt (2003-09-24 08:33) [4]>ЮЮ © (24.09.03 08:25) [3]
Сначала вызови InputQuery а затем, если пароль верен, уже свою форму.
А я так и делал, по другому нет смысла.
← →
Vt (2003-09-24 08:39) [5]Уточню "А я так и делал, по другому нет смысла."- это я поспешил написать, первый раз конечно делал не так, сейчас так и делаю но пропадает смысл сделать все одной процедурой на OnShow
← →
Dimka Maslov (2003-09-24 08:45) [6]Close не срабаытвает именно потому, что вызываешь его из OnShow. При вызове этого метода для формы устанавливается флаг, запрещающий её закрытие, что бы это ограничение обойти, надо вместо Close писать PostMessage(Handle, WM_CLOSE, 0, 0);
Но этот метод имеет недостатки, поскольку форма всё-таки сначала появится на экране, а потом сразу исчезнет. Чтобы избавиться и от этого, раз форма модальная, нужно написать процедуру, которая сначала будет проверяь пароль, а потом уже выводить модальную форму:
function ShowModalForm: Integer;
begin
Result := -1;
if not Pass then MessageBeep(MB_ICONHAND) else begin
with TForm1.Create(Application) do begin
try
Result := ShowModal;
finally
Free;
end;
end;
end;
end;
← →
Vt (2003-09-24 08:53) [7]>Dimka Maslov © (24.09.03 08:45) [6]
Реализацию я уже выполнил интересовало именно почему не закрывалась.
Спасибо за разъяснение данного вопроса.
← →
willys (2003-09-24 10:05) [8]можно вызвать Exception на OnShow. тогда форма не будет отображена. например так:
procedure TForm1.FormShow(Sender: TObject);
begin
if not Pass then
Abort; // "тихое" исключение
end;
← →
Alexander1966 (2003-09-24 10:23) [9]Используй:
Application.Terminate;
← →
Юрий Федоров (2003-09-24 10:36) [10]Совершенно верно, что логика неправильная - нужно сначала проверить, а потом показать. Но всеже если нужно закрыть форму в OnShow, достаточно отправить сообщение
PostMessage(Handle, WM_CLOSE, 0, 0);
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.015 c