"Закрыть" форму в OnShow.
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Коллеги, подскажите, возможно ли сделать так, чтобы обработчике формы OnShow запретить ее открытие (закрыть) при определенном условии.
Т.е. чтобы это вглядело так. Пользователь "жмет кнопку", по которой должна открыться данная форма. В момент ее открытия (в обработчике OnShow) проверяется некоторое условие, пользователю эта форма открывается и он с ней работает. Если условие не выполняется, то сообщение типа "Извините, сейчас нельзя" и пользователь "оказывается там, где был".
Пробовал ставить:
ModalResult := mrOk
но это нифига не срабатывало. Видимо, уже после вызова OnShow значение ModalResult обнуляется.
Заранее спасибо.
Т.е. чтобы это вглядело так. Пользователь "жмет кнопку", по которой должна открыться данная форма. В момент ее открытия (в обработчике OnShow) проверяется некоторое условие, пользователю эта форма открывается и он с ней работает. Если условие не выполняется, то сообщение типа "Извините, сейчас нельзя" и пользователь "оказывается там, где был".
Пробовал ставить:
ModalResult := mrOk
но это нифига не срабатывало. Видимо, уже после вызова OnShow значение ModalResult обнуляется.
Заранее спасибо.
Конечно можно, условия уточни..
OnShow может несколько раз происходить за жизнь формы а может 1 раз тут вопрос в постановке задачи, лучше проверяться иными способами на Create, Paint, MAXIMIZE итд
OnShow может несколько раз происходить за жизнь формы а может 1 раз тут вопрос в постановке задачи, лучше проверяться иными способами на Create, Paint, MAXIMIZE итд
[syntax=Delphi] [/syntax]
Duncon, ну а на OnCreate как? Кажется, на OnCreate я тоже пробовал, с тем же эффектом.
Вообще, проверка (с точки зрения пользователя) должна происходитт в момент попытки открыть форму. Вроде бы (не знаю, всегда или когда как) Delphi хитрит, и может СОЗДАВАТЬ форму один раз, а потом просто hide-ит ее и снова показывать.
Но в данном случае, насколько я понял, форма каждый раз создается. Так что, в данном случае, можно и на OnCreate, и на OnShow проверку делать.
(А Delphi тут, есть что, аж 5-й версии
)
Вообще, проверка (с точки зрения пользователя) должна происходитт в момент попытки открыть форму. Вроде бы (не знаю, всегда или когда как) Delphi хитрит, и может СОЗДАВАТЬ форму один раз, а потом просто hide-ит ее и снова показывать.
Но в данном случае, насколько я понял, форма каждый раз создается. Так что, в данном случае, можно и на OnCreate, и на OnShow проверку делать.
(А Delphi тут, есть что, аж 5-й версии

Ну а по нажатию на кнопку почему не проверить?
[syntax=Delphi] [/syntax]
Duncon, технически, конечно, можно. Но это не совсем красиво в смысле модульности. Т.е. тогда во "внешней" форме надо выполнять некие действия, связанные с функционалом запускаемой формы.
Можно попробовать
1) Перехватить WM_NCPAINT и таким образом риcовать если условие выполняется. Если нет - то не рисовать ничего и закрыться.
2) В обработчике OnShow сделать SendMessage(FormHandle,........, WM_CLOSE). Только я не помню когда вызывается OnShow - после прорисовки или до. Было бы удобнее если бы ивент назвали BeforeShow или AfterShow
Если до - то сообщение попадет в очередь перед WM_NCPAINT и WM_PAINT и окно не появится.
3) Попробовать (Sender as TForm).Visible := False; Эквивалент - метод Hide
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;
2) В обработчике OnShow сделать SendMessage(FormHandle,........, WM_CLOSE). Только я не помню когда вызывается OnShow - после прорисовки или до. Было бы удобнее если бы ивент назвали BeforeShow или AfterShow

3) Попробовать (Sender as TForm).Visible := False; Эквивалент - метод Hide
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 407
- Зарегистрирован: 13 сен 2004, 12:05
- Откуда: Курган
- Контактная информация:
Есть еще простой вариант, бросаем на 2 форму таймер с интервалом 10мс и Enable=False, на обработчике пишем -
Timer1.enable:=false;
close;
В OnShow делаем нужную нам проверку, и если надо закрыть вторую форму, то просто запускам таймер. И все изумительно будет )))
Timer1.enable:=false;
close;
В OnShow делаем нужную нам проверку, и если надо закрыть вторую форму, то просто запускам таймер. И все изумительно будет )))
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто!
Да! Кстати! Ctrl+V реально вставляет!!! ХDD

это пздц, а не изумительно...Dr_Grizzly писал(а): В OnShow делаем нужную нам проверку, и если надо закрыть вторую форму, то просто запускам таймер. И все изумительно будет )))
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
некропостеры. 
а уж если актуально, я бы конструктор перекрывал.
ну если конечно не требуется при смене фокуса приложения опять перепроверять...

а уж если актуально, я бы конструктор перекрывал.
ну если конечно не требуется при смене фокуса приложения опять перепроверять...

А я бы перед открытием в обработчике нажатия на кнопку проверял
It's a long way to the top if you wanna rock'n'roll