Problem ze stylowaniem okna z ustawionym Parent na inne okno.

0

Sprawa jest bardzo prosta (przynajmniej w zakresie opisywania problemu, nie wiem, czy rozwiązanie też będzie także trywialne).

Kod wygląda następująco:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2:= TForm2.Create(Form1);
  //Form2.Parent:= Form1;
  Form2.Show;
end;  

Jeśli linia numer 4 jest zakomentowana, czyli nie wskazujemy rodzica, to Form2 nie jest ograniczona do obszaru okna Form1, ale jednocześnie jest tak samo ostylowane, jak Form1 - w sposób zgodny z wyglądem Windows 10.

screenshot-20191209185917.png

Jeśli jednak chcę "zamknąć" drugie okienko w pierwszym, to usuwam komentarz i wskazuję rodzica. Wtedy wprawdzie nie ma możliwości wyjechania przez Form2 poza obszar Form1, ale efektem ubocznym jest zmiana stylu okna-dziecka. Widać to na drugim screenie.
Próbowałem cwaniakować i podmienić wartość parent podczas działania, ale niczego to nie zmieniło. W chwili przełączania okienko na ułamek sekundy znika, a potem pojawia się już z nowym wyglądem.

Pytanie - czemu tak się dzieje i czy mogę coś z tym zrobić?

screenshot-20191209185958.png

1

IMO takiego czegoś nie powinieneś robić – do tworzenia okienek osadzonych służy przecież MDI. ;)

Nie wiem co jest problemem, ale za renderowanie obramowania i zawartości okien odpowiedzialne są mechanizmy systemowe, które wykorzystuje bieżący widgetset. Tak więc nie powinno być to problemem po stronie LCL, choć nie chce mi się wierzyć, że powłoka systemu jest tak skopana. Z drugiej strony, technologia MDI z tego co mi wiadomo została porzucona, więc Win10 może faktycznie go nie wspierać i takie cuda powodować.

0

No ale to tym bardziej się nie trzyma kupy - piszesz, że do tego powinno się korzystać z MDI, a potem że MDI jest wycofane :P

1

No bo tak to wygląda – MDI zostało zdeprecjonowane daaawno temu, ale że API jest wstecznie kompatybilne, to nadal można z niego korzystać. W Lazarusie możesz sobie stworzyć pełnoprawną aplikację MDI, ale na najnowszych systemach mogą i będą się pojawić problemy.

PS: zobacz na ten wątek – MDI window title in Windows 10 – ten sam problem, choć apka pisana w Delphi/VS.

0

To co się stosuje zamiast MDI w nowoczesnych aplikacjach?

0

Zakładki. ;)

0

Tego się obawiałem... A masz jakiś inny pomysł?

1

Innego sposobu system nie obsługuje, więc albo źle renderowane okna MDI, albo SDI, albo zakładki.


Ewentualnie możesz skorzystać z kontrolek grupujących (np. TPanel) do imitacji okien i renderować ich tło za pomocą metod obiektu ThemeServices, tak aby wyglądały jak osadzone okna. Możesz bez problemu malować zarówno obramowanie dla odpowiedniego stanu (aktywne lub nieaktywne), jak i przyciski widniejące na belce po prawej stronie.

Jednak sporo kodu będziesz musiał oprócz tego napisać, tak aby móc sobie takie niby-okienka organizować – przesuwać, maksymalizować, minimalizować, rozciągać, układać itd. Zastanów się czy warto.

0

No właśnie chciałem uniknąć samodzielnego rysowania, ale obawiam się, że na tym się skończy :(

0

Wbrew pozorom nie jest to trudne – po prostu trzeba napisać raptem tysiąc linijek kodu, czyli poświęcić dniówkę. ;)

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