Lors de l'utilisation de Delphi pour la conception de bases de données, il est inévitable d'impliquer la saisie de champs de date. Cependant, par rapport à la version chinoise Access 97 de Microsoft, les méthodes d'affichage et de saisie des champs de date fournies par Delphi lui-même ne sont pas adaptées aux habitudes des Chinois. Par conséquent, de nombreuses solutions ont été proposées pour le traitement des champs de date, mais les résultats du traitement ne sont pas uniformes en termes d'affichage et de saisie. Par exemple, le format « aaaa année mm mois jj jour » peut être réalisé lors de l'affichage, mais il est toujours nécessaire. à saisir lors de la saisie. Utilisez "aaaa-mm-jj" selon les coutumes étrangères. Saisie dans le formulaire ; il est toujours difficile d'utiliser TdateTimePicker pour la saisie de sélection ; certaines méthodes doivent également modifier certaines propriétés de paramètre du système, de sorte que les propriétés du système doivent également être ajustées lors de la publication de logiciels utilisant des contrôles tiers ; est emballé et publié. De plus, les formats de date couramment utilisés tels que « 1999 » et « Novembre 1999 » ne sont pas traités en conséquence. Ici, sur la base de ma propre pratique, j'utilise la combinaison des événements OnGetText et OnSetText de TField afin d'obtenir l'unification de l'affichage et de la saisie des champs de date, et de pouvoir gérer nos dates communes telles que "1999" et "Novembre 1999". et la saisie des formulaires sont tous implémentés à l'aide des événements fournis par Delphi, et il n'est pas nécessaire de modifier les paramètres du système. Après extension correspondante, il peut également être utilisé pour l'affichage et la saisie de l'heure, tels que « hh point mm minute », etc. En même temps, puisque les événements de TField sont directement contrôlés, que ce soit via TDBGrid ou TDBEdit, ils peuvent être traités de manière unifiée sans avoir à les considérer séparément. Une approche similaire peut également être appliquée à la saisie de dates dans des applications hors base de données.
1 Idée de base
Utilisez la propriété EditMask de TField pour servir à la fois de masque d'affichage et de saisie. L'affichage du champ de date est traité dans l'événement OnGetText de TField et le jugement de validité de la valeur d'entrée est traité dans l'événement OnSetText. Pour réutiliser le code, placez les procédures et fonctions appelées par les gestionnaires d'événements OnGetText et OnSetText dans une unité distincte.
2 Code d'implémentation spécifique
{Unité d'affichage et de jugement}
unité DBDateEditMaskTrans ;
interface
utilise
Windows, SysUtils, contrôles, formulaires, base de données ;
{Processus d'affichage du champ de date, appelé dans l'événement OnGetText}
PRocedure DateFieldGetText (Expéditeur : TField ; var Texte : String);
{Fonction de jugement d'entrée du champ de date, appelée dans l'événement OnSetText}
function DateFieldSetText(Expéditeur : TField ; const Texte : String):Boolean;
mise en œuvre
procédure DateFieldGetText (Expéditeur : TField ; var Texte : String);
var
dDate : TDate ;
wAnnée,wMois,wJour:Mot ;
aryTestYMD:Array [1..2] of Char;{Tableau temporaire pour le masque de saisie de test}
iYMD : entier ;
commencer
dDate:=Sender.AsDateTime ;
DecodeDate(dDate,wYear,wMonth,wDay);
{Tester le format contenu dans le masque de saisie.}
aryTestYMD:='année';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil alors
iYMD :=1 ;
aryTestYMD:='mois';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil alors
iYMD :=2 ;
aryTestYMD:='Jour';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil alors
iYMD :=3 ;
cas iYMD de
1 : {Le masque de saisie est au format "aaaa année".}
Text:=IntToStr(wYear)+'année';
2 : {Le masque de saisie est au format "aaaa année mm mois".}
Text:=IntToStr(wYear)+'année'+IntToStr(wMonth)+'mois';
3 : {Le masque de saisie est au format "aaaa année mm mois jj jour".}
Text:=IntToStr(wYear)+'année'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
else {La valeur par défaut est : format "aaaa année mm mois jj jour".}
Text:=IntToStr(wYear)+'année'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
fin;
fin;
function DateFieldSetText(Expéditeur : TField ; const Texte : String):Boolean;
var
dDate : TDate ;
sAnnée,sMois,sJour : Chaîne ;
aryTestYMD:Tableau [1..2] de Char ;
iYMD : entier ;
commencer
{Obtenir la date saisie par l'utilisateur}
sAnnée:=Copie(Texte,1,4);
sMois:=Copie(Texte,7,2);
SDour:=Copier(Texte,11,2);
{Tester le format contenu dans le masque de saisie.}
aryTestYMD:='année';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil alors
iYMD :=1 ;
aryTestYMD:='mois';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil alors
iYMD :=2 ;
aryTestYMD:='Jour';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil alors
iYMD :=3 ;
{Utilisez Try...Sauf pour convertir la date d'entrée}
essayer
commencer
cas iYMD de
1 : {Le masque de saisie est au format "aaaa année".}
commencer
dDate:=StrToDate(sYear+'-01-01') ;{Le format de date par défaut de Windows chinois est : aaaa-mm-jj Le même ci-dessous}.
Sender.AsDateTime:=dDate;
fin;
2 : {Le masque de saisie est au format "aaaa année mm mois".}
commencer
dDate:=StrToDate(sAnnée+'-'+sMois+'-01');
Sender.AsDateTime:=dDate;
fin;
3 : {Le masque de saisie est au format "aaaa année mm mois jj jour".}
commencer
dDate:=StrToDate(sAnnée+'-'+sMois+'-'+sDay);
Sender.AsDateTime:=dDate;
fin;
else {La valeur par défaut est : format "aaaa année mm mois jj jour".}
commencer
dDate:=StrToDate(sAnnée+'-'+sMois+'-'+sDay);
Sender.AsDateTime:=dDate;
fin;
fin;
DateFieldSetText :=Vrai ;
fin;
sauf
{Erreur de conversion de date}
commencer
application.MessageBox(PChar(Text+'Ce n'est pas une date valide !'), 'Error',mb_Ok+mb_IconError);
DateFieldSetText:=False ;
fin;
fin;
fin;
fin.
{unité de fenêtre principale}
unité principale ;
interface
utilise
…{omettre les autres contenus}
procédure Table1BirthdayGetText (Expéditeur : TField ; var Texte : String ; DisplayText : Boolean) ;
procédure Table1BirthdaySetText (Expéditeur : TField ; const Texte : Chaîne) ;
privé
{Déclarations privées}
publique
{Déclarations publiques}
……{légèrement}
mise en œuvre
{Inclure les unités personnalisées}
utilise DBDateEditMaskTrans ;
{$R *.DFM}
...{Autres processus omis}
procédure TForm1.FormActivate(Expéditeur : TObject);
{Définissez le masque de saisie d'un champ de date, qui peut être placé dans la définition du champ TField. }
commencer
Table1.FieldByName('Anniversaire').EditMask:= '99-99-99;1;_';
fin;
procédure TForm1.Table1BirthdayGetText(Expéditeur : TField; var Texte : String;DisplayText : Boolean);
commencer
DateFieldGetText(Expéditeur,Texte);
fin;
procédure TForm1.Table1BirthdaySetText(Expéditeur : TField ; const Texte : Chaîne) ;
commencer
si DateFieldSetText(Sender,Text)=False alors
Abandonner ; {Échec de la conversion, la date est illégale}
fin;
fin.