TEdit: Numerische Eingaben und Textausrichtung

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:

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:

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:

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.

Schreibe einen Kommentar