Verweis: | Font.Size OptimalFill |
Uses: | StdCtrls |
Eingabe: | Ein- oder Ausschalten: Boolean |
Ausgabe: | Automatische Größenanpassung. |
Funktion: | Passt die Größe des Schriftfeldes an die Länge und Höhe der Schrift an. |
Beispiel 1
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie drei TLabel auf die Form. Wenn sie nicht wissen wie man mehrere Komponenten des gleichen Typs auf die Form bringt, dann schauen sie bitte hier. Erstellen Sie zusätzlich ein OnActivate-Ereignis.
procedure TForm1.FormActivate(Sender: TObject);
begin
//Fensterbreite 320
Form1.Width := 320;
//Gleiche Schriftfeldlänge
Label1.Width := 300;
Label2.Width := 300;
Label3.Width := 300;
//Verschiedene Hintergrundfarben
Label1.Color := ClYellow;
Label2.Color := ClWhite;
Label3.Color := ClAqua;
//Gleiche Schriftgröße
Label1.Font.Size := 20;
Label2.Font.Size := 20;
Label3.Font.Size := 20;
//Gleiche Schriftart
Label1.Font.Name := 'Arial';
Label2.Font.Name := 'Arial';
Label3.Font.Name := 'Arial';
//Unterschiedliche Beschriftung
Label1.Caption := 'iii';
Label2.Caption := 'www';
Label3.Caption := 'GgJjÄ';
//10 Pixel vom linken Rand der Form
Label1.Left := 10;
Label2.Left := 10;
Label3.Left := 10;
//10 Pixel von Oben
Label1.Top := 10;
//Berechnung der Y-Position
Label2.Top := 10 + Label1.Height;
Label3.Top := 10 + Label1.Height + Label2.Height;
//Berechnung der Fenster Höhe
Form1.ClientHeight := 10 + Label1.Height + Label2.Height + Label3.Height + 10;
end;
Das Beispiel 1 erzeugt dieses Bild.

Schauen wir uns nun den Quelltext an. Die Schriftfeldlänge (Labelx.Width) scheint hier keine Rolle zu spielen. Da der Standardwert von AutoSize bei einem Label auf True steht, wird die Label länge von 300 Punkten mit AutoSize überschrieben. Danach Färben Wir die Felder unterschiedlich und setzen die Schriftgröße der Label auf 20.
Die Schriftart
Die Schriftart Arial ist eine Non-Monotype Schrift. Dies führt dazu, das die iii kürzer sind wie die www. Hier ist der Buchstaben-Vorschub anders als bei einer Schreibmaschinen-Schrift (Monotype) immer von dem Verwendeten Buchstaben abhängig. Ihr Quelltext ist jedoch in Monotype (Courier New) dies erhöht die Übersichtlichkeit des Programms. Bei dem letzten String (GgJjÄ) erkennen Sie, warum die Buchstaben in der Höhe so viel Platz einnehmen. Autosize richtet sich bei der Höhe des Labels nicht nach den Buchstaben, sondern nach der Höhe des Schriftsatzes. Dies bedeutet, dass alle 3 Label die gleiche Höhe haben.
Die Position
Danach legen wir die linke Seite der Schrift mit 10 Pixeln von der Linken Seite des Fensters fest. Nun Legen Wir die Position in Y fest ( top:=10 ). Da wir die Position der anderen Label noch nicht genau wissen, müssen wir diese berechnen. Für label2 gilt die Position von Label1 + die Höhe von Label1. Bei der Position von Label3 dementsprechend die Addition von Label1, Label2 und 10. Wenn Sie genau wissen, dass Label1 und Label2 die gleiche Schriftart und Größe haben, dann könnten Sie auch label1 mit 2 multilizieren. Zum Schluss berechnen wir noch die Höhe des Fensterinhaltes (ClientHeight). Hierbei addieren wir alle 3 Label und 2 mal 10 Punkte.
Wenn sie die Autosize-Eigenschaft der Label im Objektinspektor deaktivieren,

dann hätten Sie diese Bild.

Jetzt sind die Label allerdings nur halb zu sehen.
Wie können wir nun das Problem lösen?
Stellen Sie hierzu Autosize wieder auf True und ersetzen Sie Ihren Quelltext von Beispiel 1 mit dem von Beispiel 2.
Beispiel 2
procedure TForm1.FormActivate(Sender: TObject);
begin
//------Eigenschaften der Form-------
//Fensterbreite 320
Form1.Width := 320;
//Abstand zum Rahmen
Form1.BorderWidth := 10;
//Übernimm die Schrift von der Form für alle Komponenten
Form1.ParentFont := True;
//Lege die Schrift des Fensters fest
Form1.Font.Size := 20;
Form1.Font.Name := 'Arial';
//-------Eigenschaften der Label
//Alles nach oben
Label1.Align := alTop;
Label3.Align := alTop;
Label2.Align := alTop;
//Verschiedene Hintergrundfarben
Label1.Color := ClYellow;
Label2.Color := ClWhite;
Label3.Color := ClAqua;
//Unterschiedliche Beschriftung
Label1.Caption := 'iii';
Label2.Caption := 'www';
Label3.Caption := 'GgJjÄ';
//Berechnung der Fensterhöhe
Form1.ClientHeight := 10 + Label1.Height * 3 + 10;
end;

