12.09.2021 (Версия 1.2)
13.04.2021 (Версия 1.1)
27.03.2021 (Версия 1.0)
Когда вы работаете над своим программным проектом, вам всегда необходимо сохранять некоторые данные в INI-файле или каком-либо текстовом файле в виде файла конфигурации или другой информации.
Итак, у вас есть варианты: INI-файл или обычный текст. И почти всегда нужна таблица с какими-то полями.
В обычном тексте вы можете использовать одну запись в строке и разделять поля с помощью символа табуляции, вертикальной черты или другого символа. Но у вас есть некоторые проблемы с этим методом: вам нужно позаботиться о символе-разделителе, а не использовать его в значении поля; и у вас есть самая большая проблема: в будущей версии, если вам нужно будет добавить столбец, вы потеряете совместимость с этим файлом, когда данные уже сохранены.
Если вы работаете с файлом INI, вы можете указать имена полей, но даже в этом случае у вас возникнут проблемы с сохранением одной записи в каждом разделе, а также сложно изменить порядок записей, удалить записи и дать имя записи.
Но не волнуйтесь, вот решение.
DzXMLTable — это невизуальный компонент, в котором вы можете хранить записи с полями и значениями, а также давать полю имя, поэтому вам не придется беспокоиться о будущих версиях. Вы можете добавлять новые поля в любое время, просто читая и записывая их.
Это новая концепция моего предыдущего компонента DzMiniTable.
Поддерживает 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 ;
Имя поля всегда нечувствительно к регистру во всех параметрах методов и свойств.
FileName: string
= Указывает полное имя XML-файла для открытия и сохранения таблицы.
RequiredFile: Boolean
= Когда это свойство отключено (по умолчанию), если файл не существует в методе Open, таблица будет загружена пустой без возникновения каких-либо исключений.
RequiredField: Boolean
= Когда это свойство отключено (по умолчанию), вы можете прочитать несуществующее поле без возникновения и исключения, возвращая значение Unassigned
варианта.
Rec[Index: Integer]: TDzRecord
(свойство компонента по умолчанию) = Возвращает объект записи по индексу.
RecCount: Integer
= Возвращает количество записей.
procedure Load ;
Загрузите таблицу из файла, указанного в свойстве FileName.
procedure Save ;
Сохраните таблицу в файл, указанный в свойстве FileName.
procedure Clear ;
Очистить все данные в таблице
function New (Index: Integer = - 1 ): TDzRecord;
Создает новую запись в таблице и возвращает объект записи. Вы можете указать новую позицию записи в таблице, используя параметр Index
. Если вы оставите Index = -1
, запись будет добавлена в конец таблицы.
procedure Delete (Index: Integer);
Удалить запись по индексу.
function FindIdxByField ( const Name : string; const Value : Variant): Integer;
Возвращает первый индекс записи, соответствующий тому же имени и значению. Если запись не найдена, функция вернет nil
.
function FindRecByField ( const Name : string; const Value : Variant): TDzRecord;
Возвращает первый объект записи, соответствующий тому же имени и значению. Если запись не найдена, функция вернет nil
.
function FindIdxBySameText ( const Name : string; const Value : Variant): Integer;
Возвращает первый индекс записи, соответствующий тому же имени и значению, где значение сравнивается как строка с использованием регистронезависимого значения . Если запись не найдена, функция вернет nil
.
function FindRecBySameText ( const Name : string; const Value : Variant): TDzRecord;
Возвращает первый объект записи, соответствующий тому же имени и значению, где значение сравнивается как строка с использованием регистронезависимого значения . Если запись не найдена, функция вернет nil
.
procedure Move (CurIndex, NewIndex: Integer);
Перемещает запись из позиции CurIndex
в позицию NewIndex
в таблице.
Field[const Name: string]: Variant
= Возвращает или определяет значение поля как вариант по имени поля. При получении значения поля, если поле не существует, будет вызвано исключение, если только свойство RequiredField
не имеет значения False (в этом случае будет возвращено Unassigned
значение. При установке значения поля, если поле не существует, оно будет автоматически создаваться с указанным именем и значением.
FieldIdx[Index: Integer]: TDzField
= Возвращает объект поля по индексу поля.
Внимание: одна запись может содержать поля, отличные от полей другой записи. Таким образом, вам никогда не следует использовать фиксированный индекс для определенного поля (например, столбца) во всех записях.
FieldCount: Integer
= Возвращает количество полей в этой записи.
function ReadDef ( const Name : string; DefValue: Variant): Variant;
Возвращает значение поля по имени поля. Если поле не существует в записи, верните DefValue
.
function FindField ( const Name : string): TDzField;
Возвращает объект поля по имени поля. Если поле не существует, возвращает nil
.
function FieldExists ( const Name : string): Boolean;
Возвращает true, если поле существует по указанному имени.
procedure ClearFields ;
Очистить все данные полей в записи (при этом удаляются не только значения из полей, но и поля целиком).