TEdit: Numerische Eingaben und Textausrichtung
Für Editboxen verwenden wir in Delphi die Komponente TEdit
. Häufig braucht man Editboxen, welche nur numerische Eingaben erlauben. Ausserdem möchte man manchmal auch von der standardmässigen Linksausrichtung des Textes abweichen. Leider bietet TEdit
keine entsprechenden Properties an. Beides lässt sich aber sehr einfach durch Setzen entsprechender Windows Styles erreichen.
TEdit
legt eine Windows Editbox an. Windows kennt diverse Styles für seine Editboxen, welche sich über das Windows API setzen lassen. Aus Delphi können wir dieses API verwenden und schreiben und dazu eine Prozedur wie folgt:
1 2 3 4 5 6 7 | procedure SetEditStyle(anEditBox: TEdit; anEditControlStyleFromWindowsUnit: integer); var windowStyle: DWORD; begin windowStyle := GetWindowLong(anEditBox.Handle, GWL_STYLE); SetWindowLong(anEditBox.Handle, GWL_STYLE, windowStyle or anEditControlStyleFromWindowsUnit) end; |
Die Styles sind in der Unit Windows
definiert. Interessant für uns sind an dieser Stelle ES_CENTER
, ES_RIGHT
und ES_NUMBER
. Eine Editbox kann nun zum Beispiel wie folgt auf numerische Eingaben umgestellt werden:
1 | SetEditStyle(someEditBox, ES_NUMBER); |
Der Style kann natürlich erst gesetzt werden, nachdem Windows die entsprechende Editbox auch tatsächlich erstellt hat. Wenn wir also für unsere Editboxen auf einer Form (oder auch in einem Frame) die Styles setzen wollen, dann müssen wir die Prozedur CreateWnd
überschreiben, darin inherited
aufrufen und nachher die Styles wie gewünscht setzen.
Folgendes Beispiel zeigt ein Form mit vier Edit-Boxen, für welche jeweils unterschiedliche Styles gesetzt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) edtNormal: TEdit; edtRightAligned: TEdit; edtNumeric: TEdit; edtRightAlignedNumeric: TEdit; protected procedure CreateWnd; override; end; procedure SetEditStyle(anEditBox: TEdit; anEditControlStyleFromWindowsUnit: integer); var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.CreateWnd; begin inherited; SetEditStyle(edtRightAligned, ES_RIGHT); SetEditStyle(edtNumeric, ES_NUMBER); SetEditStyle(edtRightAlignedNumeric, ES_RIGHT); SetEditStyle(edtRightAlignedNumeric, ES_NUMBER); end; procedure SetEditStyle(anEditBox: TEdit; anEditControlStyleFromWindowsUnit: integer); var windowStyle: DWORD; begin windowStyle := GetWindowLong(anEditBox.Handle, GWL_STYLE); SetWindowLong(anEditBox.Handle, GWL_STYLE, windowStyle or anEditControlStyleFromWindowsUnit) end; end. |