[gelöst] Höhe eines Labels ermitteln?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

[gelöst] Höhe eines Labels ermitteln?

Beitragvon fliegermichl » 21. Nov 2019, 10:38 [gelöst] Höhe eines Labels ermitteln?

Hallo zusammen,

ich versuche hier gerade dynamisch einige Radiobuttons mit Labels zu generieren. Wenn man im Objektinspektor die Caption eines Labels bearbeitet, dann passt sich die Eigenschaft Height automatisch an. Das scheint bei einer Zuweisung per Programm nicht der Fall zu sein. Kleines Beispiel:
Code: Alles auswählen
 
 
const
  lines : array[1..3] of string = (
   'Ich bin nur eine einfache Zeile',
   'Ich bin dann aber schon' + LineEnding +
   'zwei Zeilen groß',
   'Und ich einer der''s gleich übertreiben' + LineEnding +
   'muß und ganze drei' + LineEnding +
   'Zeilen in Beschlag nehmen muß');
 
procedure TForm1.FormCreate(Sender: TObject);
var rb : TRadiobutton;
    lb : TLabel;
    i : integer;
    y : integer;
begin
 y := 5;
 for i := 1 to 3 do
 begin
   rb := TRadioButton.Create(Application);
   rb.Parent := self;
   rb.Left := 10;
   rb.Top := y;
   rb.Caption := Format('Auswahlmöglichkeit %d', [i]);
   y += rb.Height + 3;
   lb := TLabel.Create(Application);
   lb.Parent := self;
   lb.top := y;
   lb.Left := 20;
   lb.WordWrap := True;
   lb.AutoSize := True;
   lb.Caption := Lines[i];
   y += lb.Height + 5;
 end;
end;
 


Das schaut dann aber so aus:
dynlabels.PNG
Dynamisch generierte Labels
dynlabels.PNG (7.81 KiB) 587-mal betrachtet


Wie kann ich nun die tatsächlich vom Label in Beschlag genommene Höhe ermitteln?
Zuletzt geändert von fliegermichl am 22. Nov 2019, 09:10, insgesamt 1-mal geändert.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 437
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon fliegermichl » 21. Nov 2019, 10:55 Re: Höhe eines Labels ermitteln?

Ich hab das ganze jetzt nochmal mit einer aktuellen Lazarusversion 2.0.7 fixes probiert. Gleiches Ergebnis.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 437
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon m.fuchs » 21. Nov 2019, 11:09 Re: Höhe eines Labels ermitteln?

Wie wäre es denn, wenn du die mit Lazarus mitgelieferten Layoutmechanismen verwendest?

Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
  rb : TRadiobutton;
  lb : TLabel;
  i : integer;
begin
  Self.ChildSizing.Layout := cclLeftToRightThenTopToBottom;
  Self.ChildSizing.ControlsPerLine := 1;
  Self.ChildSizing.EnlargeHorizontal := crsHomogenousChildResize;
  for i := 1 to 3 do begin
    rb := TRadioButton.Create(Application);
    rb.Parent := self;
    rb.BorderSpacing.Left := 10;
    rb.BorderSpacing.Top := 5;
    rb.Caption := Format('Auswahlmöglichkeit %d', [i]);
    lb := TLabel.Create(Application);
    lb.Parent := Self;
    lb.BorderSpacing.Top := 3;
    lb.BorderSpacing.Left := 20;
    lb.WordWrap := True;
    lb.AutoSize := True;
    lb.Caption := Lines[i];
  end;
end;


Und vernünftige Variablennamen wären auch eine gute Idee. :)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2158
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon fliegermichl » 21. Nov 2019, 11:18 Re: Höhe eines Labels ermitteln?

Danke für die Info.

Von Childsizing und Borderspacing hab ich noch nie was gehört. Woran kann es liegen, daß die Angabe lb.Borderspacing.Left := 20 keine Auswirkung hat?
fliegermichl
Lazarusforum e. V.
 
Beiträge: 437
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon m.fuchs » 21. Nov 2019, 13:47 Re: Höhe eines Labels ermitteln?

fliegermichl hat geschrieben:Von Childsizing und Borderspacing hab ich noch nie was gehört.

Dann empfiehlt sich ein Blick hierhin: Wiki: Autosize/Layout

fliegermichl hat geschrieben:Woran kann es liegen, daß die Angabe lb.Borderspacing.Left := 20 keine Auswirkung hat?

Doch hat es, leider nimmt es dann alle Elemente auf den gleichen Abstand mit.
Kann sein, dass du dieses Problem nur mit Anchors lösen kannst.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2158
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon wp_xyz » 21. Nov 2019, 13:51 Re: Höhe eines Labels ermitteln?

Ja, ich würde auch mit Anchors arbeiten.

Ansonsten funktioniert dein Code richtig, wenn du ihn später aufrufst, z.b. in FormShow.
wp_xyz
 
Beiträge: 3038
Registriert: 8. Apr 2011, 08:01

