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?
[gelöst] Textbreite bestimmen und Label ausrichten
[gelöst] Textbreite bestimmen und Label ausrichten
Zuletzt geändert von Scurra am Mo 12. Jan 2015, 12:44, insgesamt 1-mal geändert.
Re: Textbreite bestimmen und Label ausrichten
Kennst Du die Eigenschaft "Anchors", damit lässt sich sehr einfach so ein Verhalten erstellen. Z.B.
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
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.AnchorSideLeft.Control:=Label2;
Label1.AnchorSideLeft.Side:=asrCenter;
Label1.Anchors:=[akLeft];
end;
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;
-
- Beiträge: 61
- Registriert: Mo 27. Aug 2012, 15:43
Re: Textbreite bestimmen und Label ausrichten
der Vorschlag von Michl führt ja wahrscheinlich schon zu einer viel eleganteren Lösung aber trotzdem:
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.
Breite in Pixel ja, "Standard"-Schriftgröße nein.Scurra hat geschrieben:Sehe ich es richtig, dass "TextWidth" die Breite eines Strings in Pixel angibt, wobei der String die "Standard"-Schriftgröße hat
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.
Re: Textbreite bestimmen und Label ausrichten
Ansonsten ist es gut, wenn man mit einem Canvas die Pixelgröße ermittelt, in dem die Fontgröße entsprechend eingestellt ist
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 nurEinObjekt.TextWidth verwendet immer die Einstellungen von EinObject.Font
Canvas.TextWidth(...)
anstatt z. B.
Label1.Canvas.TextWidth(...)
geschrieben habe?
Re: Textbreite bestimmen und Label ausrichten
Ja natürlich. Es sei denn, die Font Eigenschaften unterscheiden sich nicht, dann macht es keinen Unterschied und ist nur einfach unschön programmiert.
Re: Textbreite bestimmen und Label ausrichten
OK. Danke euch allen für die Erklärungen. Mein Problem ist damit gelöst.