"Закрыть" форму в OnShow.

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Коллеги, подскажите, возможно ли сделать так, чтобы обработчике формы OnShow запретить ее открытие (закрыть) при определенном условии.

Т.е. чтобы это вглядело так. Пользователь "жмет кнопку", по которой должна открыться данная форма. В момент ее открытия (в обработчике OnShow) проверяется некоторое условие, пользователю эта форма открывается и он с ней работает. Если условие не выполняется, то сообщение типа "Извините, сейчас нельзя" и пользователь "оказывается там, где был".

Пробовал ставить:
ModalResult := mrOk
но это нифига не срабатывало. Видимо, уже после вызова OnShow значение ModalResult обнуляется.

Заранее спасибо.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Конечно можно, условия уточни..

OnShow может несколько раз происходить за жизнь формы а может 1 раз тут вопрос в постановке задачи, лучше проверяться иными способами на Create, Paint, MAXIMIZE итд
[syntax=Delphi] [/syntax]
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Duncon, ну а на OnCreate как? Кажется, на OnCreate я тоже пробовал, с тем же эффектом.

Вообще, проверка (с точки зрения пользователя) должна происходитт в момент попытки открыть форму. Вроде бы (не знаю, всегда или когда как) Delphi хитрит, и может СОЗДАВАТЬ форму один раз, а потом просто hide-ит ее и снова показывать.
Но в данном случае, насколько я понял, форма каждый раз создается. Так что, в данном случае, можно и на OnCreate, и на OnShow проверку делать.
(А Delphi тут, есть что, аж 5-й версии :) )
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Ну а по нажатию на кнопку почему не проверить?
[syntax=Delphi] [/syntax]
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Duncon, технически, конечно, можно. Но это не совсем красиво в смысле модульности. Т.е. тогда во "внешней" форме надо выполнять некие действия, связанные с функционалом запускаемой формы.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Можно попробовать
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
It's a long way to the top if you wanna rock'n'roll
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Есть еще простой вариант, бросаем на 2 форму таймер с интервалом 10мс и Enable=False, на обработчике пишем -
Timer1.enable:=false;
close;
В OnShow делаем нужную нам проверку, и если надо закрыть вторую форму, то просто запускам таймер. И все изумительно будет )))
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Newbie
Сообщения: 148
Зарегистрирован: 06 сен 2009, 19:45

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

некропостеры. :)
а уж если актуально, я бы конструктор перекрывал.
ну если конечно не требуется при смене фокуса приложения опять перепроверять...
Изображение
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

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