Delphi est pratique et rapide pour développer des applications C / S car elle a un grand nombre de commandes d'accès aux données faciles à utiliser et de données. Cependant, tout est toujours difficile à perfectionner. Lors de la création d'un widget, l'étape la plus importante consiste à sélectionner la bonne classe parent, ce qui peut réduire l'écriture du code. La bibliothèque de composants de Delphi a déjà un composant TdateTimePicker, qui peut facilement entrer et modifier les dates et le temps en tirant le calendrier ou en utilisant l'incrément et la décrémentation de SpinButton, mais il n'a pas la capacité de détecter les données. Par conséquent, nous pouvons le prendre en tant que classe parent et dériver un nouveau contrôle, ainsi que la fonction consciente des données qui peut communiquer avec l'ensemble de données. Les commandes de données interagissent avec DataSource via des objets Datalink, donc l'ajout de conscience de données au contrôle nécessite la création d'un objet TDATALINK (ou sa classe dérivée) en tant que membre du contrôle, et créant des propriétés de données de données publiques et de données pour le contrôle; aux événements Tdatalink Object Odatachange et OnupDatedata. Vous trouverez ci-dessous le code source principal du contrôle, avec des commentaires correspondants: {Définissez la classe TDBDateTime dérivée de TdateTimePicker. Notez que DB doit être ajouté aux utilisations de l'interface unitaire, référence DBCTRLS}
TdbdateTime = class (tdateTimePicker)
Privé
Fdatalink: tfielddatalink;
// tfielddatalink est une classe dérivée de tdatalink qui gère l'interaction d'un seul champ avec une source de données
ProcéduRudAdArachange (expéditeur: tobject);
// Lorsque l'événement Ondatachange est déclenché lorsque l'enregistrement de l'ensemble de données change (tel que l'historique de navigation), Datachange sera utilisé comme poignée de traitement de l'événement pour l'événement
ProcédureUpDateData (expéditeur: tobject);
// L'événement onupdatedata est déclenché avant de mettre à jour l'ensemble de données, UpdatedAdAt sera utilisé comme poignée de traitement des événements pour l'événement
functionGetDataSource: tdataSource;
ProcédureSetDataSource (valeur: tdataSource);
FunctionGetDataField: String;
ProcédureSetDataField (valeur: chaîne);
procédurecmexit (varmMessage: tcMexit); message cm_exit; // clignote le message cm_exit lorsque le contrôle perd focus
protégé
ProcedureChange; Override; // L'événement OnChange est déclenché lorsque la date et l'heure du changement de contrôle.
Procédurenotification (acomponent: TComponent;
Opération: topration); remplacer;
// IDE de Delphi appelle cette méthode pour informer d'autres contrôles lorsqu'un contrôle est supprimé du formulaire
publique
ConstructorCreate (Aowner: TComponent); Override;
destructordestroy; remplacer;
lisé
PropertyDataSource: TdatasourceReadgetDatasource
écrittDataSource; // ajouter la propriété DataSource au contrôle afin qu'il puisse être connecté au composant DataSource
PropertyDataField: StringReadGetDataField
écrittDataField;
end; // ajouter l'attribut de DataField au contrôle,
Faites en sorte qu'un objet Tfield représentant un champ
ProcédureRegister; // Registre du composant
Mise en œuvre
procéduredbdatetime.cMexit;
Commencer
essayer
Fdatalink.upDateRecord;
// Mette à jour l'ensemble de données lorsque le contrôle perd le focus, qui déclenchera l'événement onupdatedata
sauf
SetFocus;
augmenter;
fin;
Doexit;
fin;
ConstructOrtDBDateTime.Create (Aowner: TComponent);
Commencer
Hérité de création (Aowner);
// Créer un objet DataLink, monter ondatachange,
Poignée de traitement des événements onupdatedata
Fdatalink: = tfielddatalink.create;
Fdatalink.ondatachange: = datachange;
Fdatalink.onupdatedata: = updatedata;
fin;
Destructortdbdatetime.destroy;
Commencer
Fdatalink.ondatachange: = nil;
Fdatalink.onupdatedata: = nil;
Fdatalink.free;
hérité destroy;
fin;
functiontdbdatetime.getDataSource: tdatasource;
Commencer
Résultat: = fdatalink.datasource;
fin;
ProcéduredbdateTime.setDataSource (valeur: tdatasource);
Commencer
Fdatalink.datasource: = valeur;
fin;
functiontdbdateTime.getDataField: String;
Commencer
Résultat: = fdatalink.fieldName;
fin;
procéduretdbdateTime.setDataField (valeur: chaîne);
Commencer
Fdatalink.fieldName: = valeur;
fin;
procéduretdbdatetime.datachange (expéditeur: tobject);
Commencer
DateTime: = maintenant;
// Si le contrôle est connecté à l'ensemble de données actif, l'ensemble de données changera
Le contrôle affiche la valeur de champ correspondante de l'enregistrement actuel
iffdatalink.field nilthen
iffdatalink.field.text alors
DateTime: = fdatalink.field.asdateTime;
fin;
Procéduredbdatetime.updateData (expéditeur: tobject);
Commencer
Fdatalink.field.asdatetime: = dateTime;
// Mette à jour les champs correspondants avec la date et l'heure du contrôle
fin;
procéduredbdatetime.change;
Commencer
// Définissez l'ensemble de données pour modifier l'état lorsque l'utilisateur modifie le contenu dans le contrôle
Fdatalink.modified;
ifnotfdatalink.EditingThen
Fdatalink.edit;
Changement hérité;
fin;
procéduredbdatetime.notification (acomponent:
TComponent; opération: topration);
Commencer
Hérité de notification (acomponent, opération);
// lorsque le tdatasource connecté au contrôle est
Définissez la propriété DataSource du contrôle sur vide lorsqu'il est supprimé
if (operation = OpreMove) et (fdatalink nil)
et (acomponent = dataSource) puis
DataSource: = nil;
fin;
procédure de registre;
Commencer
RegistreComponents (datacontrols,
[TDBDateTime]); // Une fois le contrôle enregistré, il est installé sur la page Datacontrols
fin;
fin.
Après l'installation, ce contrôle peut réduire le calendrier et augmenter ou diminuer les champs de date et d'heure de la base de données, et peut afficher les dates en deux formats, ce qui est pratique et pratique. Les commandes sont sûres et fiables dans Delphi3 et Delphi4.