Beitragvon m.fuchs » 21. Nov 2019, 14:09 Re: Höhe eines Labels ermitteln?

Hier noch die Variante mit Anchors:

Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
  CurrentRadioButton : TRadiobutton;
  CurrentLabel : TLabel;
  CurrentControl: TControl = nil;
  i : integer;
begin
  for i := 1 to 3 do begin
    CurrentRadioButton := TRadiobutton.Create(Self);
    CurrentRadioButton.Parent := Self;
    CurrentRadioButton.AnchorParallel(akLeft, 10, Self );
    if Assigned(CurrentControl) then
      CurrentRadioButton.AnchorToNeighbour(akTop, 3, CurrentControl)
    else
      CurrentRadioButton.AnchorParallel(akTop, 3, Self);
    CurrentRadioButton.Caption := Format('Auswahlmöglichkeit %d', [i]);
    CurrentControl := CurrentRadioButton;
 
    CurrentLabel := TLabel.Create(Self);
    CurrentLabel.Parent := Self;
    CurrentLabel.AnchorParallel(akLeft, 20, Self );
    CurrentLabel.AnchorToNeighbour(akTop, 3, CurrentControl);
    CurrentLabel.WordWrap := True;
    CurrentLabel.AutoSize := True;
    CurrentLabel.Caption := Lines[i];
    CurrentControl := CurrentLabel;
  end;
end;   
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2158
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon fliegermichl » 21. Nov 2019, 14:48 Re: Höhe eines Labels ermitteln?

Tatsache,

wenn ich das nicht im OnCreate mache, funktioniert es wie erwartet.

Danke für Eure Hilfe!
fliegermichl
Lazarusforum e. V.
 
Beiträge: 437
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon m.fuchs » 21. Nov 2019, 15:06 Re: Höhe eines Labels ermitteln?

Du solltest trotzdem die fertigen Layouthelfer verwenden. Sonst wirst du irgendwann Probleme bekommen, wenn irgendeine Auflösung/Schriftgröße/sonstewas deine Oberfläche zerhackt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2158
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Warf » 21. Nov 2019, 19:31 Re: Höhe eines Labels ermitteln?

Um deine eigentliche Frage zu beantworten, sowas sollte es für dich tun:
Code: Alles auswählen
function LabelHeight(const Label: TLabel): Integer;
begin
  with TCanvas.Create(nil) do
  try
    Font := Label.Font;
    Result := TextHeight(Label.Caption);
  finally
    Free;
  end;
end;


Wobei Label.Height eigentlich auch gehen müsste, eventuell musst du vorher mal das label updaten lassen via:
Code: Alles auswählen
Label.Invalidate;
Warf
 
Beiträge: 1303
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon fliegermichl » 21. Nov 2019, 23:03 Re: Höhe eines Labels ermitteln?

Warf hat geschrieben:Wobei Label.Height eigentlich auch gehen müsste, eventuell musst du vorher mal das label updaten lassen via:
Code: Alles auswählen
Label.Invalidate;


Wie gesagt, es funktioniert, aber nicht im OnCreate Event des Formulars
fliegermichl
Lazarusforum e. V.
 
Beiträge: 437
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon af0815 » 22. Nov 2019, 07:06 Re: Höhe eines Labels ermitteln?

Layouten mache ich niemals im OnCreate.

Für mich passiert das alles beim ersten OnActivate, dort mache ich ein Init meines Programmes, da zu diesen Zeitpunkt alles aus der LCL/FCL stabil ist. Auch das erzeugen der Frames mit meinem Layout ist hier Erfahrungsgemäß sicher. Zusätzlich erzeugt mein Hauptformular (=Main) alle weiteren Formulare bei Bedarf und Initialisiert diese auch. Damit bin ich nie von der Reihenfolge der Erstellung der Formulare in der *.lpr Datei abhängig.

Ach ja vielleicht ein weiterer Tip zu Layout in Frames, da ich die sehr stark dynamisch verwende. In einem Frame lege ich immer ein (flaches) Panel in den Hintergrund und baue auf diesen Panel mein Layout auf (Auch mit OnResize des Panel wenn nötig). Niemals Anchors auf die Seiten des Frame beziehen. Der Grund liegt darinnen, wie die LCL später die Frames in das Zielform bringt. Es gibt manchmal Seiteneffekte beim Layouten zwischen Komponenten auf/in Frames mit den Komponeten die diese Frames beinhalten, bzw. wenn Frames gegenseitig mit Anchors abhängig gemacht werden in komplexen Layouts.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3842
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon fliegermichl » 22. Nov 2019, 09:10 Re: Höhe eines Labels ermitteln?

Ich werde wohl nicht drum herum kommen, mich einmal näher mit den Möglichkeiten der Layouterei in Lazarus zu befassen. Mein eigentliches Problemchen ist aber gelöst.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 437
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

• Themenende •

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron
porpoises-institution
accuracy-worried