Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - MDIChildren - Tile oder Maximized, Position aber wie Cascade


galagher - Sa 26.05.12 13:42
Titel: MDIChildren - Tile oder Maximized, Position aber wie Cascade
Hallo!

In meiner MDI-Anwendung erzeuge ich die MDIChildren wie folgt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
//...
var
  Form1: TForm1;
  aMDIChild: TForm;

//...

{Neues, leeres MDIChild erzeugen}
procedure TForm1.CreateMDIChild(const sHint: String; iTag: Integer);
begin
  {Form2 als solches wird nicht benötigt, enthält aber alle nötige Komponenten für die MDIChildren}
  aMDIChild := TForm2.Create(Self);

  if not bMaximized then
    aMDIChild.WindowState := wsNormal
  else
    aMDIChild.WindowState := wsMaximized;
//...

Das Problem ist optischer Natur: Bei Cascade sieht ja alles noch gut aus, aber bei Tile "blitzt" das neue MDIChild zuerst als Cascade an der entsprechenden Position auf, um danach per Tile entsprechend angeordnet zu werden. Das sieht man leider! Dieser Efefkt tritt auch bei jenen MDIChildren auf, die nicht aktiv sind und zB. per Next oder Previous zum ActiveMDIChild werden: Man sieht alle MDIChildren ganz kurz als Cascade, dann erst wie gewünscht, also Tile oder fsMaximized.

Egal, was ich mache, zB. FormStyle := fsMDIChild erst später, nach dem Create, zuweisen oder zuerst Visible := False, dann Visible := True - es nützt nichts. Man sieht immer zuerst Cascade.

Ich möchte eigentlich Folgendes:
1. Erzeuge ein neues (noch unsichtbares!) MDIChild.
2. Setze alle nötigen Einstellungen wie Tile oder wsMaximized.
3. Setze das neue MDIChild an die richtige Position und mache es dann erst sichtbar.

Zur Zeit ist es so, das es schon während des Creates sichtbar wird, was oben genannten Effekt hat.

:nixweiss:


jaenicke - Sa 26.05.12 14:27

Die alte MDI-Funktionalität wird eben schon ewig nicht mehr weiterentwickelt. Da gibt es einiges, das sich nicht sinnvoll machen lässt oder wo man tricksen muss.

Der von dir beschriebene Effekt lässt sich nicht gänzlich verhindern. Vor ein paar Jahren habe ich mit MDI-Fenstern mal experimentiert und habe es dann aufgrund vieler solcher Probleme ohne MDI gelöst. Das sah besser aus und ich hatte die ganzen Probleme nicht.

Am wenigsten sichtbar ist es, wenn du Visible beim Child im Objektinspektor auf False stellst (durch das Umstellen von FormStyle ist es automatisch auf True). Bei mir ist das Aufblitzen allerdings generell so gut wie gar nicht zu sehen. Ich habe gerade keinen alten PC hier um es mal da zu testen.


galagher - Sa 26.05.12 14:50

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die alte MDI-Funktionalität wird eben schon ewig nicht mehr weiterentwickelt.
Dachte ich mir, denn bei DelphiXE2 ist es immer noch genau so wie bei Delphi6.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Bei mir ist das Aufblitzen allerdings generell so gut wie gar nicht zu sehen. Ich habe gerade keinen alten PC hier um es mal da zu testen.
Na, so alt ist mein PC nun auch wieder nicht, höchstens so ca. 15 Jahre. :? Nein, ernsthaft, knapp 2 Jahre! Aber ich verstehe, was du meinst: Je schneller der PC (die Grafikkarte etc.), desto weniger der Effekt.

Danke! Ja, dein Tipp mit Visible bringt tatsächlich etwas.

Trotzdem - man sieht es.