Guten Morgen Michael !
Die Eigenschaften DisplayFormat und EditMask sind
IMHO Relikte aus der Zeit von TurboProfessional (TP4).
Wesentlich flexibler sind die Erreignismethoden OnGetText und OnSetText.
Hier kannst Du Daten umwandeln und überprüfen, wie es benötigt wird.
Speziell für Datumseingaben super. Da kann dann auch das Komma als Trennzeichen verwendet werden,
oder bei Zahlen ist es dann egal ob . oder , als Dezimaltrennzeichen verwendet wird.
Du musst nur die entsprechenden Prüf- und Umwandlungsfunktionen schreiben.
Ich stöbere mal in meiner Bibliothek und hänge im Edit Umwandlungsfunktionen für Prozent, Datum, und Float an.
Delphi-Quellcode:
unit YourName;
uses ...;
interface
function Bool2Str(v:Boolean):
String;
// Boolean -> X (= angekreuzt)
function Str2Bool(S:
String):Boolean;
// irgendwas -> Boolean
function Int2Str(v:Integer):
String;
// Integer -> String
function Str2Int(S:
String):Integer;
// String -> Integer
function Rab2Str(v:double):
String;
// Rabatt to String | 0.03 -> '3%' Nullwerte
function Str2Rab(s:
String):Double;
// String to Rabatt | '3%' -> 0.03 werden NICHT angezeigt
function Cur2Str(v:double):
String;
// currency to string | 2.5 -> '2,50'
function Str2Cur(s:
String):Double;
// string to currency | '2,50' -> 2.5
function Dat2Str(v:TDateTime):
String;
function Str2Dat(S:
String):TDateTime;
implementation
function Bool2Str(v:Boolean):
String;
begin
if v
then Result:='
X'
else Result:='
';
end;
function Str2Bool(S:
String):Boolean;
begin
Result:=Trim(s)<>'
';
end;
function Int2Str;
begin
if v=0
then Result:='
'
else Str(v,Result)
end;
function Str2Int;
var c:Integer;
begin
s:=Trim(s);
Val(s,Result,c)
end;
function Rab2Str(v:double):
String;
// rabatt to string | 0.03 -> '3%'
begin
if v=0.0
then Result:='
'
else begin
Str(v*100.0:0:0, Result);
Result:=Result+'
%';
end
end;
function Str2Rab(s:
String):Double;
// string to rabatt | '3%' -> 0.03
begin
s:=Trim(s);
if s='
'
then Result:=0.0
else if s[Length(s)]='
%'
then Result:=Str2Prz(s)
else Result:=Str2Cur(s)*0.01
end;
function Str2Prz(s:
String):Double;
// string to prozent | '3%' -> 0.03
var c:Integer;
begin
s:=Trim(s);
if s='
'
then Result:=0.0
else begin
while (length(s)>0)
and (s[Length(s)]='
%')
do Delete(s, length(s), 1);
// % löschen
Val(s, Result, c);
Result:=Result*0.01;
end;
end;
function Clean(s:
String):
String;
var p:Integer;
begin
Result:=Trim(s);
if Result='
'
then exit;
while Instr(Result, '
.', p)
do
Delete(Result, p, 1);
if InStr(Result, '
,', p)
then
Result[p]:='
.';
end;
function Cur2Str(v:double):
String;
// currency to string | 2.5 -> '2,50'
begin
if v=0.0
then Result:='
'
else Result:=FloatToStrF(v, ffNumber, 15, 2)
end;
function Str2Cur(s:
String):Double;
// string to currency | '2,50' -> 2.5
var c:Integer;
begin
s:=Clean(s);
if s='
'
then result:=0.0
else Val(s, Result,c);
end;
function Dat2Str(v:TDateTime):
String;
begin
Result:=DateToStr(v)
end;
function Str2Dat(S:
String):TDateTime;
begin
Result:=stod(s);
end;
function stod;
var
p:Integer;
begin
p:=pos('
,', s);
while p>0
do
begin
s[p]:='
.';
p:=pos('
,', s);
end;
s:=trim(s);
if s='
'
then Result:=0
else Result:=StrToDate(S)
end;
end.
Anwendung:
Delphi-Quellcode:
procedure TForm1.Table1DatumGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
Text:=Dat2Str(Sender.AsDateTime);
end;
procedure TForm1.Table1DatumSetText(Sender: TField; const Text: String);
begin
Sender.AsDateTime:=Str2date(Text);
end;
Ist mehr geworden als ich eigentlich vorhatte