![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по OnBeforeCreateWindow [Delphi, Windows]
Rusya © (2007-04-29 20:23:00)В программе нужно сделать несколько проверок перед тем, как содастся главное окно. Пробовал по OnBeforeCreate, примерно так:
procedure TForm1.KOLFormBeforeCreateWindow(Sender: PObj);
begin
if ( not FileExists( ParamStr(1) ) ) then
begin
MessageBox( Form.Handle, 'Файл не существует', 'Ошибка', MB_ICONEXCLAMATION);
Form.Close;
end;
end;
Все работает, но проблема в том, что перед тем как приложение завершится, главная форма все же успевает "мигнуть" (контур формы успевает прорисоваться, заголовок окна, и потом приложение благополучно завершается). Как побороть этот эффект, чтобы форма не "мигала"?
Rusya (2007-04-30 22:46:00) [1]
> Vladimir Kladov (30.04.07 22:13) [13]
> Почему это Form.Hide противоречит логике.
Результат логике не противоречит, просто конструкция вида
Form.Hide;
Form.Close;
вызывает, скажем,недоумение %) которое проходит после подробного ознакомления со всеми деталями.
С Halt - мигать не будет. Если
> для вас это нормально, то можно и Halt'ом.
Оставлю комбинацию Hide / Close - мне это больше нравится.
Vladimir Kladov (2007-04-30 22:13:00) [2]Почему это Form.Hide противоречит логике. Он просто указывает, что форма должна стать скрытой. А если дескриптор еще не выделен - то что она должна быть создана скрытой. Точно так же можно написать в design-time (если MCK), что форма Visible=false, и если /наоборот/ проверка прошла, то делать Show. А то, что форма все равно создается, так как же еще, так Form.Close работает. Этому методу нужен дескриптор окна, вот он и создается. С Halt - мигать не будет. Если для вас это нормально, то можно и Halt'ом.
Rusya (2007-04-30 20:34:00) [3]
> fellix (29.04.07 21:31) [2]
> { Project_1.inc This file is for you. Place here any code
> to run it just following Applet creation (if it present)
> but before creating other forms. E.g., You can place here
> <IF> statement, which prevents running of application in
> some cases. TIP: always use Applet for such checks and
> make it invisible until final decision if to run application
> or not. }
Да это пройденный этап. Конечно, можно закинуть проверку туда, но результат будет точно такой же, как и при использовании обработчика OnBeforeCreate: форма успеет мигнуть перед закрытием. Конечно, там тоже можно Hide для формы вызвать %)
Rusya (2007-04-30 20:31:00) [4]
> AndreyRus (30.04.07 19:46) [10]
> > Нет никаких косяков, все работает. И именно в таком виде.
> Я рад, но это противоречит логике.
Если подойти чисто формально - да, противоречит. Но кроме этого расхождения с логикой я не вижу других аргументов против %) Быстрое и кодоэкономичное решение, делающее именно то, что нужно было. Еще рз: несмотря на нелогичность алгоритма, он работает довольно быстро и так как надо %)
AndreyRus (2007-04-30 19:46:00) [5]
> Нет никаких косяков, все работает. И именно в таком виде.
Я рад, но это противоречит логике.
Rusya (2007-04-30 18:59:00) [6]
> AndreyRus (30.04.07 03:02) [8]
> > Form.Hide;> Form.Close;
> Косяк?
Нет никаких косяков, все работает. И именно в таком виде.
Здесь Hide спасает от мигания формы перед ее закрытием, а то форма успевает частично прорисоваться. Hide ее вовремя прячет, и потом она спокойно закрывается.
AndreyRus (2007-04-30 03:02:00) [7]
> Form.Hide;
> Form.Close;
Косяк?
Dmitry___ (2007-04-29 23:53:00) [8]Я рад, что помогло :)
Rusya (2007-04-29 22:52:00) [9]
> Dmitry___ (29.04.07 22:27) [4]
> А блин, точно, это ж на создании формы надо. Что-то я не
> в тему ляпнул...
Тем не менее, работает (форма не мигает, что и нужно было сделать):
procedure TForm1.KOLFormBeforeCreateWindow(Sender: PObj);
begin
if ( not FileExists( ParamStr(1) ) ) then
begin
MessageBox( Form.Handle, 'Файл не существует', 'Ошибка', MB_ICONEXCLAMATION);
Form.Hide;
Form.Close;
end;
end;
Rusya (2007-04-29 22:48:00) [10]Вариант с Hide оказался самым простым (его и оставил). Спасибо всем откликнувшимся за помощь и полезные советы.
Dmitry___ (2007-04-29 22:27:00) [11]А блин, точно, это ж на создании формы надо. Что-то я не в тему ляпнул...
Compiler (2007-04-29 21:51:00) [12]И еще вариант:
procedure KOLFormBeforeCreateWindow;
begin
if ( not FileExists( ParamStr(1) ) ) then
begin
MessageBox( 0, 'Файл не существует', 'Ошибка', MB_ICONEXCLAMATION);
Halt(0);
end;
end;
initialization
KOLFormBeforeCreateWindow;
Если файл не существует - выходим
fellix (2007-04-29 21:31:00) [13]{ Project_1.inc
This file is for you. Place here any code to run it
just following Applet creation (if it present) but
before creating other forms. E.g., You can place here
<IF> statement, which prevents running of application
in some cases. TIP: always use Applet for such checks
and make it invisible until final decision if to run
application or not. }
Dmitry___ (2007-04-29 21:01:00) [14].Hide?