2021년 9월 12일(버전 1.2)
2021년 4월 13일(버전 1.1)
2021년 3월 27일 (버전 1.0)
소프트웨어 프로젝트 작업을 할 때 항상 일부 데이터를 구성 파일이나 기타 정보로 INI 파일이나 텍스트 파일에 저장해야 합니다.
따라서 선택할 수 있는 옵션은 INI 파일 또는 일반 텍스트입니다. 그리고 거의 항상 일부 필드가 포함된 테이블이 필요합니다.
일반 텍스트에서는 한 줄에 하나의 레코드를 사용할 수 있으며 탭 문자, 파이프 문자 또는 다른 문자를 사용하여 필드를 구분할 수 있습니다. 하지만 이 방법에는 몇 가지 문제가 있습니다. 구분 문자를 필드 값에 사용하지 않고 주의해야 합니다. 그리고 가장 큰 문제가 있습니다. 향후 버전에서는 열을 추가해야 할 경우 이미 저장된 데이터가 있으면 이 파일의 호환성을 잃게 됩니다.
INI 파일로 작업하는 경우 필드 이름을 지정할 수 있지만, 그래도 섹션당 하나의 레코드를 저장하는 데 문제가 있고, 레코드 순서 변경, 레코드 삭제, 레코드 이름 지정이 어렵습니다.
하지만 걱정하지 마세요. 여기에 해결책이 있습니다.
DzXMLTable은 필드와 값이 포함된 레코드를 저장할 수 있고 필드 이름을 지정할 수 있는 비시각적 구성 요소이므로 향후 버전에서는 걱정할 필요가 없습니다. 언제든지 읽고 쓰기만 하면 새 필드를 추가할 수 있습니다.
이것은 이전 DzMiniTable 구성 요소의 새로운 개념입니다.
델파이 XE3..델파이 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;
필드 이름별로 필드 값을 반환합니다. 레코드에 field가 없으면 DefValue
반환합니다.
function FindField ( const Name : string): TDzField;
필드 이름별로 필드 개체를 반환합니다. 필드가 존재하지 않으면 nil
반환합니다.
function FieldExists ( const Name : string): Boolean;
지정된 필드 이름으로 필드가 존재하는 경우 true를 반환합니다.
procedure ClearFields ;
레코드의 모든 필드 데이터를 지웁니다(필드의 값만 제거하는 것이 아니라 필드 전체를 제거함).