[gelöst] Textbreite bestimmen und Label ausrichten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Scurra
Beiträge: 29
Registriert: Mi 31. Dez 2014, 12:08

[gelöst] Textbreite bestimmen und Label ausrichten

Beitrag von Scurra »

Hallo Leute,

ich habe gerade wieder ein kleines Problem: Ich möchte die (horizontale) Position eines Labels (nennen wir es Label1) so haben, dass es mittig zentriert ist im Verhältnis zu einem anderen, fixen Label (Label2). Die Position muss aber abhängig von der Breite von Label1 immer neu angepasst werden. Wenn in Label1 beispielsweise kein Text steht, dann muss gelten:

Label1.Left := Round(Label2.Left + Label2.Width/2);

Wenn Label1 auch eine Breite hat, dann sollte entsprechend gelten:

Label1.Left := Round(Label2.Left + Label2.Width/2 - Label1.Width/2);

Eigentlich hatte ich hier schon ein Problem, weil die Eigenschaft "Width" eines Labels nicht automatisch an die Breite angepasst wird, deshalb verwende ich anstatt Label1.Width die Methode canvas.TextWidth(Label1.Caption), analog auch für Label2. Wenn ich also folgende Zeile verwende:

Label1.Left := Round(Label2.Left + canvas.TextWidth(Label2.Caption)/2 - canvas.TextWidth(Label1.Caption)/2);

dann würde ich erwarten, dass Label1 mittig an Label2 zentriert ist, aber leider stimmt das so nicht. Der Grund dafür ist (wie ich herausgefunden habe) die Schriftgröße, die für beide Labels auf 20 gestellt habe. Sehe ich es richtig, dass "TextWidth" die Breite eines Strings in Pixel angibt, wobei der String die "Standard"-Schriftgröße hat (soweit ich das gesehen habe, ist die "Standard"-Schriftgröße, die am Anfang eingestellt ist, 9).

Meine Vermutung war nun die, dass sich die Breite eines Textes proportional zur Schriftgröße ist. Da ich für beide Labels die Schriftgröße 20 eingestellt habe, dachte ich, dass ich Label1 mittels

Label1.Left := Round(Label2.Left + 20/9*canvas.TextWidth(Label2.Caption)/2 - 20/9*canvas.TextWidth(Label1.Caption)/2);

ausrichten kann. Ich kann mich täuschen, aber meine Ausgabe sieht dann nicht zentriert aus. Wenn ich statt dem Faktor 20/9 den Faktor 2 hernehme, dann sieht es zumindest zentriert aus. Ich möchte es aber nicht nur durch "Hinsehen" erkennen, ob es wirklich zentriert ist, sondern ich möchte es genau wissen, also warum brauche ich den Faktor 2 oder brauche ich einen anderen Faktor?
Zuletzt geändert von Scurra am Mo 12. Jan 2015, 12:44, insgesamt 1-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Textbreite bestimmen und Label ausrichten

Beitrag von Michl »

Kennst Du die Eigenschaft "Anchors", damit lässt sich sehr einfach so ein Verhalten erstellen. Z.B.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.AnchorSideLeft.Control:=Label2;
  Label1.AnchorSideLeft.Side:=asrCenter;
  Label1.Anchors:=[akLeft];
end;   
Noch komfortabler kann man dies im Objektinspektor einstellen.

Ansonsten ist es gut, wenn man mit einem Canvas die Pixelgröße ermittelt, in dem die Fontgröße entsprechend eingestellt ist:

Code: Alles auswählen

  Label1.Left := Round(Label2.Left + Label2.Canvas.TextWidth(Label2.Caption)/2 - Label1.Canvas.TextWidth(Label1.Caption)/2); 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: Textbreite bestimmen und Label ausrichten

Beitrag von Bitschubser »

der Vorschlag von Michl führt ja wahrscheinlich schon zu einer viel eleganteren Lösung aber trotzdem:
Scurra hat geschrieben:Sehe ich es richtig, dass "TextWidth" die Breite eines Strings in Pixel angibt, wobei der String die "Standard"-Schriftgröße hat
Breite in Pixel ja, "Standard"-Schriftgröße nein.

EinObjekt.TextWidth verwendet immer die Einstellungen von EinObject.Font – wenn dein Objekt kein .TextWidth hat, dann hat man ein Problem: Denn dann muss man .TextWidth von einem anderen Objekt verwenden und dabei selbst sicherstellen, dass die Einstellungen von .Font für beide Objekte gleich sind – diese Vorgehensweise sollte man also aus naheliegenden Gründen vermeiden.

Scurra
Beiträge: 29
Registriert: Mi 31. Dez 2014, 12:08

Re: Textbreite bestimmen und Label ausrichten

Beitrag von Scurra »

Ansonsten ist es gut, wenn man mit einem Canvas die Pixelgröße ermittelt, in dem die Fontgröße entsprechend eingestellt ist
EinObjekt.TextWidth verwendet immer die Einstellungen von EinObject.Font
Habe ich das dann richtig verstanden, dass in meinem Quellcode das Problem besteht, dass ich einfach von "irgendeinem" Canvas die Textbreite (TextWidth) bestimmt habe, weil ich einfach nur

Canvas.TextWidth(...)

anstatt z. B.

Label1.Canvas.TextWidth(...)

geschrieben habe?

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

Re: Textbreite bestimmen und Label ausrichten

Beitrag von theo »

Ja natürlich. Es sei denn, die Font Eigenschaften unterscheiden sich nicht, dann macht es keinen Unterschied und ist nur einfach unschön programmiert.

Scurra
Beiträge: 29
Registriert: Mi 31. Dez 2014, 12:08

Re: Textbreite bestimmen und Label ausrichten

Beitrag von Scurra »

OK. Danke euch allen für die Erklärungen. Mein Problem ist damit gelöst.

Antworten