Interne Größenverarbeitung selbst erstellter Steuerelemente

Rund um die LCL und andere Komponenten
Antworten
EUP
Beiträge: 16
Registriert: Fr 18. Jul 2014, 23:07

Interne Größenverarbeitung selbst erstellter Steuerelemente

Beitrag von EUP »

Hallo,

ich versuche einige meiner Steuerelemente (Gambas/VB.Net) auf Lazarus zu übertragen und stoße schon bei der Bemaßung auf Probleme.

Allgemeine Info:

Ich leite vom TPanel ab und setzte dort dann weitere Elemente auf.


Folgender Umstand ergibt sich:

Bild


Codemäßige Umsetzung:

Code: Alles auswählen

  public
    constructor Create(TheOwner: TComponent); override;

    procedure CreateWnd; override;
    procedure Resize; override;

    Const
      defHeight = 35;
      defWidth = 100;

  published
    property Align;
    property Anchors;

    property Height: Integer read FHeight write SetHeight Default defHeight;
    property Width: Integer read FWidth write SetWidth Default defWidth;
    
    ...

Code: Alles auswählen

constructor TFlipBox.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);

  FHeight := defHeight;
  FWidth := defWidth;

  Self.SetBounds(Self.Left, Self.Top, FWidth, FHeight);

  Self.ClientHeight := FHeight;
  Self.ClientWidth := FWidth;

  Self.Height := FHeight;
  Self.Width := FWidth;

  Self.BevelInner := bvNone;
  
  ...

Ich setzte im kompletten Code keinen Height-Wert auf 33 oder reduziere einen Height-Wert um 2.
Wie kommt die IDE auf diesen Wert?

Was mache ich da falsch?

Dank im Voraus an alle Wissenden.

Benutzeravatar
theo
Beiträge: 10972
Registriert: Mo 11. Sep 2006, 19:01

Re: Interne Größenverarbeitung selbst erstellter Steuerelemente

Beitrag von theo »

Probier mal ClientHeight kleiner als FHeight zu machen oder gar nicht im Code zu verändern.

Ist ja auch bei einem normalen Panel so:

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
 Panel1.ClientHeight:=Panel1.Height;
 Caption:=Panel1.Height.ToString;
end; 
Hier wird Height auch grösser.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1669
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Interne Größenverarbeitung selbst erstellter Steuerelemente

Beitrag von fliegermichl »

Wenn ein Steuerelement erstellt wird, dann wird die virtuelle Klassenmethode GetControlClassDefaultSize aufgerufen. Bei TCustomPanel liefert die normalerweise eine Breite von 170 und eine Höhe von 50 Pixeln. Du könntest diese Methode also für dein TFlipbox überschreiben.

Die Angabe von von default bei der Property Definition steuert lediglich, ob der Wert in der lfm Datei gespeichert wird, (was der Fall ist, wenn die aktuelle Größe vom default abweicht).

Soner
Beiträge: 753
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Interne Größenverarbeitung selbst erstellter Steuerelemente

Beitrag von Soner »

Es sieht so aus als ob dein TFlipBox die Komponente TEdit enthält. Von einigen Steuerelementen wie TEdit kann man die Größe, bei TEdit die Höhe, nicht bestimmen, das ist vorgegeben, durch Schriftart usw. Ich denke, deshalb hast du diesen Differenz. Das gilt auch für einige andere Steuerlemente.

Benutzeravatar
theo
Beiträge: 10972
Registriert: Mo 11. Sep 2006, 19:01

Re: Interne Größenverarbeitung selbst erstellter Steuerelemente

Beitrag von theo »

Was mir nachträglich noch aufgefallen ist mit der ClientHeight: Es hängt tatsächlich auch vom Widgetset ab, was da passiert.
Bei GTK2 bewirkt das Setzen von ClientHeight eine Vergrösserung von Height.
Bei Qt6 können beide Werte anscheinend gleich sein.

So getestet:

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
 Caption:=Panel1.Height.ToString;
 Panel1.ClientHeight:=Panel1.Height;
 Caption:=Caption+' '+Panel1.Height.ToString;
end; 
GTK2: 50 54
Qt6 : 50 50

MMn sollte man ClientHeight überhaupt nicht setzen, nur abfragen.

EUP
Beiträge: 16
Registriert: Fr 18. Jul 2014, 23:07

Re: Interne Größenverarbeitung selbst erstellter Steuerelemente

Beitrag von EUP »

Danke erst einmal ...

Code: Alles auswählen

class function GetControlClassDefaultSize: TSize; override;
in Verbindung mit

Code: Alles auswählen

class function TFlipBox.GetControlClassDefaultSize: TSize;
begin
  Result.CX := 100;
  Result.CY := 35;
end;
bringt das Ganze jetzt hoffentlich auf das richtige Fundament.

Jetzt läuft zwar der ganze Rest nicht mehr wie gewünscht, aber ich denke ich baue noch mal neu auf dieser Basis auf.

Wenn ich bei TEdit AutoSize auf false setzte, dann kann ich beliebige Größenwerte setzen.

An ClientHeight/Width war ich eigentlich nur dran, weil die Darstellung (Fangpunkte) in der IDE ansonsten fehlerhaft waren.

Ich denke auch, dass ich unter Lazarus noch eine Menge Nachholbedarf habe.

Antworten