Интерфейс и подход, которыми я горжусь:
Ik2TagGenerator = interface(IUnknown)
{* Генератор тегов }
['{694DAEA5-80F3-4E12-9CCF-2B9950479734}']
procedure pm_SetCharsInLine(aValue: Integer);
function pm_GetCurrentStartLevel: Integer;
function pm_GetNextGenerator: Ik2TagGenerator;
procedure pm_SetNextGenerator(const aValue: Ik2TagGenerator);
function pm_GetContext: Ik2Op;
function Get_CurrentVersion: Integer;
procedure Set_CurrentVersion(aValue: Integer);
procedure AddStringAtom(TagID: Integer;
const Value: AnsiString;
aCodePage: Integer = CP_ANSI); overload;
{* добавить строковый атом. }
procedure AddPCharLenAtom(TagID: Integer;
const Value: Tl3WString);
{* добавить строковый атом. }
procedure AddObjectAtom(TagID: Integer;
Value: TObject;
Shared: Boolean = true);
procedure AddStreamAtom(TagID: Integer;
aStream: TStream);
{* добавить атом из потока. }
procedure AddTransparentAtom(TagID: Integer);
{* добавить "прозрачный" атом. }
procedure AddIntegerAtom(TagID: Integer;
Value: Integer);
{* добавить целочисленный атом. }
procedure AddBoolAtom(TagID: Integer;
Value: Boolean);
procedure AddAtom(AtomIndex: Integer;
TK: Tk2TypeKind;
const Value);
{* добавить атом. }
procedure AddStringAtom(TagID: Integer;
Value: Tl3PrimString); overload;
procedure AddAtomEx(AtomIndex: Integer;
const Value: Tk2Variant);
procedure Start;
{* начать генерацию. }
procedure StartChild(TypeID: Integer);
{* начать дочерний объект тега. }
procedure StartDefaultChild;
{* начать дочерний объект тега с типом по-умолчанию. }
procedure StartTag(TagID: Integer);
{* начать вложеный тег. }
procedure Finish(NeedUndo: Boolean = false);
{* закрыть скобку этапа генерации. }
procedure Rollback(CheckBrackets: Boolean = false);
{* откатить все открытые "скобки". }
function Pixel2Char(Pixel: Integer): Integer;
function Char2Pixel(Ch: Integer): Integer;
procedure AddStringAtomClone(TagID: Integer;
Value: Tl3CustomString);
procedure AddInt64Atom(aTagID: Integer;
aValue: Int64);
{* Добавляет 64-битный атом }
property CharsInLine: Integer
write pm_SetCharsInLine;
property CurrentStartLevel: Integer
read pm_GetCurrentStartLevel;
property NextGenerator: Ik2TagGenerator
read pm_GetNextGenerator
write pm_SetNextGenerator;
{* следующий генератор в цепочке. }
property Context: Ik2Op
read pm_GetContext;
{* Контекст генерации }
property CurrentVersion: Integer
read Get_CurrentVersion
write Set_CurrentVersion;
{* Текущая версия формата }
end;//Ik2TagGenerator
-- у нас на этом построены все преобразователи форматов различных текстов.
Ну такой "местный" SAX "на коленке".
Ну и конечно к этому прилагается свой DTD.
Ik2TagGenerator = interface(IUnknown)
{* Генератор тегов }
['{694DAEA5-80F3-4E12-9CCF-2B9950479734}']
procedure pm_SetCharsInLine(aValue: Integer);
function pm_GetCurrentStartLevel: Integer;
function pm_GetNextGenerator: Ik2TagGenerator;
procedure pm_SetNextGenerator(const aValue: Ik2TagGenerator);
function pm_GetContext: Ik2Op;
function Get_CurrentVersion: Integer;
procedure Set_CurrentVersion(aValue: Integer);
procedure AddStringAtom(TagID: Integer;
const Value: AnsiString;
aCodePage: Integer = CP_ANSI); overload;
{* добавить строковый атом. }
procedure AddPCharLenAtom(TagID: Integer;
const Value: Tl3WString);
{* добавить строковый атом. }
procedure AddObjectAtom(TagID: Integer;
Value: TObject;
Shared: Boolean = true);
procedure AddStreamAtom(TagID: Integer;
aStream: TStream);
{* добавить атом из потока. }
procedure AddTransparentAtom(TagID: Integer);
{* добавить "прозрачный" атом. }
procedure AddIntegerAtom(TagID: Integer;
Value: Integer);
{* добавить целочисленный атом. }
procedure AddBoolAtom(TagID: Integer;
Value: Boolean);
procedure AddAtom(AtomIndex: Integer;
TK: Tk2TypeKind;
const Value);
{* добавить атом. }
procedure AddStringAtom(TagID: Integer;
Value: Tl3PrimString); overload;
procedure AddAtomEx(AtomIndex: Integer;
const Value: Tk2Variant);
procedure Start;
{* начать генерацию. }
procedure StartChild(TypeID: Integer);
{* начать дочерний объект тега. }
procedure StartDefaultChild;
{* начать дочерний объект тега с типом по-умолчанию. }
procedure StartTag(TagID: Integer);
{* начать вложеный тег. }
procedure Finish(NeedUndo: Boolean = false);
{* закрыть скобку этапа генерации. }
procedure Rollback(CheckBrackets: Boolean = false);
{* откатить все открытые "скобки". }
function Pixel2Char(Pixel: Integer): Integer;
function Char2Pixel(Ch: Integer): Integer;
procedure AddStringAtomClone(TagID: Integer;
Value: Tl3CustomString);
procedure AddInt64Atom(aTagID: Integer;
aValue: Int64);
{* Добавляет 64-битный атом }
property CharsInLine: Integer
write pm_SetCharsInLine;
property CurrentStartLevel: Integer
read pm_GetCurrentStartLevel;
property NextGenerator: Ik2TagGenerator
read pm_GetNextGenerator
write pm_SetNextGenerator;
{* следующий генератор в цепочке. }
property Context: Ik2Op
read pm_GetContext;
{* Контекст генерации }
property CurrentVersion: Integer
read Get_CurrentVersion
write Set_CurrentVersion;
{* Текущая версия формата }
end;//Ik2TagGenerator
-- у нас на этом построены все преобразователи форматов различных текстов.
Ну такой "местный" SAX "на коленке".
Ну и конечно к этому прилагается свой DTD.
Комментариев нет:
Отправить комментарий