Страница 1 из 1
"Закрыть" форму в OnShow.
Добавлено: 19 июн 2009, 11:11
BBB
Коллеги, подскажите, возможно ли сделать так, чтобы обработчике формы OnShow запретить ее открытие (закрыть) при определенном условии.
Т.е. чтобы это вглядело так. Пользователь "жмет кнопку", по которой должна открыться данная форма. В момент ее открытия (в обработчике OnShow) проверяется некоторое условие, пользователю эта форма открывается и он с ней работает. Если условие не выполняется, то сообщение типа "Извините, сейчас нельзя" и пользователь "оказывается там, где был".
Пробовал ставить:
ModalResult := mrOk
но это нифига не срабатывало. Видимо, уже после вызова OnShow значение ModalResult обнуляется.
Заранее спасибо.
Re: "Закрыть" форму в OnShow.
Добавлено: 19 июн 2009, 13:13
Duncon
Конечно можно, условия уточни..
OnShow может несколько раз происходить за жизнь формы а может 1 раз тут вопрос в постановке задачи, лучше проверяться иными способами на Create, Paint, MAXIMIZE итд
Re: "Закрыть" форму в OnShow.
Добавлено: 19 июн 2009, 15:00
BBB
Duncon, ну а на OnCreate как? Кажется, на OnCreate я тоже пробовал, с тем же эффектом.
Вообще, проверка (с точки зрения пользователя) должна происходитт в момент попытки открыть форму. Вроде бы (не знаю, всегда или когда как) Delphi хитрит, и может СОЗДАВАТЬ форму один раз, а потом просто hide-ит ее и снова показывать.
Но в данном случае, насколько я понял, форма каждый раз создается. Так что, в данном случае, можно и на OnCreate, и на OnShow проверку делать.
(А Delphi тут, есть что,
аж 5-й версии

)
Re: "Закрыть" форму в OnShow.
Добавлено: 19 июн 2009, 17:22
Duncon
Ну а по нажатию на кнопку почему не проверить?
Re: "Закрыть" форму в OnShow.
Добавлено: 19 июн 2009, 17:53
BBB
Duncon, технически, конечно, можно. Но это не совсем красиво в смысле модульности. Т.е. тогда во "внешней" форме надо выполнять некие действия, связанные с функционалом запускаемой формы.
Re: "Закрыть" форму в OnShow.
Добавлено: 19 июн 2009, 21:14
somewhere
Можно попробовать
1) Перехватить WM_NCPAINT
Код: Выделить всё
TForm1 = class(TForm)
private
procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;
public
end;
var
Form1: TForm1;
SomeFlag : Boolean;
....
....
implementation
procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);
begin
If someflag then inherited else close;
end;
и таким образом риcовать если условие выполняется. Если нет - то не рисовать ничего и закрыться.
2) В обработчике OnShow сделать SendMessage(FormHandle,........, WM_CLOSE). Только я не помню когда вызывается OnShow - после прорисовки или до. Было бы удобнее если бы ивент назвали BeforeShow или AfterShow

Если до - то сообщение попадет в очередь перед WM_NCPAINT и WM_PAINT и окно не появится.
3) Попробовать (Sender as TForm).Visible := False; Эквивалент - метод Hide
Re: "Закрыть" форму в OnShow.
Добавлено: 24 сен 2009, 17:49
Dr_Grizzly
Есть еще простой вариант, бросаем на 2 форму таймер с интервалом 10мс и Enable=False, на обработчике пишем -
Timer1.enable:=false;
close;
В OnShow делаем нужную нам проверку, и если надо закрыть вторую форму, то просто запускам таймер. И все изумительно будет )))
Re: "Закрыть" форму в OnShow.
Добавлено: 24 сен 2009, 19:18
Newbie
Dr_Grizzly писал(а):
В OnShow делаем нужную нам проверку, и если надо закрыть вторую форму, то просто запускам таймер. И все изумительно будет )))
это пздц, а не изумительно...
Re: "Закрыть" форму в OnShow.
Добавлено: 25 сен 2009, 15:24
Игорь Акопян
некропостеры.

а уж если актуально, я бы конструктор перекрывал.
ну если конечно не требуется при смене фокуса приложения опять перепроверять...
Re: "Закрыть" форму в OnShow.
Добавлено: 25 сен 2009, 19:35
somewhere
А я бы перед открытием в обработчике нажатия на кнопку проверял