Wyświetlenie okna modalnie po zakończeniu działania Application.Run

1
Mr.YaHooo napisał(a):

Z tego co wiem, to generalnie nie powinno się tworzyć oraz zwalniać obiektów systemowych. W prostych przypadkach może zadziałać, w przypadku bardziej skomplikowanych systemów nie wiadomo do końca co się wydarzy i mogą być różne dziwne błędy.

Według mnie, jeśli dany zabieg jest poprawny i przewidywalny, biorąc pod uwagę strukturę danego kodu i jego funkcjonalność, to mało istotne jest to, czy ktoś uważa to za sensowne czy nie.

W tym przypadku problem polega na tym, że zwolnienie i ponowne utworzenie klasy TApplication nie jest poprawne i przewidywalne, bo generuje wyjątki, więc nie należy tego robić. Nawet pomimo tego, że poza debuggerem przepływ sterowania jest jak najbardziej prawidłowy.

Problemem też jest to, że inne (choćby własne) obiekty mogą przechowywać referencję pierwotnej instancji lub referencje/wskaźniki na którekolwiek z jej elementów, więc po jej zwolnieniu przestaną być prawidłowe, co znów spowoduje SIGSEGV-y i randomowe wykrzaczanie.

Zatem skoro wystarczy taki zabieg, to rzeczywiście nie ma co kombinować za mocno. Tylko iść tym tropem.

Wystarczy, bo działa to prawidłowo i przewidywalnie, nie generuje wyjątków z tyłka i nie ma prawa wykrzaczyć innych obiektów. Jest jedno ale – do tej pory nikt mi nie napisał, że jest to w 100% bezpieczne, choć z moich dochodzeń wygląda, że tak.

Czuję się jakbym zdziwiał, a potrzebuję jedynie głównej kolejki komunikatów w więcej niż jednym miejscu.

0
furious programming napisał(a):

Według mnie, jeśli dany zabieg jest poprawny i przewidywalny, biorąc pod uwagę strukturę danego kodu i jego funkcjonalność, to mało istotne jest to, czy ktoś uważa to za sensowne czy nie.

Jaką masz pewność, że ponowne utworzenie jakiegoś obiektu jest poprawne bez wnikliwej analizy całego VCL'a? Na podstawie paru uruchomień prostego demo niestety nie mamy takiej pewności. I dlatego osobiście w kodzie produkcyjnym takich rzeczy nie daję.

furious programming napisał(a):

Wystarczy, bo działa to prawidłowo i przewidywalnie, nie generuje wyjątków z tyłka i nie ma prawa wykrzaczyć innych obiektów. Jest jedno ale – do tej pory nikt mi nie napisał, że jest to w 100% bezpieczne, choć z moich dochodzeń wygląda, że tak.

Dokładnie, jednak też w 100% nie da się tego przewidzieć czy gdzieś bokiem nie wylezie jakiś wyjątek. Żeby być w 100% pewnym trzeba by zanalizować źródła VCL i już.

0
Mr.YaHooo napisał(a):

Jaką masz pewność, że ponowne utworzenie jakiegoś obiektu jest poprawne bez wnikliwej analizy całego VCL'a?

Nie chodziło mi w tym momencie o TApplication, ale odpowiadając na powyższe – jeśli się nie upewnię, że coś będzie zawsze działać prawidłowo i przewidywalnie (oczywiście analizując źródła, bo jak inaczej?), to nie używam.

Dokładnie, jednak też w 100% nie da się tego przewidzieć czy gdzieś bokiem nie wylezie jakiś wyjątek.

Dlatego analiza to podstawa. Choć sam poszedłem na skróty i po prostu zapytałem deweloperów. :P

1

Ja bym zrobił tak:

var
   Msg: TMsg;
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  Form1.Free;

  Application.CreateForm(TForm2, Form2);
  Form2.Show;
  SetWindowPos(Form2.Handle, HWND_TOP, (Screen.Width - Form2.Width) div 2, (Screen.Height - Form2.Height) div 2, Form2.Width, Form2.Height, SWP_SHOWWINDOW); //wycentrowane

  while GetMessage(Msg, 0, 0, 0) do 
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
  Form2.Free;
end.
1

@marogo: interesuje mnie rozwiązanie cross-platformowe, dlatego WinAPI nie biorę pod uwagę. ;)

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