Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - MDI-Form und ClientHeight des Parent


nekropole - Di 13.01.04 11:43
Titel: MDI-Form und ClientHeight des Parent
Ich habe versucht, bei öffnen eines MDI-Child dessen Größe auf die ClientHeight des Hauptformulars zu setzen.

In der OnCreat-Ereignis des Child:

Delphi-Quelltext
1:
self.Height := Hauptform.ClientHeight                    


Das MDI-Child wird aber größer angezeigt (rd. 60 px), sodass es
in den unteren Bildrand ragt und Scroll-Leitsten angezeigt werden.
Nur wenn ich

Delphi-Quelltext
1:
self.Height := Hauptform.ClientWeight-56                    

code stimmt das Ergebnis. Sollte das nicht mit dem ersten Code erledigt sein? (Die Entwurfgröße im Objektinspektor ist wesentlicn kleiner als die tatsächlich erwünschte Erstellungsgröße.)

Wo liegt mein Denkfehler?

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


jaenicke - Di 13.01.04 12:02
Titel: Kann es sein?
Hallo!

Könnte es sein, dass Du im Hauptformular auch noch andere Komponenten hast?
Damit meine ich jetzt speziell ein Hauptmenü, Toolleisten, oder ähnliches. Diese werden in ClientHeight nämlich nicht ausgeschlossen. Mit ClientHeight erhälst Du nur die Höhe des Formulars minus die Titelleiste (ungefähr jedenfalls).

Das heißt: Wenn Du ein hauptmenü im hauptfenster hast, musst Du dessen Höhe von CLientHeight abziehen und die 60 Pixel sehen mir verdammt nach so etwas aus...

MfG,
S.J.


nekropole - Di 13.01.04 13:13

Ja, stimmt
ich habe eine Menüleiste, eine Buttonleiste und eine Statusleiste.

Ich erkenne schon den Denkfehler.

d.h. um die tatsächlich zur Verfügung stehende Höhe zu ermitteln, muß ich die Anwesenheit und die die Höhe dieser Komponenten ermitteln und die Summe von Hauptformular.ClientHight abziehen.

Äh -
wie kann ich grundsätzlich die Anwesenheit von Komponenten ermitteln?
Schließlich könnte ich ja noch die eine oder andere Leiste ein- oder ausblenden (grundsätzlich betrachtet).


jaenicke - Do 15.01.04 09:43
Titel: ???
Hallo!

Na ja, wenn Du die Leiste ausblendest, wird das ja wahrcheinlich mit ???.Visible:=False erfolgen. Und wenn Du dann die Höhe brauchst, kannst Du das folgendermaßen machen:

(Ich nehme hier mal an, dass eine Statusleiste stbStatus und eine Toolleiste pnlMain existiert.)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var ClientHoehe: Integer;
begin
  ClientHoehe:=Hauptform.ClientHeight
    -IfThen(stbStatus.Visible,stbStatus.Height,0)
    -IfThen(pnlMain.Visible,pnlMain.Height,0);
end;


Oder wie meintest Du das ausblenden sonst :?:

MfG,
S.J.


nekropole - Do 15.01.04 10:03

Ich meine das grundsätzlich.
Man kann ja im vorhineine nicht wissen, wann der User das Child öffnet.
Es können daher eine Leiste vorhanden sein, keine oder mehrere. Es könnten auch andere Childs vorhanden sein und ich möchte dem Child einen bestimmten Platz zuweisen und es nicht überdecken lassen.

In jedem Fall muß ich dem Child die richtige Höhe zuweisen und andere Forms verschieben, in der Größe ändern usw.

Es ist daher die Frage wie stelle ich fest was für Fenster und Komponenten im verwaltenden Hauptformular geöffnet/anwesend sind, damit ich entsprechend reagieren kann.

@Moderator
interessiert vielleicht auch andere, sollte der Tread getrennt werden?


jaenicke - Fr 16.01.04 11:15
Titel: Komponenten
Hallo!

Also, wenn Du alle Komponenten durchgehen willst, dann solltest Du folgendes benutzen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var i, Hoehe: Integer;
begin
  For i:=0 to Hauptform.ComponentCount-1 do begin
    If Hauptform.Component[i] is TToolBar then begin
      If (Hauptform.Component[i] as TToolBar).Visible then
        Inc(Hoehe,(Hauptform.Component[i] as TToolBar).Height);
    end Else If Hauptform.Component[i] is TStatusBar then begin
        Inc(Hoehe,(Hauptform.Component[i] as TStatusBar).Height);
    end;
  end;
end;

//oder heißt das Components statt Component ??? 
//Weiß ich jetzt gar nicht :oops:


Damit kannst Du alle auf dem Hauptformular vorhandenen Komponenten erreichen und falls sie sichtbar sind, die Höhe entsprechend vergrößern.

Für die Kindfenster:

Delphi-Quelltext
1:
2:
3:
4:
  For i:=0 to Hauptform.MDIChildCount-1 do begin
    If (Hauptform.MDIChildren[i] as Kindfenster).WindowState=wsMaximized then
    //Tu irgendwas
  end;


Das hier könnte auch noch nützlich sein:
http://www.delphi-forum.de/viewtopic.php?t=11486

MfG,
S.J.


nekropole - Fr 16.01.04 11:26

Ja, ich glaube das ist es was ich brauche.
Danke, für den Link.
Wenn es euch nicht gäbe, müsste man euch erfinden, was wäre ein Anfänger wie ich ohne euch.

Sollte sich meine Lösung wesentlich unterscheiden, werde ich diese posten.


nekropole - So 18.01.04 21:10

Passt,
nur um keine ScrollBars angezeigt zu bekommen, muss man trotzdem noch 3 Pixel von der Höhe abziehen.

Danke