Problem z oknem modalnym

0

Witam, jest mały problem w aplikacji wywołuję z głównej formy drugie okno modalnie

Form2.ShowModal

problem polega na tym iż w winXP okno pojawia się normalnie ponad oknem głównym, ale testując aplikacje na win98 to samo okno pojawia się pod główną formą i w żaden cudowny sposób nie ma ono zamiaru wyskoczyć ponad :|

0

Spróbuj w OnShow tej formy dać

Form2.BringToFront;
0

jak tworzysz Form2? (pokaż linijkę, gdzie masz Form2 := TCos.Create(...))

0
var
  MyOkno : TOkno1;
begin
  MyOkno := TOkno1.Create(self);
  MyOkno.ShowModal();
  MyOkno.Free();
end;
0

Okno wywołuję metodą

  UzupelnianieDanychFrm.ShowModal;

dodatkowo z domyślnych ustawieniach okna w OI zmieniłem:

BorderStyle := bsSizeToolWin;
Position := poScreenCenter;

w OnShow okna wywołuję

  QueryZamknieciowy.Open;
  QueryPodstawowe.Parameters.ParamByName('rok').Value := Rok;
  QueryPodstawowe.Open;
  PageControl.TabIndex := 0;
  PrevBtn.Enabled := False;
  NextBtn.Enabled := True;
  idLbl.Visible := DaneOperatora.ID in [1,2];


Niestety MainFrm.SendToBack;
ani UzupelnianieDanychFrm.BringToFront;

nie chce zadziałać pod Win98
rozkładam ręce [???]

0
Misiekd napisał(a)

jak tworzysz Form2? (pokaż linijkę, gdzie masz Form2 := TCos.Create(...))

Linijka kreująca okno jest wywoływana standardowo przy uruchamianiu aplikacji

  
...
UzupelnianieDanych in 'UzupelnianieDanych.pas' {UzupelnianieDanychFrm},
...
Application.CreateForm(TUzupelnianieDanych , UzupelnianieDanychFrm);
...
0

a dlaczego nie wtedy, kidy jest potrzebne?

0

Lepiej stwórz te okienko dynamicznie.

0

niestety tak jak myślałem, moment tworzenia okna nie ma znaczenie również, wykonałem to w sposób podobny jak podał to XML

UzupelnianieDanychFrm := TUzupelnianieDanych.Create(Self);
try
  UzupelnianieDanychFrm.ShowModal;
finally
  UzupelnianieDanychFrm.Free;
end;

i również nie pokazuje się nad główną formą :(

główna forma standardowo ma ustawione FormStyle := fsNormal więc modal powinien działac również na win98 tak jak ładnie to działa pod winXP

0

[???] No to nie wiem może masz ustawiony jakiś prametr okna głównego żeby było zawsze na wierzchu.
;-P A przebudowałeś cały projekt?? Bo często jak nie wiadomo o co chodzi to okazuje się że o nic :-D

0

przebudowa całego projektu nic nie da, nie bardzo mam ochotę z ponad 50 formami walczyć :/

może do rozwiązania tego problemu, będzie dobre jakieś wywołanie WinAPI, używałem takiego

SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, 0);

ale on wywalał okno zupełnie ponad wszystko co jest otwarte, hmm spróbuje jeszcze czegoś takiego

SetWindowPos(Handle, HWND_TOP, Left, Top, Width, Height, 0);

odpowiedz dam niebawem ...

0

Niestety, jestem załamany nie zadziałało również to
Tymczasowo zostawię

SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, 0);

ale to rozwiązanie mi sie nie podoba, temat zostawiam otwarty czekam na propozycje dzięki

0

a ustaw dla okna głównego parametr HWND_NOTOPMOST a dla tego "modla" zostaw tak jak masz HWND_TOPMOST

0

ok udało się :D

  SetWindowPos(MainFrm.Handle, HWND_NOTOPMOST, MainFrm.Left, MainFrm.Top, MainFrm.Width, MainFrm.Height, 0);

choć wydaje mi się dalej to nie eleganckie. Niestety przy OnShow głównej formy to nie działa, dopiero kiedy otwieram Okno modalne i wywołanie tej procedurki powoduje pożądany efekt, najważniejsze by mi użyszkodnicy nie dzwonili, że pracować nie mogą w jakimś pcimiu dolnym gdzie maja Win98 ...

hmm poszperałem troszkę na 4progremmers i zrobiłem funkcję wykrywajacą rodzaj systemu op

function SystemOp: Integer;
var
   osInfo : _OSVERSIONINFOA;
   checkOK : LongBool;
begin
     osInfo.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
     checkOK := GetVersionEx(osInfo);
     if (checkOK) then
        Result := osInfo.dwMajorVersion
     else
        Result := -1;
end;

zwracane wartości to
3 dla win3.51
4 rodzina 9x w tym NT4
5 dla nowszych sys win 2k, XP i 2k3
-1 dla nieokreślonego

i używam ta funkcję w takiej kombinacji

  if SystemOp=4 then
    SetWindowPos(MainFrm.Handle, HWND_NOTOPMOST, MainFrm.Left, MainFrm.Top, MainFrm.Width, MainFrm.Height, 0);

dzięki hmm za pomoc z tego wszystkiego zapomniało mi sie myśleć w drugim kierunku schowania głównej formy, jak widzisz wystarczyło tylko główną formę schować nie jest konieczne dodatkowego pokazywania formy nad już schowaną pod.

Dzięki wszystkim za pomoc temat uważam za skończony :-)

0

Problem stary jak ... Win98 :) Gdzieś kiedyś obiło mi się o ucho o jakimś unicie co miał to poprawione - ale nie pamiętam. Można pogooglować, temat jak mówie wałkowany wiele razy. Kiedyś miałem podobny problem także z okienkami dialogowymi, z tego co pamiętam, to pomogło (ale tylko na 98SE albo bez SE) ustawianie uchwytu (przekazywanego do procki MessageBox) ręcznie - tj uzyskanego z Screen.ActiveForm.Handle.

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