12/09/2021 (Versão 1.2)
13/04/2021 (Versão 1.1)
27/03/2021 (Versão 1.0)
Quando você está trabalhando em seu projeto de software, você sempre precisa armazenar alguns dados em um arquivo INI ou em algum arquivo de texto, como um arquivo de configuração ou outras informações.
Portanto, as opções que você tem são arquivo INI ou texto simples. E quase sempre você precisa de uma tabela com alguns campos.
Em um texto simples, você pode usar um registro por linha e separar campos usando caractere de tabulação, barra vertical ou outro. Mas você tem alguns problemas com esse método: é preciso tomar cuidado com o caractere separador, não utilizá-lo no valor dos campos; e você tem um problema maior: em uma versão futura, se precisar adicionar uma coluna, você perde a compatibilidade deste arquivo quando já existem dados armazenados.
Se você estiver trabalhando com arquivo INI, poderá especificar os nomes dos campos, mas mesmo assim, você terá problemas para armazenar um registro por seção e será difícil reordenar registros, excluir registros e nomear o registro.
Mas não se preocupe, aqui está a solução.
O DzXMLTable é um componente não visual onde você pode armazenar registros com campos e valores, e pode nomear o campo, para que não precise se preocupar com versões futuras. Você pode adicionar novos campos a qualquer momento, bastando lê-los e escrevê-los.
Este é um novo conceito do meu componente DzMiniTable anterior.
Suporta 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 ;
O nome do campo sempre não diferencia maiúsculas de minúsculas em todos os métodos e parâmetros de propriedades.
FileName: string
= Especifica o nome completo do arquivo XML para abrir e salvar a tabela
RequiredFile: Boolean
= Quando esta propriedade estiver desabilitada (padrão), caso o arquivo não exista no método Open, a tabela será carregada vazia sem gerar nenhuma exceção.
RequiredField: Boolean
= Quando esta propriedade está desabilitada (padrão), você pode ler um campo inexistente sem gerar exceção, retornando o valor da variante Unassigned
.
Rec[Index: Integer]: TDzRecord
(propriedade padrão do componente) = Retorna o objeto registro por índice.
RecCount: Integer
= Retorna a contagem de registros.
procedure Load ;
Carregue a tabela do arquivo especificado na propriedade FileName
procedure Save ;
Salve a tabela no arquivo especificado na propriedade FileName
procedure Clear ;
Limpe todos os dados da tabela
function New (Index: Integer = - 1 ): TDzRecord;
Crie um novo registro na tabela e retorne o objeto de registro. Você pode especificar a nova posição do registro na tabela, usando o parâmetro Index
. Se você deixar Index = -1
, o registro será adicionado no final da tabela.
procedure Delete (Index: Integer);
Exclua um registro por índice.
function FindIdxByField ( const Name : string; const Value : Variant): Integer;
Retorna o primeiro índice de registro que corresponde ao mesmo Nome e Valor. Se nenhum registro for encontrado, a função retornará nil
.
function FindRecByField ( const Name : string; const Value : Variant): TDzRecord;
Retorna o primeiro objeto de registro que corresponde ao mesmo Nome e Valor. Se nenhum registro for encontrado, a função retornará nil
.
function FindIdxBySameText ( const Name : string; const Value : Variant): Integer;
Retorna o primeiro índice de registro que corresponde ao mesmo Nome e Valor, onde Valor é comparado como String usando distinção entre maiúsculas e minúsculas . Se nenhum registro for encontrado, a função retornará nil
.
function FindRecBySameText ( const Name : string; const Value : Variant): TDzRecord;
Retorna o primeiro objeto de registro que corresponde ao mesmo Nome e Valor, onde Valor é comparado como String usando distinção entre maiúsculas e minúsculas . Se nenhum registro for encontrado, a função retornará nil
.
procedure Move (CurIndex, NewIndex: Integer);
Move um registro da posição CurIndex
para a posição NewIndex
na tabela.
Field[const Name: string]: Variant
= Retorna ou define o valor do campo como variante pelo nome do campo. Ao obter o valor do campo, se o campo não existir, uma exceção será gerada, a menos que a propriedade RequiredField
seja False (neste caso, será retornado um valor Unassigned
. Ao definir o valor do campo, se o campo não existir, ele irá ser criado automaticamente com nome e valor especificados.
FieldIdx[Index: Integer]: TDzField
= Retorna objeto de campo por índice de campo.
Aviso: um registro pode conter campos diferentes de outro registro. Portanto, você nunca deve usar um índice fixo para um campo específico (como uma coluna) nos registros.
FieldCount: Integer
= Retorna o número de campos deste registro.
function ReadDef ( const Name : string; DefValue: Variant): Variant;
Retorna o valor do campo por nome do campo. Se o campo não existir no registro, retorne DefValue
.
function FindField ( const Name : string): TDzField;
Retorna o objeto de campo pelo nome do campo. Se o campo não existir, retorna nil
.
function FieldExists ( const Name : string): Boolean;
Retorna verdadeiro se o campo existir pelo nome de campo especificado.
procedure ClearFields ;
Limpe todos os dados dos campos no registro (isso não remove apenas o valor dos campos, mas todos os campos).