Verweis: | |
Uses: | StdCtrls |
Eingabe: | 1/10 ‚tel Winkel als Ganzzahlwert (Integer) |
Ausgabe: | Gedrehter Text um den angegebenen Winkel. |
Funktion: | Dreht einen Text in Grad-Schritten von mindestens 0,1 Grad. |
Beispiel 1
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie ein TLabel und einen TButton auf die Form. Erstellen Sie zusätzlich ein OnActivate-Ereignis bei der TForm und ein OnClick-Ereignis bei TButton.
procedure TForm1.FormActivate(Sender: TObject);
begin
// Abmaße der Form zuerst
Form1.Width := 400;
Form1.ClientHeight := 400;
// Schalter nach unten
Button1.Align := alBottom;
// Label in die Mitte
Label1.Align := alClient;
Label1.Alignment := taCenter;
Label1.Layout := tlCenter;
// Label der Größe anpassen
Label1.OptimalFill := True;
// Beschriftung
Label1.Caption := 'Rotations-Test';
Button1.Caption := 'Ich drehe den Text um 15°.';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Erhöhe tag um 150 =>15 Grad
Button1.Tag := Button1.Tag + 150;
//rotiere Text
Label1.Font.Orientation := Button1.Tag;
//Fenster Überschrift
Form1.Caption := IntToStr(Button1.Tag);
// Label der Größe anpassen
Label1.OptimalFill := True;
end;
In der ersten Phase unseres Programms (OnActivate) Formatieren wir unsere Ausgabe. In dem zweiten Teil, lassen wir den Text um 15 Grad rotieren. Das tut er auch. Die Angabe der Rotation erfolgt in 1/10 = 0,1 Grad. Da die Eigenschaft Font.Orientation einen Ganzzahlenwert erfordert, musste man sich dieses Tricks bedienen um einen Wert von 0,1 Grad darzustellen.
Fehler 1
Wenn Sie statt bei einem gewünschten Winkel von 15,1 Grad diesen mit Font.Orientation:=15.1 angeben, dann bekommen Sie diese Fehlermeldung dieser Art:
unit1.pas(57,41) Error: Incompatible type for arg no. 1: Got "Double", expected "LongInt"
Die Eigenschaft Font.Orientation erfordert einen Ganzzahlenwert vom Typ – Integer. Der Wert „15.1“ wird vom Compiler als Kommazahl erkannt und als Fließkommawert vom Type Double behandelt.
Fehler 2
Selbst eine Angabe von 15 wäre falsch. Da die 15 nicht 15 Grad entsprechen, sondern 1,5 Grad. Wenn Sie, wie in dem Beispiel Ihr Label um 15 Grad drehen wollen, dann sollten Sie für eine Drehung die entgegen dem Uhrzeigersinn ist, 150 addieren. Die Winkelwerte habe ich auf folgendem Bild festgehalten.

Fehler 3
OptimalFill und Font.Orientation arbeitenOptimalFill und Font.Orientation arbeiten nicht so gut mit einander. In unserem Beispiel beginnen die Probleme bei ca. 60 Grad. Dies gilt es zu berücksichtigen. Da OptimalFill nur die Breite zur Berechnung der Schriftgröße heranzieht.
Fehler 4
Das Erhöhen der Variable Tag um 150 kann nach einiger Zeit zu einem Fehler führen.dieser entsteht tückischerweise nicht nach einer Sitzung. Vielleicht wir der Wert der Variablen Tag in einer Ini-Datei abgespeichert und dann wieder geladen. Dies kann bei täglicher Benutzung dazu führen, dass der maximale Wert eines Integer-Wertes von 2 Millionen irgendwann überschritten wird. Dann fragt sich der Benutzer nach 2 Jahren, was er falsch gemacht hat. Die Antwort ist: „Nichts.“ Wir waren es. Wir hätten bei dem OnClick-Ereignis des Buttons den Quelltext einfach mit dieser Zeile in erster Ablauffolge (ganz Oben) ergänzen müssen:
If Button1.Tag = 3600 then Button1.Tag := 0;
Am besten ist es jedoch, wenn man gleich die richtige Komponente für eine zielgerichtete Aufgabe nimmt. Dazu muss man sich ein Wenig auskennen. Aber wir arbeiten ja an uns. 🙂 Und so benutzen Wir für unser nächstes Programm die Komponente TSpinEdit vom Reiter „Misc“
Beispiel 2

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie zwei TLabel und einen TSpinEdit auf die Form. Erstellen Sie zusätzlich ein OnActivate-Ereignis bei der TForm und ein OnChange-Ereignis bei TSpinEdit.
procedure TForm1.FormActivate(Sender: TObject);
begin
// Abmaße der Form zuerst
Form1.Width := 400;
Form1.ClientHeight := 400;
// Spinn edit, gut zur festen Zahlenangabe
SpinEdit1.Align := alBottom;
// Begrenzung der Zahleneingabe
SpinEdit1.MinValue := -3600;
SpinEdit1.MaxValue := 3600;
// Schrittweite 150 pro Klick
SpinEdit1.Increment := 150;
// Nur Pfeileingabe
SpinEdit1.EditorEnabled := False;
SpinEdit1.Value := 0;
// Label Links oben
Label1.Left := 10;
Label1.Top := 10;
// Schauen wir uns die tatsächliche Größe an.
Label1.Color := clRed;
// Label der Größe anpassen
Label1.Font.Size := 20;
// Beschriftung
Label1.Caption := 'Rotations-Test';
// Labelgröße dem Text anpassen
Label1.AutoSize := True;
Label2.Align := alBottom;
Label2.Caption := 'Anzeige der Breite und Höhe.';
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
//rotiere Text
Label1.Font.Orientation := SpinEdit1.Value;
//Fenster Überschrift
Form1.Caption := IntToStr(SpinEdit1.Value);
// Beschreibe Breite Höhe
Label2.Caption := 'B(Width):= ' + IntToStr(Label1.Width) +
' H(Height):= ' + IntToStr(Label1.Height);
end;
Die Komponente TSpinEdit hat den Vorteil, dass wir die Mini- und Maximalwerte begrenzen können. Außerdem können wird den Valuewert von SpinEdit1.Value nehmen. Dieser Wert ist, wenn wir SpinEdit1 einen aussagekräftigen Namen zuweisen, (z.B. Spi_Graddreher.Value) später besser zu verstehen als die Integer – Hilfsvariable „Tag„. Weiterhin kann man auch bequem mit negativen Werten arbeiten und somit den Text in die andere Richtung drehen lassen.

Arbeiten mit negativen Werten
Das Beispiel zeigt Ihnen auch den Value-Wert in der Kopfzeile des Programms an. Hier können Sie sehen wie sich die Rotation der Schrift mit dem entsprechenden Werten verändert. Dabei sollten wir auch das Augenmerk auf die negativen Werte richten. Wenn sie einen Winkel von 15 Grad in die negative Richtung haben wollen, dann geben Sie diesen einfach mit einem Minuszeichen an. Sie hätten natürlich diesen Wert mit (360-15) *10=3450 ausrechnen können. Jedoch ist die Angabe von -150 wesentlich einfacher.
Font.Orientation und AutoSize
AutoSize arbeitet im Gegensatz zu OptimalFill sehr gut mit Font.Orientation zusammen. Hier gibt es zwar leichte Rundungsfehler, die aber nicht weiter ins Gewicht fallen. Mann könnte in dem Programm erwarten, dass der Height-Wert unseres Textes bei 0 genauso groß ist wie bei 1800, dem ist aber nicht so. Jedoch handelt es sich bei dem Fehler nur um einen einzigen Pixel.