Obwohl wir AutoSize auf True gestellt haben, ist die Länge der Label (width) über die Größe der Form verteilt bis auf einen Randabstand von 10 Pixeln. Wie das zusammenhängt erkläre ich in den nächsten Sätzen. Zunächst einmal entsteht der innere Rand durch eine Eigenschaft von Form1. Diese heißt BorderWidth. Dies hat den Vorteil, dass wir weniger schreiben müssen und dass der innere Rand unabhängig von der Größe der Form, immer 10 Punkte beträgt.
ParentFont
ParentFont sorgt dafür, dass alle Komponenten des Fensters die gleiche Schrifteigenschaft haben. Also brauchen wir die Eigenschaft der Schrift nur einmal in der Form festzulegen und diese Eigenschaft wird dann für alle untergeordneten Komponenten übernommen. Dies kann viel einstellen ersparen. In diesem Beispiel brauchen wir die Eigenschaft der Schrift nur für die Form festzulegen und nicht für jedes einzelne Label.
Align := alTop
Danach setzen wir die Align Eigenschaft der Label auf alTop. Die Einstellungen von Align haben folgende Auswirkungen auf AutoSize.
Align-Eigenschaft | Auswirkungen auf AutoSize |
---|---|
Align := alTop | überschreibt die Autosize Eigenschaft in der X-Richtung |
Align := alLeft | überschreibt die Autosize Eigenschaft in der Y-Richtung |
Align := alRight | überschreibt die Autosize Eigenschaft in der Y-Richtung |
Align := alClient | überschreibt die Autosize Eigenschaft in der X-und Y-Richtung |
Align := alNone | überschreibt die Autosize Eigenschaft nicht |
Die Reihenfolge der Aktivierung beschreibt die Reihenfolge von oben nach unten. Deswegen sind hier „www“ und „GgJjÄ“ vertauscht. Denn Label2 (www) wurde als letztes auf alTop gesetzt. Wie sie die Reihenfolge ohne Programmierung im Quelltext festlegen erkläre ich in diesem Tutorial. Nach den Farben und der Beschriftung, berechnen wir die Größe des Fensterinhaltes. Diesmal mit der Multiplikations -Methode. Dies funktioniert jedoch nur wenn alle Label die gleiche Schrift-Eigenschaft haben.
Fazit
AutoSize ist bei Labeln eine gute Sache. Deswegen ist AutoSize bei Labeln auch standardmäßig auf True. Im Gegensatz zur Formular-Komponente. Die Abmaße des Textes können Sie mit der Eigenschaft width und height nur auswerten, wenn Sie Autosize auf True steht und Align auf alNone. Das Benutzen von Autosize ist immer dann wichtig, wenn Ihr Programm folgende Eigenschaften mitbringen soll:
Wann sollte Autosize eingesetzt werden?
- Ihr Programm soll im Vollbildmodus auf verschiedenen Monitoren mit verschiedenen Auflösungen funktionieren.
- Ihre Schrift ändert sich während des Programms durch Aktionen des Benutzers.
- Sie schreiben ein Programm mit der Einstellung für verschiedene Sprachen.
- Unterstützung durch eine vergrößerte Einstellung für Menschen mit einer Sehschwäche oder einem kleinen Monitor bei hoher Auflösung.
- Die Schrift bleibt auf default Einstellung. Hierbei wir die Systemschrift übernommen. Diese kann vom Benutzer systemweit eingestellt werden. Somit variiert die Schrift von System zu System.
Wenn sich also aus diesen Gründen der Platz für die Schrift ändert oder aber sich die Schrift-Abmaße bei gleichem Platz ändern, dann kommen Sie ohne ein dynamisches Formulardesign nicht aus. Dies ist dann der Fall wenn, nur einer der oben genannten Punkte auf Ihr Programm zutrifft. Gerade für Anfänger ist das ärgerlich, da diese möglichst schnell was programmieren wollen und nun durch die Arbeit am Design ausgebremst werden. Dennoch gehört auch dieser Arbeitsschritt zu einem guten Programm. Irgend wann muss, sich der Programmierer dieser Aufgabe annehmen. Dies kann, wenn die Erstellung nicht parallel erfolgt, zu einer erheblichen Mehrarbeit führen.
Fehlersuche

Es erklärt sich eigentlich von selbst, dass Sie ein AutoSize aktiviertes Label in der Größe, auch im Entwurfsmodus nicht ändern können.
Wie an den Beispielen zu sehen war, gibt es Eigenschaften von verschiedenen Komponenten die sich Gegenseitig beeinflussen. Des weiteren ist es wichtig in welche Reihenfolge die Komponenten in verschiedene Eigenschaften geschaltet werden. Dies kann manchmal zu einer Fehlersuche führen. Hier ein paar Tipps zur Suche.
- Färben Sie zum Testen der wahren Größe des Labels den Hintergrund mit der Eigenschaft Color.
- Vermeiden Sie eine Kombination aus Objektexplorer-Einstellungen und Quelltext.
- Benutzen Sie, wenn es geht, den Anker-Editor von Anchor.
- Setzen Sie bei der Fehlersuche Haltepunkte ein.
- Beachten Sie bei der Fehlersuche auch den Komponenten Baum des Objektexplorers.
Alle Eigenschaften, die in den beiden Beispielen eingestellt worden sind, hätten wir auch im Objektexplorer einstellen können. Lediglich die Eigenschaft ClientHeight der Form ist als Eigenschaft im Objektexplorer nicht vorhanden. Da diese Eigenschaft nur als Property dem Objektexplorer zugänglich gemacht werden kann. Da aber ClientHeight meist für Berechnungen herangezogen wird und diese besser nicht im Objektinspektor durchgeführt werden, hat man darauf verzichtet. Wenn Sie sich für die Einstellungen im Objektinspektor entscheiden, dann sollten Sie, wenn es geht, alle Einstellungen im Objektinspektor durchführen. Ein unnötiges verteilen der Aufgaben erhöht, die Unübersichtlichkeit des Programms. Bedenken Sie, dass Einstellungen im Objektexplorer immer vor dem Quelltext ausgeführt werden.