Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.16;
Скачать: CL | DM;

Вниз

Не закрывается форма   Найти похожие ветки 

 
ANB   (2008-10-06 13:44) [0]

В OnShow главной формы модально показываю диалог ввода параметров подключения к БД. Потом коннекчусь, диалог закрывается, показывается главная форма.

Все вроде бы нормально, вот только если коннект идет долго, и при этом пощелкать по другим окна (почитать форум, например :)), то после поднятия главной формы, диалог все равно остается. Причем как то странно остается - его ничем не закрыть.

Если запускать приложение из под делфи, то такого эффекта нету. Что ни делай.

Как бы побороть эту проблему ?


 
Поросенок Винни-Пух ©   (2008-10-06 13:56) [1]

в онкреате главной послать сообщение ей же самой.
в обработчике открыть диалог.
если кансел, то закрыть главную. если нет, то инициализировать все что с бд связано


 
ASoft   (2008-10-06 13:56) [2]


> ANB   (06.10.08 13:44)  

Если модальный диалог свой, то, имхо, лучше:

Создать форму
try
показать форму
...
finally
закрыть/убить форму
end;


 
Сергей М. ©   (2008-10-06 14:00) [3]

Как бы там ни было, обработчик OnShow, мягко говоря, - не лучшее место для реализации подобного рода логики.


 
ANB   (2008-10-06 14:03) [4]


> ASoft   (06.10.08 13:56) [2]

Приложение - простенькое, там всего 2 формы.
Лениво было создавать модальную форму динамически. Сейчас попробую - по идее Фри должно помочь.


 
ANB   (2008-10-06 14:09) [5]


> обработчик OnShow

Да нормальное место. Всегда так делал.
А с модальными формами в делфи регулярно бывают проблемы. Даже ShowMessage иногда клинит.


 
{RASkov} ©   (2008-10-06 14:22) [6]

> [4] ANB   (06.10.08 14:03)
> Лениво было создавать модальную форму динамически.

Скажи что это так ты шутишь) Или ты программы одной только мышкой пишешь?
:)


 
ANB   (2008-10-06 14:25) [7]


> Скажи что это так ты шутишь) Или ты программы одной только
> мышкой пишешь?
> :)

Смотря какие.
Если мне за час надо накидать утилитку, которая нужна только мне, то зачем заморачиваться с динамическим созданием форм ?

Хуже, если кому нибудь утилита понравится и она идет в серию. Приходится причесывать :)

Фрии помог.


 
{RASkov} ©   (2008-10-06 14:33) [8]

Как все запущено :(:)


 
ANB   (2008-10-06 14:56) [9]


> {RASkov} ©   (06.10.08 14:33) [8]
> Как все запущено :(:)

Почему ?


 
Сергей М. ©   (2008-10-06 14:58) [10]


> Всегда так делал


Ну и плохо.


 
ANB   (2008-10-06 15:13) [11]


> Ну и плохо.

Чем ?


 
Palladin ©   (2008-10-06 15:16) [12]

OnActivate - куда лучше подходит для этого


 
ANB   (2008-10-06 15:42) [13]


> Palladin ©   (06.10.08 15:16) [12]
> OnActivate - куда лучше подходит для этого

Не, мне не надо, чтобы главная форма при этом сзади торчала.


 
Palladin ©   (2008-10-06 15:47) [14]

угадай, что раньше вызывается OnShow или OnActivate ?
а лучше не гадать, а посмотреть в справке порядок возбуждения событий у формы


 
ANB   (2008-10-06 16:04) [15]


> угадай, что раньше вызывается OnShow или OnActivate ?

И так видно - OnShow - до рисования формы, OnActivate - после рисования формы.


 
Palladin ©   (2008-10-06 16:06) [16]


> мне не надо

извиняюсь, не пропустил )
тогда OnCreate?


 
ANB   (2008-10-06 16:20) [17]


> тогда OnCreate?

На OnCreate иногда грабли возникают. Особенно, если пользовать FormStorage от RX.

Да нету особых проблем. А с модальными формами в делфи вообще беда. Причем не только в моих программах. Клинит их время от времени, если приложение работает в фоновом режиме.


 
{RASkov} ©   (2008-10-06 17:38) [18]

> [9] ANB   (06.10.08 14:56)
> Почему ?

Потому что если все делать сразу по умному, то и переделывать не придется....
Собсно "Всё запущенно" не только из-за переделывания "понравившихся утилит", а, например, "динамически создаваемая форма" отличается от НЕ динамически - одной строкой кода.... А мыж ленивые аж до не хочу)
:о)


 
clickmaker ©   (2008-10-06 17:41) [19]

if TLoginForm.Execute then
 Application.Run;


 
