Höhe des MainMenü stimmt nicht

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
HobbyProgrammer
Beiträge: 66
Registriert: Di 29. Okt 2019, 12:51
OS, Lazarus, FPC: Host: Debian Buster 64bit, VM Ubuntu 18.04 64bit , Lazarus 2.0.10 , Fpc 3.2.0
CPU-Target: Core i7-9750H
Wohnort: Deutschland , Baden-Württemberg

Höhe des MainMenü stimmt nicht

Beitrag von HobbyProgrammer »

Hallo zusammen und noch einen schönen Ostermontag,

ich habe ein kleines Problem mit der Größeneinstellung des MainWindow meines Z180SoftSystems.
Ich lege mit Constraints die Höhe und Breite des Fensters in Abhängigkeit der Größe des Terminal Displays fest.
Mit Constraints deshalb, da ich ein Fester haben möchte welches sich in der Größe nicht mit der Maus verändern lassen soll. Dazu verwende ich im OnShow Event des MainWindow folgenden Code:

Code: Alles auswählen

procedure TMainWindow.FormShow(Sender: TObject);
var
    size: TSize;
begin
    ...

    SystemTerminal := TSystemTerminal.Create(panelSystemTerminal, False);
    
    ...

    size := SystemTerminal.getDisplaySize;
    
    Constraints.MinWidth := size.Width;
    Constraints.MinHeight := size.Height + panelButtons.Height + statusbarMainWindow.Height + menuMainWindow.Height;
    Constraints.MaxWidth := Constraints.MinWidth;
    Constraints.MaxHeight := Constraints.MinHeight;
    ...
    
end;
Unter Windows funktioniert das wunderbar, allerdings stimmt die Höhe der Abfrage 'menuMainWindow.Height' unter Linux nicht mit der Tatsächlichen Höhe des MainMenu überein. Das Fenster wird Höher gemacht als es sein sollte und das ergibt unterhalb des Terminal Display einen dicken Rand bis dann die Statusbar beginnt. Es ist auch nicht bei alles Linux Varianten gleich:

KUbuntu 37 -> 27
Debian KDE 35 -> 27
Mint Cinnamon 28 -> 24

Gibts da eine Lösung oder ist das ein Bug in der LCL? Ich habe auch schon versucht das mit Client.Height/Width zu Lösen, aber da bleibt das Fenster Resizeable und der Schalter Border bsSimple funktioniert auch nur unter Windows.

Grüße

Hobbyprogrammer

Benutzeravatar
Roland Chastain
Beiträge: 118
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: Höhe des MainMenü stimmt nicht

Beitrag von Roland Chastain »

Hallo! Jemand hatte mir diesen Trick gegeben, um die Höhe der Menüleiste zu ermitteln. Ich hoffe, dies wird dir helfen.

Code: Alles auswählen

procedure TForm1.FormActivate(Sender: TObject);
var
  h: integer;
begin
   h := Self.Height - Self.ClientHeight;
   // ...
end;
Viele Grüße.

Roland
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

HobbyProgrammer
Beiträge: 66
Registriert: Di 29. Okt 2019, 12:51
OS, Lazarus, FPC: Host: Debian Buster 64bit, VM Ubuntu 18.04 64bit , Lazarus 2.0.10 , Fpc 3.2.0
CPU-Target: Core i7-9750H
Wohnort: Deutschland , Baden-Württemberg

Re: Höhe des MainMenü stimmt nicht

Beitrag von HobbyProgrammer »

Das mit der Berechnung über Height und ClientHeight hatte ich schon versucht, ohne Erfolg. Jedoch im 'FormShow' Event.
Ich werde das nochmals in dem von Dir genannten 'FormActivate' Event versuchen.
Die Fanzösische Diskussion über das Thema hab ich mir übersetzen lassen und gelesen.
Vielen Dank dafür. :D

Benutzeravatar
Roland Chastain
Beiträge: 118
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: Höhe des MainMenü stimmt nicht

Beitrag von Roland Chastain »

Bitte. :wink:

Was passiert, wenn Sie die AutoSize-Eigenschaft auf True setzen und dies tun?

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
  with Constraints do
  begin
    MaxHeight := Height;
    MaxWidth := Width;
    MinHeight := Height;
    MinWidth := Width;
  end;
end;
Dateianhänge
project1.zip
(4.07 KiB) 30-mal heruntergeladen
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

HobbyProgrammer
Beiträge: 66
Registriert: Di 29. Okt 2019, 12:51
OS, Lazarus, FPC: Host: Debian Buster 64bit, VM Ubuntu 18.04 64bit , Lazarus 2.0.10 , Fpc 3.2.0
CPU-Target: Core i7-9750H
Wohnort: Deutschland , Baden-Württemberg

Re: Höhe des MainMenü stimmt nicht

Beitrag von HobbyProgrammer »

Die Lösung liegt in der Verarbeitung der Größe im 'FormActivate' Event:

Code: Alles auswählen

procedure TMainWindow.FormActivate(Sender: TObject);
var
  size: TSize;
begin
    size := SystemTerminal.getDisplaySize;
    Constraints.MinWidth := size.Width;
    Constraints.MinHeight := size.Height + panelButtons.Height + statusbarMainWindow.Height + (Height - ClientHeight);
    Constraints.MaxWidth := Constraints.MinWidth;
    Constraints.MaxHeight := Constraints.MinHeight;
end;
damit wird die Größe nun immer sauber richtig festgelegt. :D

Vielen Dank
Grüße
HobbyProgrammer

Antworten