12/09/2021 (Version 1.2)
13/04/2021 (Version 1.1)
27/03/2021 (Version 1.0)
Lorsque vous travaillez sur votre projet logiciel, vous devez toujours stocker certaines données dans un fichier INI ou un fichier texte, sous forme de fichier de configuration ou d'autres informations.
Ainsi, les options dont vous disposez sont le fichier INI ou le texte brut. Et presque toujours, vous avez besoin d’une table avec quelques champs.
Dans un texte brut, vous pouvez utiliser un enregistrement par ligne et séparer les champs à l'aide d'un caractère de tabulation, d'un caractère barre verticale ou d'un autre. Mais vous rencontrez quelques problèmes avec cette méthode : vous devez faire attention au caractère séparateur et ne pas l'utiliser à la valeur des champs ; et vous avez un plus gros problème : dans une future version, si vous devez ajouter une colonne, vous perdez la compatibilité au niveau de ce fichier alors qu'il y a déjà des données stockées.
Si vous travaillez avec un fichier INI, vous pouvez spécifier les noms de champs, mais même cela, vous rencontrez des problèmes pour stocker un enregistrement par section et il est difficile de réorganiser les enregistrements, de supprimer des enregistrements et de nommer l'enregistrement.
Mais ne vous inquiétez pas, voici la solution.
Le DzXMLTable est un composant non visuel dans lequel vous pouvez stocker des enregistrements avec des champs et des valeurs, et vous pouvez nommer le champ, vous n'avez donc pas à vous inquiéter des versions futures. Vous pouvez ajouter de nouveaux champs à tout moment, simplement en les lisant et en les écrivant.
Il s'agit d'un nouveau concept de mon précédent composant DzMiniTable.
Prend en charge Delphi XE3..Delphi 11
type
TContact = class
ID: Integer;
Name : string;
Phone: string;
Active: Boolean; // new field in some new program version
end ;
procedure LoadContactsExample (List: TObjectList<TContact>);
var
XML: TDzXMLTable;
Rec: TDzRecord;
Contact: TContact;
begin
XML := TDzXMLTable.Create( nil );
try
XML.FileName := ' C:Data.xml ' ;
XML.Load;
for Rec in XML do
begin
Contact := TContact.Create;
Contact.ID := Rec[ ' ID ' ];
Contact. Name := Rec[ ' Name ' ];
Contact.Phone := Rec[ ' Phone ' ];
Contact.Active := Rec.ReadDef( ' Active ' , True); // saved xml in old version could not have this field, so, read with default value.
List.Add(Contact);
end ;
finally
XML.Free;
end ;
end ;
Le nom du champ est toujours insensible à la casse dans tous les paramètres de méthodes et de propriétés.
FileName: string
= Spécifie le nom complet du fichier XML pour ouvrir et enregistrer la table
RequiredFile: Boolean
= Lorsque cette propriété est désactivée (par défaut), si le fichier n'existe pas dans la méthode Open, la table sera chargée vide sans lever d'exception.
RequiredField: Boolean
= Lorsque cette propriété est désactivée (par défaut), vous pouvez lire un champ non existant sans déclencher ni exception, renvoyant la valeur de variante Unassigned
.
Rec[Index: Integer]: TDzRecord
(propriété du composant par défaut) = Renvoie l'objet d'enregistrement par index.
RecCount: Integer
= Renvoie le nombre d'enregistrements.
procedure Load ;
Charger la table à partir du fichier spécifié dans la propriété FileName
procedure Save ;
Enregistrez la table dans le fichier spécifié dans la propriété FileName
procedure Clear ;
Effacer toutes les données du tableau
function New (Index: Integer = - 1 ): TDzRecord;
Créez un nouvel enregistrement dans la table et renvoie l'objet d'enregistrement. Vous pouvez spécifier la nouvelle position d'enregistrement dans la table, à l'aide du paramètre Index
. Si vous laissez Index = -1
, l'enregistrement sera ajouté à la fin du tableau.
procedure Delete (Index: Integer);
Supprimer un enregistrement par index.
function FindIdxByField ( const Name : string; const Value : Variant): Integer;
Renvoie le premier index d'enregistrement qui correspond aux mêmes nom et valeur. Si aucun enregistrement n'est trouvé, la fonction retournera nil
.
function FindRecByField ( const Name : string; const Value : Variant): TDzRecord;
Renvoie le premier objet d'enregistrement qui correspond aux mêmes nom et valeur. Si aucun enregistrement n'est trouvé, la fonction retournera nil
.
function FindIdxBySameText ( const Name : string; const Value : Variant): Integer;
Renvoie le premier index d'enregistrement qui correspond aux mêmes nom et valeur, où Value est comparé à une chaîne en ne respectant pas la casse . Si aucun enregistrement n'est trouvé, la fonction retournera nil
.
function FindRecBySameText ( const Name : string; const Value : Variant): TDzRecord;
Renvoie le premier objet d'enregistrement qui correspond aux mêmes nom et valeur, où Value est comparé à une chaîne en ne respectant pas la casse . Si aucun enregistrement n'est trouvé, la fonction retournera nil
.
procedure Move (CurIndex, NewIndex: Integer);
Déplace un enregistrement de la position CurIndex
vers la position NewIndex
dans la table.
Field[const Name: string]: Variant
= Renvoie ou définit la valeur du champ comme variante par nom de champ. Lors de l'obtention de la valeur du champ, si le champ n'existe pas, une exception sera levée, sauf si la propriété RequiredField
est False (dans ce cas, une valeur Unassigned
sera renvoyée. Lors de la définition de la valeur du champ, si le champ n'existe pas, il sera être automatiquement créé avec le nom et la valeur spécifiés.
FieldIdx[Index: Integer]: TDzField
= Renvoie l'objet de champ par index de champ.
Attention : Un enregistrement peut contenir des champs différents d'un autre enregistrement. Ainsi, vous ne devez jamais utiliser un index fixe pour un champ spécifique (comme une colonne) dans les enregistrements.
FieldCount: Integer
= Renvoie le nombre de champs dans cet enregistrement.
function ReadDef ( const Name : string; DefValue: Variant): Variant;
Renvoie la valeur du champ par nom de champ. Si le champ n'existe pas dans l'enregistrement, renvoyez DefValue
.
function FindField ( const Name : string): TDzField;
Renvoie l'objet de champ par nom de champ. Si le champ n'existe pas, renvoie nil
.
function FieldExists ( const Name : string): Boolean;
Renvoie vrai si le champ existe sous le nom de champ spécifié.
procedure ClearFields ;
Effacez toutes les données des champs de l'enregistrement (cela ne supprime pas seulement la valeur des champs, mais les champs dans leur ensemble).