Anatoly Podgoretsky ©   (2008-10-06 19:18) [20]


> OnActivate - куда лучше подходит для этого

Оба плохи, поскольку оба обработчика могут вызываться несколько раз, тогда надо или вводить флаг или перенести подготовку в другое место, или он Create или после OnActivate, когда все начальные обработчики уже отработали. Ну и остается вариант мириться с возможным повторным вызовом обработчика.


 
Palladin ©   (2008-10-07 07:37) [21]


> Ну и остается вариант мириться с возможным повторным вызовом
> обработчика.

а никто и не спорит. мирюсь и завожу флаг.


 
ANB   (2008-10-07 13:58) [22]


> НЕ динамически - одной строкой кода.... А мыж ленивые аж
> до не хочу)

Минимум 6.
var Form1 :
create;
try
finally
 Free;
end;
:)
Если бы не глюк с незакрыванием формы, автосозданная вообще бы никак не мешала. Что в ней плохого то ?


 
ANB   (2008-10-07 14:01) [23]


> поскольку оба обработчика могут вызываться несколько раз

OnShow главной формы как второй раз то может вызваться ? Ни разу не нарывался.
OnActivate - очень даже может быть. Но смоделировать ситуацию мне не удалось.

Application.Run - не люблю без лишней надобности лезть в DPR.


 
{RASkov} ©   (2008-10-07 21:03) [24]

> [9] ANB   (06.10.08 14:56)
>
> > {RASkov} ©   (06.10.08 14:33) [8]
> > Как все запущено :(:)
>
> Почему ?

Ответ:

> OnShow главной формы как второй раз то может вызваться ?
> Ни разу не нарывался.
> OnActivate - очень даже может быть. Но смоделировать ситуацию
> мне не удалось.
>
> Application.Run - не люблю без лишней надобности лезть в DPR.

:)


 
{RASkov} ©   (2008-10-07 21:13) [25]

> [23] ANB   (07.10.08 14:01)
> OnShow главной формы как второй раз то может вызваться ?
> Ни разу не нарывался.

procedure TForm1.FormShow(Sender: TObject);
begin
 ShowMessage("Show");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if FormStyle=fsStayOnTop then FormStyle:=fsNormal
  else FormStyle:=fsStayOnTop;
end;



> OnActivate - очень даже может быть. Но смоделировать ситуацию
> мне не удалось.

procedure TForm1.FormActivate(Sender: TObject);
begin
 ShowMessage("Activate");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//Специально так сделал, но суть не изменилась.....
 with TForm.Create(nil) do try
  Show;
 finally
  Free;
 end;
end;

Элементарно..... и твоя ламерская отмазка :) Сорри, ...ну так вот)


 
{RASkov} ©   (2008-10-07 21:14) [26]

И конечно же нужно понимать, что в [25] это не единственные случаи...)


 
{RASkov} ©   (2008-10-07 23:53) [27]

И даже на это:
> Application.Run - не люблю без лишней надобности лезть в DPR.

у меня есть ответ. Вот: Именно нечто подобное как в [19], самое то для решения задачи затронутой в вопросе....
А без лишней надобности и программу-то писать не нужно....
:о)


 
Германн ©   (2008-10-08 00:41) [28]


> {RASkov} ©   (07.10.08 23:53) [27]

Даже в примерах поставляемых вместе с Дельфи есть именно такой вариант и именно для подобной задачи:
%DELPHI%\Demos\Db\MastApp\mastapp.dpr


 
ANB   (2008-10-08 09:49) [29]


> {RASkov} ©   (07.10.08 21:13) [25]

OnActivate и не пользуюсь.

А если понадобиться переключать режим отображения главной формы - тогда и буду в DPR лезть.

:)

ЗЫ. В самой программе всего 50 строк написанных мной. Типичная кнопкокидательная програмка. Ну зачем в ней использовать все тонкости ?


 
MsGuns ©   (2008-10-08 11:05) [30]

>ANB   (06.10.08 14:03) [4]
>Лениво было создавать модальную форму динамически.

Такое впечатление, что ты создаешь формы лопатой и вилами :)



Страницы: 1 вся ветка

Текущий архив: 2008.11.16;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.015 c
2-1223490086
AlexDan
2008-10-08 22:21
2008.11.16
Системный реестр..


15-1221766269
Riply
2008-09-18 23:31
2008.11.16
Генерация собственного ControlCode - кода.


2-1223410802
tubik
2008-10-08 00:20
2008.11.16
Точка входа в программу


15-1221641107
pushkin42
2008-09-17 12:45
2008.11.16
Вопрос по развертыванию


11-1195632501
dima27
2007-11-21 11:08
2008.11.16
KOL+WINCE+БД