OpenDialog, SaveDialog.Excecute zawiesza program?

0

W moim programie czasem się zdarza, że wywołanie Execute na OpenDialog lub SaveDialog powoduje zawieszanie programu, a samo okno dialogowe się nie pokazuje.
Dzieje się tak zawsze, gdy zmieniam połączenie do bazy danych (główne okno jest otwarte, natomiast zamykam i otwieram okna potomne)
Mogę otwierać i zamykać ten dialog wiele razy, ale jak raz zmienię połączenie (czyli automatycznie zamknę wszystkie otwarte okna oprócz głównego) to już żaden dialog się nie otwiera.

Udało mi się ten problem obejść uruchamiając dialog z parametrem 0, czyli OpenDialog.Execute(0) i na razie chyba wszystko działa.
Ale proszę o wypowiedź czy ten parametr 0 to bezpieczny sposób?

1

Jaka wersja Delphi?
Parametr metody Execute jest uchwyt okna (0 to pulpit) jeżeli nie podasz parametru jest to Application.ActiveFormHandle w praktyce oznacza to, że być może w momencie wywołania okna jeszcze tak naprawdę się nie zdążą się do końca zamknąć i inne może być aktywne a to może być problem. Spróbuj jeżeli wywołujesz dialog z głównej formy wywołać go z parametrem Handle. Możesz też przed wywołaniem dialogu spróbować wywołać Application.ProcessMessages aby pozwolić na przetworzenie kolejki komunikatów (w celu zamknięcia okien i aktywowania głównego okna).

0

dialog wywołuję z okien potomnych (tych które zamykam automatycznie)
Próbowałem jako parametr wstawić Self.Handle i to nie pomogło
Sprawdzę jeszcze Application.ProcessMessages

0

Skoro wywołujesz go z okna które zamykasz to spróbuj wywołać z parametrem Application.MainFormHandle.

0

Niestety, ale Application.MainFormHandle też nie pomogło.

Dajecie mi różne rady jak wywołać ten dialog. Czy to znaczy że mam nie używać parametru 0? Czymś to grozi?
Bo na razie nie widzę z tym żadnego problemu.

1

Nie grozi niczym poza tym, że czasem dialog może (ale nie musi) otworzyć się pod aplikacją lub innym oknem, które będzie na wierzchu.
Swoją drogą ciekawe co tam wyprawiasz w kodzie skoro nic nie pomaga.

1

jak podał ci @kAzek wywołanie Execute bez parametru działa tak jakby parametrem było Application.ActiveFormHandle. Niestety jak się sam przekonujesz nie działa to idealnie, w końcu łapiesz uchwyt okna które właśnie zamykasz. Może się w tym czasie dziać dużo różnych rzeczy i taki uchwyt nie zostanie złapany, szczególnie gdy w grę wchodzą opcje bazodanowe lub ogólniej sieciowe. W takich sytuacjach nie wszystko jest zależne od twojego komputera, mogą być jakieś opóźnienia w sieci itp. itd.
Dlatego, znacznie lepiej jest zawsze wywoływać takie okno z konkretną ścieżką, ja robię tak zawsze. Lepiej, dobrze by było aby przed wywołaniem takiej ścieżki sprawdzić czy ona istnieje a jak nie istnieje to otwierać okno z jakąś domyślną istniejącą ścieżką (jakaś systemowa lub folder programu lub co tam chcesz). Szczególnie ma to znaczenie gdy próbujesz otworzyć folder sieciowy który nie istnieje, taka operacja może zdrowo przymrozić całą aplikację a nie jest to eleganckie rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1