12/09/2021 (Versión 1.2)
13/04/2021 (Versión 1.1)
27/03/2021 (Versión 1.0)
Cuando trabaja en su proyecto de software, siempre necesita almacenar algunos datos en un archivo INI o algún archivo de texto, como un archivo de configuración u otra información.
Entonces, las opciones que tienes son archivo INI o texto sin formato. Y casi siempre necesitas una tabla con algunos campos.
En un texto sin formato, puede usar un registro por línea y separar los campos usando un carácter de tabulación, un carácter de barra vertical u otro. Pero tienes algunos problemas con este método: debes tener cuidado con el carácter separador, no usarlo en el valor de los campos; y tienes un problema mayor: en una versión futura, si necesitas agregar una columna, perderás la compatibilidad en este archivo cuando ya hay datos almacenados.
Si está trabajando con un archivo INI, puede especificar los nombres de los campos, pero incluso eso, tiene problemas para almacenar un registro por sección y es difícil reordenar registros, eliminar registros y nombrar el registro.
Pero no te preocupes, aquí tienes la solución.
DzXMLTable es un componente no visual donde puede almacenar registros con campos y valores, y puede nombrar el campo, por lo que no necesita preocuparse en futuras versiones. Puedes agregar nuevos campos en cualquier momento, simplemente leyéndolos y escribiéndolos.
Este es un nuevo concepto de mi componente DzMiniTable anterior.
Soporta 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 ;
El nombre del campo siempre distingue entre mayúsculas y minúsculas en todos los métodos y parámetros de propiedades.
FileName: string
= Especifica el nombre completo del archivo XML para abrir y guardar la tabla
RequiredFile: Boolean
= Cuando esta propiedad está deshabilitada (predeterminada), si el archivo no existe en el método Open, la tabla se cargará vacía sin generar ninguna excepción.
RequiredField: Boolean
= Cuando esta propiedad está deshabilitada (predeterminada), puede leer un campo no existente sin generar una excepción, devolviendo un valor de variante Unassigned
.
Rec[Index: Integer]: TDzRecord
(propiedad de componente predeterminada) = Devuelve el objeto de registro por índice.
RecCount: Integer
= Devuelve el recuento de registros.
procedure Load ;
Cargue la tabla desde el archivo especificado en la propiedad FileName
procedure Save ;
Guarde la tabla en el archivo especificado en la propiedad FileName
procedure Clear ;
Borrar todos los datos de la tabla.
function New (Index: Integer = - 1 ): TDzRecord;
Crea un nuevo registro en la tabla y devuelve el objeto de registro. Puede especificar la nueva posición del registro en la tabla mediante el parámetro Index
. Si deja Index = -1
, el registro se agregará al final de la tabla.
procedure Delete (Index: Integer);
Eliminar un registro por índice.
function FindIdxByField ( const Name : string; const Value : Variant): Integer;
Devuelve el primer índice de registro que coincide con el mismo Nombre y Valor. Si no se encuentra ningún registro, la función devolverá nil
.
function FindRecByField ( const Name : string; const Value : Variant): TDzRecord;
Devuelve el primer objeto de registro que coincide con el mismo Nombre y Valor. Si no se encuentra ningún registro, la función devolverá nil
.
function FindIdxBySameText ( const Name : string; const Value : Variant): Integer;
Devuelve el primer índice de registro que coincide con el mismo Nombre y Valor, donde el Valor se compara como Cadena sin distinguir entre mayúsculas y minúsculas . Si no se encuentra ningún registro, la función devolverá nil
.
function FindRecBySameText ( const Name : string; const Value : Variant): TDzRecord;
Devuelve el primer objeto de registro que coincide con el mismo Nombre y Valor, donde el Valor se compara como Cadena sin distinguir entre mayúsculas y minúsculas . Si no se encuentra ningún registro, la función devolverá nil
.
procedure Move (CurIndex, NewIndex: Integer);
Mueve un registro de la posición CurIndex
a la posición NewIndex
en la tabla.
Field[const Name: string]: Variant
= Devuelve o define el valor del campo como variante por nombre de campo. Al obtener el valor del campo, si el campo no existe, se generará una excepción, a menos que la propiedad RequiredField
sea False (en este caso, se devolverá un valor Unassigned
. Al establecer el valor del campo, si el campo no existe, se creará automáticamente con el nombre y valor especificados.
FieldIdx[Index: Integer]: TDzField
= Devuelve el objeto de campo por índice de campo.
Advertencia: un registro puede contener campos diferentes a los de otro registro. Por lo tanto, nunca debes usar un índice fijo para un campo específico (como una columna) en todos los registros.
FieldCount: Integer
= Devuelve el número de campos en este registro.
function ReadDef ( const Name : string; DefValue: Variant): Variant;
Devuelve el valor del campo por nombre de campo. Si el campo no existe en el registro, devuelve DefValue
.
function FindField ( const Name : string): TDzField;
Devuelve el objeto de campo por nombre de campo. Si el campo no existe, devuelve nil
.
function FieldExists ( const Name : string): Boolean;
Devuelve verdadero si el campo existe según el nombre de campo especificado.
procedure ClearFields ;
Borre todos los datos de los campos en el registro (no solo elimina el valor de los campos, sino todos los campos).