Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.008 c
2-1223446963
edk2
2008-10-08 10:22
2008.11.16
paradox отловить последние даты


15-1221640505
Slider007
2008-09-17 12:35
2008.11.16
С днем рождения ! 17 сентября 2008 среда


2-1223364754
renex
2008-10-07 11:32
2008.11.16
синхронизация времени с сервером datasnap


4-1200229460
Navi
2008-01-13 16:04
2008.11.16
Управление LPT - перевести код с VB на Delphi


2-1223026415
Развёртка
2008-10-03 13:33
2008.11.16
Развернуть досовское окноий экран программы на весь экран





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский