Bei der Verwendung von Delphi für den Datenbankentwurf ist die Eingabe von Datumsfeldern unumgänglich. Im Vergleich zur chinesischen Version von Microsoft Access 97 sind die von Delphi selbst bereitgestellten Anzeige- und Eingabemethoden für Datumsfelder jedoch nicht für die Gewohnheiten der Chinesen geeignet. Daher wurden viele Lösungen für die Verarbeitung von Datumsfeldern vorgeschlagen, aber die Verarbeitungsergebnisse sind bei der Anzeige und Eingabe nicht einheitlich. Beispielsweise kann das Format „JJJJ Jahr mm Monat TT Tag“ bei der Anzeige realisiert werden, es ist jedoch noch erforderlich Bei der Eingabe ist gemäß den ausländischen Gepflogenheiten „jjjj-mm-tt“ einzugeben Die Eingabe in das Formular ist immer mühsam. Bei einigen Methoden müssen auch einige Einstellungseigenschaften des Systems geändert werden. Daher müssen die Systemeigenschaften angepasst werden, wenn Steuerelemente von Drittanbietern verwendet werden wird verpackt und freigegeben. Darüber hinaus werden die gängigen Datumsformate wie „1999“ und „November 1999“ nicht entsprechend verarbeitet. Basierend auf meiner eigenen Praxis verwende ich hier die Kombination der OnGetText- und OnSetText-Ereignisse von TField, um die Anzeige und Eingabe von Datumsfeldern zu vereinheitlichen, und kann unsere gängigen Datumsangaben wie „1999“ und „November 1999“ verarbeiten Die Anzeige und Eingabe von Formularen werden alle mithilfe der von Delphi bereitgestellten Ereignisse implementiert, und es ist keine Änderung der Systemeinstellungen erforderlich. Nach entsprechender Erweiterung kann es auch zur Zeitanzeige und -eingabe verwendet werden, wie z. B. „hh Punkt mm Minute“ usw. Da die Ereignisse von TField direkt gesteuert werden, unabhängig davon, ob TDBGrid oder TDBEdit verwendet wird, können sie gleichzeitig auf einheitliche Weise verarbeitet werden, ohne dass sie separat betrachtet werden müssen. Ein ähnlicher Ansatz kann auch auf die Datumseingabe in Nicht-Datenbankanwendungen angewendet werden.
1 Grundidee
Verwenden Sie die EditMask-Eigenschaft von TField, um sowohl als Anzeige- als auch als Eingabemaske zu dienen. Die Anzeige des Datumsfelds wird im OnGetText-Ereignis von TField verarbeitet, und die Gültigkeitsbeurteilung des Eingabewerts wird im OnSetText-Ereignis verarbeitet. Um Code wiederzuverwenden, platzieren Sie die von den Ereignishandlern OnGetText und OnSetText aufgerufenen Prozeduren und Funktionen in einer separaten Einheit.
2 Spezifischer Implementierungscode
{Anzeige- und Beurteilungseinheit}
Einheit DBDateEditMaskTrans;
Schnittstelle
verwendet
Windows, SysUtils, Steuerelemente, Formulare, Datenbank;
{Anzeigeprozess für Datumsfelder, aufgerufen im OnGetText-Ereignis}
PROcedure DateFieldGetText(Sender: TField; var Text: String);
{Funktion zur Beurteilung der Datumsfeldeingabe, aufgerufen im OnSetText-Ereignis}
function DateFieldSetText(Sender: TField; const Text: String):Boolean;
Durchführung
procedure DateFieldGetText(Sender: TField; var Text: String);
var
dDate:TDate;
wYear,wMonth,wDay:Word;
aryTestYMD:Array [1..2] of Char;{Temporäres Array für Testeingabemaske}
iYMD:Integer;
beginnen
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);
{Testen Sie das in der Eingabemaske enthaltene Format.}
aryTestYMD:='Jahr';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil dann
iYMD:=1;
aryTestYMD:='Monat';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil dann
iYMD:=2;
aryTestYMD:='Tag';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil dann
iYMD:=3;
Fall iYMD von
1:{Die Eingabemaske hat das Format „JJJJ Jahr“.}
Text:=IntToStr(wYear)+'year';
2: {Die Eingabemaske hat das Format „JJJJ Jahr mm Monat“.}
Text:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month';
3: {Die Eingabemaske hat das Format „JJJJ Jahr mm Monat TT Tag“.}
Text:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
else {Standard ist: Format „JJJJ Jahr mm Monat TT Tag“.}
Text:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
Ende;
Ende;
function DateFieldSetText(Sender: TField; const Text: String):Boolean;
var
dDate:TDate;
sYear,sMonth,sDay:String;
aryTestYMD:Array [1..2] of Char;
iYMD:Integer;
beginnen
{Vom Benutzer eingegebenes Datum abrufen}
sYear:=Copy(Text,1,4);
sMonth:=Copy(Text,7,2);
SDay:=Copy(Text,11,2);
{Testen Sie das in der Eingabemaske enthaltene Format.}
aryTestYMD:='Jahr';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil dann
iYMD:=1;
aryTestYMD:='Monat';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil dann
iYMD:=2;
aryTestYMD:='Tag';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil dann
iYMD:=3;
{Verwenden Sie Try...Außer, um das Eingabedatum zu konvertieren}
versuchen
beginnen
Fall iYMD von
1: {Die Eingabemaske hat das Format „JJJJ Jahr“.}
beginnen
dDate:=StrToDate(sYear+'-01-01') ;{Das Standard-Datumsformat von chinesischem Windows ist: jjjj-mm-tt. Dasselbe unten}
Sender.AsDateTime:=dDate;
Ende;
2: {Die Eingabemaske hat das Format „JJJJ Jahr mm Monat“.}
beginnen
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
Sender.AsDateTime:=dDate;
Ende;
3: {Die Eingabemaske hat das Format „JJJJ Jahr mm Monat TT Tag“.}
beginnen
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
Ende;
else {Standard ist: Format „JJJJ Jahr mm Monat TT Tag“.}
beginnen
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
Ende;
Ende;
DateFieldSetText:=True;
Ende;
außer
{Datumskonvertierungsfehler}
beginnen
application.MessageBox(PChar(Text+'Kein gültiges Datum!'), 'Fehler',mb_Ok+mb_IconError);
DateFieldSetText:=False;
Ende;
Ende;
Ende;
Ende.
{Hauptfenstereinheit}
Einheit Haupt;
Schnittstelle
verwendet
…{Andere Inhalte weglassen}
procedure Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);
procedure Table1BirthdaySetText(Sender: TField; const Text: String);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
……{leicht}
Durchführung
{Benutzerdefinierte Einheiten einbeziehen}
verwendet DBDateEditMaskTrans;
{$R *.DFM}
...{Andere Prozesse weggelassen}
procedure TForm1.FormActivate(Sender: TObject);
{Legen Sie die Eingabemaske eines Datumsfelds fest, das in die TField-Felddefinition eingefügt werden kann. }
beginnen
Table1.FieldByName('Geburtstag').EditMask:= '99-99-99;1;_';
Ende;
procedure TForm1.Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);
beginnen
DateFieldGetText(Sender,Text);
Ende;
procedure TForm1.Table1BirthdaySetText(Sender: TField; const Text: String);
beginnen
wenn DateFieldSetText(Sender,Text)=False dann
Abbruch; {Konvertierung fehlgeschlagen, Datum ist ungültig}
Ende;
Ende.