{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}
unit m3DocInfo;
// --------------------------------------------------------------------------
// Родители: "Results" <> MUID: (66FFBFC00196) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3DocInfo.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "m3DocInfo" MUID: (67007FF200B4)
// --------------------------------------------------------------------------
//#UC START# *67007FF200B4beforeDefines*
//#UC END# *67007FF200B4beforeDefines*
{$Include daDefine.inc}
interface
uses
l3IntfUses
, daSchemeTypes
, l3CoreInterfaces
, TypInfo
, daTypes
, m3AttrIndexInterfaces
, m3DBInterfaces
;
type
Tm3DocInfoPtr = ^Tm3DocInfo;
{* Указатель на Tm3DocInfo }
Tm3DocInfo = record
rHTDocInfo: TdaDocListAccessRec;
rName: Il3CString;
rComment: Il3CString;
end;//Tm3DocInfo
IBoxFor_Tm3DocInfo = interface(Il3Box)
['{05AF402D-96BE-453D-8D63-2BD9F5DC6A38}']
function Get_Boxed: Tm3DocInfo;
function Get_pBoxed: Tm3DocInfoPtr;
function Get_rHTDocInfo: TdaDocListAccessRec;
function Get_rName: Il3CString;
function Get_rComment: Il3CString;
property Boxed: Tm3DocInfo
read Get_Boxed;
property pBoxed: Tm3DocInfoPtr
read Get_pBoxed;
property rHTDocInfo: TdaDocListAccessRec
read Get_rHTDocInfo;
property rName: Il3CString
read Get_rName;
property rComment: Il3CString
read Get_rComment;
end;//IBoxFor_Tm3DocInfo
function Tm3DocInfo_E: Tm3DocInfo;
function Tm3DocInfo_C(aDocID: TdaDocID;
const aSearcher: Im3AttrIndexSearcher): Tm3DocInfo; overload;
function Tm3DocInfo_C(aDocID: TdaDocID;
const aBaseName: AnsiString;
const aDB: Im3DB = nil): Tm3DocInfo; overload;
function Tm3DocInfo_TypeInfo: PTypeInfo;
{$If NOT Defined(NoScripts)}
function Tm3DocInfo_ToValue(const aSelf: Tm3DocInfo): TtfwStackValue;
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TtfwStackValue_C(const aSelf: Tm3DocInfo): TtfwStackValue; overload;
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DocInfo_ToBox(const aSelf: Tm3DocInfo): Il3Box;
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DocInfo_FromValue(const aValue: TtfwStackValue): Tm3DocInfo;
{$IfEnd} // NOT Defined(NoScripts)
implementation
uses
l3ImplUses
, l3BoxForStruct
{$If NOT Defined(NoScripts)}
, tfwReadonlyPropertyLike
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwValueTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwScriptingInterfaces
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwConstClassCreator
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassCreator
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwWordInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwAxiomaticsResNameGetter
{$IfEnd} // NOT Defined(NoScripts)
, l3Interfaces
, SysUtils
{$If NOT Defined(NoScripts)}
, TtfwTypeRegistrator_Proxy
{$IfEnd} // NOT Defined(NoScripts)
, l3String
{$If NOT Defined(NoScripts)}
, tfwTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, TtfwClassRef_Proxy
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwRegisterableWordPrim
{$IfEnd} // NOT Defined(NoScripts)
, tfwCStringFactory
//#UC START# *67007FF200B4impl_uses*
, l3MinMax
, l3MarshalledTypes
, l3Chars
, l3Base
//, m3AttrIndexInterfaces
, m3AttrIndexSearcher
, m3DB
//#UC END# *67007FF200B4impl_uses*
;
{$If NOT Defined(NoScripts)}
type
TkwTm3DocInfoRName = TtfwReadonlyPropertyLike;
{* Слово скрипта m3DocInfo:rName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
type
TkwTm3DocInfoRComment = TtfwReadonlyPropertyLike;
{* Слово скрипта m3DocInfo:rComment }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
type
TkwTm3DocInfoE = TtfwConstClassCreator;
{* Слово скрипта m3DocInfo:E }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
type
TkwTm3DocInfoC = TtfwClassCreator;
{* Слово скрипта m3DocInfo:C }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
type
TkwTm3DocInfoC1 = TtfwClassCreator;
{* Слово скрипта m3DocInfo:C|1 }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts) AND NOT Defined(LINUX)}
type
TTm3DocInfoKeywordsPackResNameGetter = {final} class(TtfwAxiomaticsResNameGetter)
{* Регистрация скриптованой аксиоматики }
public
class function ResName: AnsiString; override;
end;//TTm3DocInfoKeywordsPackResNameGetter
{$IfEnd} // NOT Defined(NoScripts) AND NOT Defined(LINUX)
{$If NOT Defined(NoScripts)}
type
TBoxFor_Tm3DocInfo = {final} class(Tl3BoxForStruct, IBoxFor_Tm3DocInfo)
private
f_Boxed: Tm3DocInfo;
protected
function Get_Boxed: Tm3DocInfo;
function Get_pBoxed: Tm3DocInfoPtr;
function Get_rHTDocInfo: TdaDocListAccessRec;
function Get_rName: Il3CString;
function Get_rComment: Il3CString;
function GetDataPtr: Pointer; override;
function GetDataSize: Integer; override;
function GetBoxTypeInfo: PTypeInfo; override;
function GetAsPrintable(const aCtx: TtfwContextStub): Il3CString; override;
procedure ClearFields; override;
public
constructor Create(const aBoxed: Tm3DocInfo); reintroduce;
class function Make(const aBoxed: Tm3DocInfo): IBoxFor_Tm3DocInfo; reintroduce;
end;//TBoxFor_Tm3DocInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DocInfoRName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DocInfoRName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DocInfoRName_DoIt(const aCtx: TtfwContext);
var l_aSelf: IBoxFor_Tm3DocInfo;
begin
try
l_aSelf := IBoxFor_Tm3DocInfo(aCtx.rEngine.Pop.AsIntf(TypeInfo(IBoxFor_Tm3DocInfo)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: IBoxFor_Tm3DocInfo : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(l_aSelf.rName);
end;//TkwTm3DocInfoRName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DocInfoRComment_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DocInfoRComment_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DocInfoRComment_DoIt(const aCtx: TtfwContext);
var l_aSelf: IBoxFor_Tm3DocInfo;
begin
try
l_aSelf := IBoxFor_Tm3DocInfo(aCtx.rEngine.Pop.AsIntf(TypeInfo(IBoxFor_Tm3DocInfo)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: IBoxFor_Tm3DocInfo : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(l_aSelf.rComment);
end;//TkwTm3DocInfoRComment_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DocInfoE_DoIt(const aCtx: TtfwContext);
begin
aCtx.rEngine.Push(Tm3DocInfo_ToValue(Tm3DocInfo_E));
end;//TkwTm3DocInfoE_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DocInfoC_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aDocID', TtfwValueTypes.MakeTypedef('TdaDocID', TypeInfo(TdaDocID))), TtfwParamInfo_C('aSearcher', TypeInfo(Im3AttrIndexSearcher))]);
end;//TkwTm3DocInfoC_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DocInfoC_DoIt(const aCtx: TtfwContext);
var l_aDocID: TdaDocID;
var l_aSearcher: Im3AttrIndexSearcher;
begin
try
l_aDocID := aCtx.rEngine.PopInt(TypeInfo(TdaDocID));
except
on E: Exception do
begin
aCtx.GetParamError('aDocID: TdaDocID : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aSearcher := Im3AttrIndexSearcher(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3AttrIndexSearcher)));
except
on E: Exception do
begin
aCtx.GetParamError('aSearcher: Im3AttrIndexSearcher : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.Push(Tm3DocInfo_ToValue(Tm3DocInfo_C(l_aDocID, l_aSearcher)));
end;//TkwTm3DocInfoC_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DocInfoC1_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aDocID', TtfwValueTypes.MakeTypedef('TdaDocID', TypeInfo(TdaDocID))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString), TtfwParamInfo_C('aDB', TypeInfo(Im3DB))]);
end;//TkwTm3DocInfoC1_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DocInfoC1_DoIt(const aCtx: TtfwContext);
var l_aDocID: TdaDocID;
var l_aBaseName: AnsiString;
var l_aDB: Im3DB;
begin
try
l_aDocID := aCtx.rEngine.PopInt(TypeInfo(TdaDocID));
except
on E: Exception do
begin
aCtx.GetParamError('aDocID: TdaDocID : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aDB := Im3DB(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3DB)));
except
on E: Exception do
begin
aCtx.GetParamError('aDB: Im3DB : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.Push(Tm3DocInfo_ToValue(Tm3DocInfo_C(l_aDocID, l_aBaseName, l_aDB)));
end;//TkwTm3DocInfoC1_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeBox('Tm3DocInfo', Tm3DocInfo_TypeInfo);
end;//Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
function Tm3DocInfo_E: Tm3DocInfo;
//#UC START# *670081770260_6700802503E3_var*
//#UC END# *670081770260_6700802503E3_var*
begin
Finalize(Result);
System.FillChar(Result, SizeOf(Result), 0);
//#UC START# *670081770260_6700802503E3_impl*
// - ничего не делаем
//#UC END# *670081770260_6700802503E3_impl*
end;//Tm3DocInfo_E
function Tm3DocInfo_C(aDocID: TdaDocID;
const aSearcher: Im3AttrIndexSearcher): Tm3DocInfo;
//#UC START# *67008A0402D4_6700802503E3_var*
var
l_Searcher : Im3AttrIndexSearcher;
l_Len : Integer;
l_Type : TDocType;
l_UserType : TUserType;
l_S : Tl3WString;
l_SS : AnsiString;
//#UC END# *67008A0402D4_6700802503E3_var*
begin
Finalize(Result);
System.FillChar(Result, SizeOf(Result), 0);
//#UC START# *67008A0402D4_6700802503E3_impl*
Result.rHTDocInfo.rID := aDocID;
Result.rHTDocInfo.rExtID := -1;
Assert(aSearcher <> nil);
l_Searcher := aSearcher;
(* if (aDB <> nil) then
l_Searcher := Tm3AttrIndexSearcher.Make(aDB)
else
l_Searcher := Tm3AttrIndexSearcher.Make(Tm3DB.Make(aBaseName));*)
//l_Searcher := Tm3AttrIndexSearcher.Make(aBaseName);
Result.rHTDocInfo.rExtID := l_Searcher.InternalHandleToExternalHandle(Result.rHTDocInfo.rID);
l_Type := l_Searcher.TypeByID(Result.rHTDocInfo.rID);
if (Ord(l_Type) >= Low(Result.rHTDocInfo.rTyp)) AND (Ord(l_Type) <= High(Result.rHTDocInfo.rTyp)) then
Result.rHTDocInfo.rTyp := Ord(l_Type);
l_UserType := l_Searcher.UserTypeByID(Result.rHTDocInfo.rID);
if (Ord(l_UserType) >= Low(Result.rHTDocInfo.rFlag)) AND (Ord(l_UserType) <= High(Result.rHTDocInfo.rFlag)) then
Result.rHTDocInfo.rFlag := Ord(l_UserType);
Result.rHTDocInfo.rIsActive := true;
// - пока так. Пока не научусь вычислять.
if Result.rHTDocInfo.rIsActive then
begin
if (l_UserType = utEdition) then
Result.rHTDocInfo.rIsActive := false;
end;//Result.rHTDocInfo.rIsActive
Result.rName := l_Searcher.NameByInternalHandle(Result.rHTDocInfo.rID);
if (Result.rName <> nil) then
begin
l_S := Result.rName.AsWStr;
if (l_S.SCodePage = CP_Unicode)
OR (l_S.SCodePage = CP_UTF8)
then
begin
l_SS := l3Str(l_S);
l_SS := l3CCP(l_SS);
l_Len := Length(l_SS);
if (l_Len > 0) then
begin
Inc(l_Len);
l_Len := Min(l_Len, SizeOf(TdaFullNameStr));
l3Move(l_SS[1], Result.rHTDocInfo.rName, l_Len);
end;//l_Len > 0
end//l_S.SCodePage = CP_Unicode
else
begin
Assert(l_S.SCodePage <> CP_Unicode);
Assert(l_S.SCodePage <> CP_UTF8);
l_Len := l_S.SLen;
if (l_Len > 0) then
begin
Inc(l_Len);
l_Len := Min(l_Len, SizeOf(TdaFullNameStr));
l3Move(l_S.S^, Result.rHTDocInfo.rName, l_Len);
end;//l_Len > 0
end;//l_S.SCodePage = CP_Unicode
end;//Result.rName <> nil
Result.rComment := l_Searcher.CommentByInternalHandle(Result.rHTDocInfo.rID);
if (Result.rComment <> nil) then
begin
l_S := Result.rComment.AsWStr;
if (l_S.SCodePage = CP_Unicode)
OR (l_S.SCodePage = CP_UTF8)
then
begin
l_SS := l3Str(l_S);
l_SS := l3CCP(l_SS);
l_Len := Length(l_SS);
if (l_Len > 0) then
begin
Inc(l_Len);
l_Len := Min(l_Len, SizeOf(TdaDocCommentStr));
l3Move(l_SS[1], Result.rHTDocInfo.rComment, l_Len);
end;//l_Len > 0
end//l_S.SCodePage = CP_Unicode
else
begin
Assert(l_S.SCodePage <> CP_Unicode);
Assert(l_S.SCodePage <> CP_UTF8);
l_Len := l_S.SLen;
if (l_Len > 0) then
begin
Inc(l_Len);
l_Len := Min(l_Len, SizeOf(TdaDocCommentStr));
l3Move(l_S.S^, Result.rHTDocInfo.rComment, l_Len);
end;//l_Len > 0
end;//l_S.SCodePage = CP_Unicode
end;//Result.rComment <> nil
//#UC END# *67008A0402D4_6700802503E3_impl*
end;//Tm3DocInfo_C
function Tm3DocInfo_C(aDocID: TdaDocID;
const aBaseName: AnsiString;
const aDB: Im3DB = nil): Tm3DocInfo;
//#UC START# *697E0AFD03C6_6700802503E3_var*
//#UC END# *697E0AFD03C6_6700802503E3_var*
begin
Finalize(Result);
System.FillChar(Result, SizeOf(Result), 0);
//#UC START# *697E0AFD03C6_6700802503E3_impl*
if (aDB <> nil) then
Result := Tm3DocInfo_C(aDocID, Tm3AttrIndexSearcher.Make(aDB))
else
Result := Tm3DocInfo_C(aDocID, Tm3AttrIndexSearcher.Make(Tm3DB.Make(aBaseName)));
//#UC END# *697E0AFD03C6_6700802503E3_impl*
end;//Tm3DocInfo_C
function Tm3DocInfo_TypeInfo: PTypeInfo;
begin
Result := TypeInfo(IBoxFor_Tm3DocInfo);
end;//Tm3DocInfo_TypeInfo
{$If NOT Defined(NoScripts)}
function Tm3DocInfo_ToValue(const aSelf: Tm3DocInfo): TtfwStackValue;
begin
Result := TtfwStackValue_C(Tm3DocInfo_ToBox(aSelf), Tm3DocInfo_TypeInfo);
end;//Tm3DocInfo_ToValue
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TtfwStackValue_C(const aSelf: Tm3DocInfo): TtfwStackValue;
begin
Result := TtfwStackValue_C(Tm3DocInfo_ToBox(aSelf), Tm3DocInfo_TypeInfo);
end;//TtfwStackValue_C
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DocInfo_ToBox(const aSelf: Tm3DocInfo): Il3Box;
begin
Result := TBoxFor_Tm3DocInfo.Make(aSelf);
end;//Tm3DocInfo_ToBox
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DocInfo_FromValue(const aValue: TtfwStackValue): Tm3DocInfo;
begin
Finalize(Result);
System.FillChar(Result, SizeOf(Result), 0);
Result := IBoxFor_Tm3DocInfo(aValue.AsIntf(Tm3DocInfo_TypeInfo)).pBoxed^;
end;//Tm3DocInfo_FromValue
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts) AND NOT Defined(LINUX)}
class function TTm3DocInfoKeywordsPackResNameGetter.ResName: AnsiString;
begin
Result := 'Tm3DocInfoKeywordsPack';
end;//TTm3DocInfoKeywordsPackResNameGetter.ResName
{$R Tm3DocInfoKeywordsPack.res}
{$IfEnd} // NOT Defined(NoScripts) AND NOT Defined(LINUX)
{$If NOT Defined(NoScripts)}
constructor TBoxFor_Tm3DocInfo.Create(const aBoxed: Tm3DocInfo);
begin
inherited Create;
f_Boxed := aBoxed;
end;//TBoxFor_Tm3DocInfo.Create
class function TBoxFor_Tm3DocInfo.Make(const aBoxed: Tm3DocInfo): IBoxFor_Tm3DocInfo;
var
l_Inst : TBoxFor_Tm3DocInfo;
begin
l_Inst := Create(aBoxed);
try
Result := l_Inst;
finally
l_Inst.Free;
end;//try..finally
end;//TBoxFor_Tm3DocInfo.Make
function TBoxFor_Tm3DocInfo.Get_Boxed: Tm3DocInfo;
begin
Result := f_Boxed;
end;//TBoxFor_Tm3DocInfo.Get_Boxed
function TBoxFor_Tm3DocInfo.Get_pBoxed: Tm3DocInfoPtr;
begin
Result := @f_Boxed;
end;//TBoxFor_Tm3DocInfo.Get_pBoxed
function TBoxFor_Tm3DocInfo.Get_rHTDocInfo: TdaDocListAccessRec;
begin
Result := f_Boxed.rHTDocInfo;
end;//TBoxFor_Tm3DocInfo.Get_rHTDocInfo
function TBoxFor_Tm3DocInfo.Get_rName: Il3CString;
begin
Result := f_Boxed.rName;
end;//TBoxFor_Tm3DocInfo.Get_rName
function TBoxFor_Tm3DocInfo.Get_rComment: Il3CString;
begin
Result := f_Boxed.rComment;
end;//TBoxFor_Tm3DocInfo.Get_rComment
function TBoxFor_Tm3DocInfo.GetDataPtr: Pointer;
begin
Result := @f_Boxed;
end;//TBoxFor_Tm3DocInfo.GetDataPtr
function TBoxFor_Tm3DocInfo.GetDataSize: Integer;
begin
Result := SizeOf(f_Boxed);
end;//TBoxFor_Tm3DocInfo.GetDataSize
function TBoxFor_Tm3DocInfo.GetBoxTypeInfo: PTypeInfo;
begin
Result := TypeInfo(IBoxFor_Tm3DocInfo);
end;//TBoxFor_Tm3DocInfo.GetBoxTypeInfo
function TBoxFor_Tm3DocInfo.GetAsPrintable(const aCtx: TtfwContextStub): Il3CString;
var
l_Value: AnsiString;
begin
l_Value := '(';
l_Value := l_Value + ' rName: ';
l_Value := l_Value + l3StrEx(f_Boxed.rName);
l_Value := l_Value + ';';
l_Value := l_Value + ' rComment: ';
l_Value := l_Value + l3StrEx(f_Boxed.rComment);
l_Value := l_Value + ';';
l_Value := l_Value + ' )';
Result := TtfwCStringFactory.C(l_Value);
end;//TBoxFor_Tm3DocInfo.GetAsPrintable
procedure TBoxFor_Tm3DocInfo.ClearFields;
begin
Finalize(f_Boxed);
inherited;
end;//TBoxFor_Tm3DocInfo.ClearFields
{$IfEnd} // NOT Defined(NoScripts)
initialization
{$If NOT Defined(NoScripts)}
TkwTm3DocInfoRName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DocInfoRName_Il3CString_ResultTypeInfo)
.SetDoItProc(TkwTm3DocInfoRName_DoIt)
.SetMethodName('rName'), ['m3DocInfo:rName', '.Tm3DocInfo.rName', 'pop:m3DocInfo:rName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DocInfoRComment.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DocInfoRComment_Il3CString_ResultTypeInfo)
.SetDoItProc(TkwTm3DocInfoRComment_DoIt)
.SetMethodName('rComment'), ['m3DocInfo:rComment', '.Tm3DocInfo.rComment', 'pop:m3DocInfo:rComment']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DocInfoE.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo)
.SetDoItProc(TkwTm3DocInfoE_DoIt)
.SetMethodName('E'), ['m3DocInfo:E', 'Tm3DocInfo::E', 'm3DocInfo::E']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DocInfoC.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo)
.SetParamsTypesFunc(TkwTm3DocInfoC_ParamsTypes)
.SetDoItProc(TkwTm3DocInfoC_DoIt)
.SetMethodName('C'), ['m3DocInfo:C', '.Tm3DocInfo.C']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DocInfoC1.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DocInfoKeywordsPack_Tm3DocInfo_SelfTypeInfo)
.SetParamsTypesFunc(TkwTm3DocInfoC1_ParamsTypes)
.SetDoItProc(TkwTm3DocInfoC1_DoIt)
.SetMethodName('C'), ['m3DocInfo:C|1', '.Tm3DocInfo.C|1']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts) AND NOT Defined(LINUX)}
TTm3DocInfoKeywordsPackResNameGetter.Register;
{$IfEnd} // NOT Defined(NoScripts) AND NOT Defined(LINUX)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwValueTypes.MakeBox('Tm3DocInfo', Tm3DocInfo_TypeInfo));
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwValueTypes.MakeTypedef('TdaDocID', TypeInfo(TdaDocID)));
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeString
, 'Стандартный строковый тип Delphi.');
{$IfEnd} // NOT Defined(NoScripts)
//#UC START# *67007FF200B4forDiagramm*
(*
[*
=============================================================================
m3DocInfo.pas
Структура документа для списков и выборок
=============================================================================
--------------------------------------------------------------------------¬
¦ Tm3DocInfo (record) ¦
¦ Структура документа для GUI и скриптов ¦
+-------------------------------------------------------------------------+
¦ Поля: ¦
¦ ¦
¦ rHTDocInfo: TdaDocListAccessRec // HyTech-совместимая часть ¦
¦ rName: Il3CString // имя (интернированная строка) ¦
¦ rComment: Il3CString // комментарий (интернированная) ¦
¦ ¦
L--------------------------------------------------------------------------
¦
v
--------------------------------------------------------------------------¬
¦ TdaDocListAccessRec (record) ¦
¦ Структура из HyTech, статические буферы ¦
+-------------------------------------------------------------------------+
¦ Поля: ¦
¦ rID: TdaDocID // внутренний ID документа ¦
¦ rExtID: TdaDocID // внешний ID (для пользователя) ¦
¦ rTyp: Byte // тип (dtLaw, dtLetter, dtRelText) ¦
¦ rFlag: Byte // флаги (utEdition, utNone...) ¦
¦ rName: array[1..255] of AnsiChar // имя (статический буфер) ¦
¦ rUrgency: Byte // срочность ¦
¦ rStatus: Word // статус ¦
¦ rIsActive: LongBool // активен? ¦
¦ rIsInclude: LongBool (опц.) // включён в выборку? ¦
¦ rComment: array[1..255] of AnsiChar // комментарий ¦
L--------------------------------------------------------------------------
=============================================================================
КОНСТРУКТОРЫ
=============================================================================
--------------------------------------------------------------------------¬
¦ function Tm3DocInfo_C(aDocID: TdaDocID; ¦
¦ const aSearcher: Im3AttrIndexSearcher): Tm3DocInfo¦
¦ ¦
¦ Загружает информацию о документе из индексов: ¦
¦ ¦
¦ 1. rHTDocInfo.rID := aDocID ¦
¦ 2. rHTDocInfo.rExtID := aSearcher.InternalHandleToExternalHandle(ID) ¦
¦ 3. rHTDocInfo.rTyp := Ord(aSearcher.TypeByID(ID)) ¦
¦ 4. rHTDocInfo.rFlag := Ord(aSearcher.UserTypeByID(ID)) ¦
¦ 5. rName := aSearcher.NameByInternalHandle(ID) ¦
¦ 6. rComment := aSearcher.CommentByInternalHandle(ID) ¦
¦ 7. Копирование rName/rComment в статические буферы rHTDocInfo ¦
¦ ¦
¦ Вся информация из индексов! Документ не открывается. ¦
L--------------------------------------------------------------------------
--------------------------------------------------------------------------¬
¦ function Tm3DocInfo_C(aDocID: TdaDocID; ¦
¦ const aBaseName: AnsiString; ¦
¦ const aDB: Im3DB = nil): Tm3DocInfo ¦
¦ ¦
¦ Создаёт Tm3AttrIndexSearcher по aBaseName или aDB, ¦
¦ затем вызывает первый конструктор. ¦
L--------------------------------------------------------------------------
=============================================================================
ИНТЕРФЕЙСЫ ДЛЯ СКРИПТОВ
=============================================================================
--------------------------------------------------------------------------¬
¦ IBoxFor_Tm3DocInfo = interface(Il3Box) ¦
¦ ¦
¦ Свойства: ¦
¦ Boxed: Tm3DocInfo ¦
¦ pBoxed: ^Tm3DocInfo ¦
¦ rHTDocInfo: TdaDocListAccessRec ¦
¦ rName: Il3CString ¦
¦ rComment: Il3CString ¦
¦ ¦
L--------------------------------------------------------------------------
--------------------------------------------------------------------------¬
¦ Скриптовые слова (MSS) ¦
+-------------------------------------------------------------------------+
¦ ¦
¦ m3DocInfo:rName // получить имя документа ¦
¦ m3DocInfo:rComment // получить комментарий ¦
¦ m3DocInfo:E // пустой документ ¦
¦ m3DocInfo:C // создать по ID и Searcher ¦
¦ m3DocInfo:C|1 // создать по ID и BaseName ¦
¦ ¦
¦ Пример в скрипте: ¦
¦ VAR l_Doc = m3DocInfo:C(10003000, l_Searcher) ¦
¦ l_Doc .~ rName . ¦
¦ ¦
L--------------------------------------------------------------------------
=============================================================================
КЭШИРОВАНИЕ
=============================================================================
--------------------------------------------------------------------------¬
¦ Двойное хранение имени и комментария ¦
+-------------------------------------------------------------------------+
¦ ¦
¦ rName: Il3CString // для скриптов, сравнения, интернир.¦
¦ rHTDocInfo.rName: array[255] // для HyTech, старый код, ISAM ¦
¦ ¦
¦ При загрузке: ¦
¦ 1. Получаем rName из индекса (Il3CString) ¦
¦ 2. Копируем в rHTDocInfo.rName (статический буфер) ¦
¦ ¦
¦ Преимущества: ¦
¦ - Старый код (HyTech) работает с rHTDocInfo.rName ¦
¦ - Новый код (скрипты, интерфейсы) работает с rName ¦
¦ - Интернирование строк (Il3CString) экономит память ¦
¦ ¦
L--------------------------------------------------------------------------
=============================================================================
ПОЛНЫЙ ПОТОК ДАННЫХ
=============================================================================
Индексы (m3AttrIndex)
v
Im3AttrIndexSearcher:
- InternalHandleToExternalHandle(ID) > внешний ID
- TypeByID(ID) > тип документа
- UserTypeByID(ID) > флаги
- NameByInternalHandle(ID) > имя (Il3CString)
- CommentByInternalHandle(ID) > комментарий (Il3CString)
v
--------------------------------------------------------------------------¬
¦ Tm3DocInfo_C ¦
¦ ¦
¦ rHTDocInfo.rID := ID ¦
¦ rHTDocInfo.rExtID := ExternalHandle ¦
¦ rHTDocInfo.rTyp := Ord(Type) ¦
¦ rHTDocInfo.rFlag := Ord(UserType) ¦
¦ rName := Name ¦
¦ rComment := Comment ¦
¦ Копирование Name и Comment в rHTDocInfo.rName/rComment ¦
¦ ¦
L--------------------------------------------------------------------------
v
--------------------------------------------------------------------------¬
¦ Tm3DocInfoHolder ¦
¦ ¦
¦ IPdaDocListAccessRecHolder.Get_Holed > PdaDocListAccessRec ¦
¦ v ¦
¦ @rHTDocInfo (указатель на HyTech-структуру) ¦
¦ ¦
L--------------------------------------------------------------------------
v
--------------------------------------------------------------------------¬
¦ QueryResultSet / GUI / Скрипты ¦
¦ ¦
¦ - GUI получает PdaDocListAccessRec (старый формат) ¦
¦ - Скрипты получают IBoxFor_Tm3DocInfo (новый формат) ¦
¦ ¦
L--------------------------------------------------------------------------
=============================================================================
КЛЮЧЕВЫЕ ПРИНЦИПЫ
=============================================================================
1. ВСЁ ИЗ ИНДЕКСОВ
- Ни одного открытия документа для отображения списка
- Имя и комментарий из индексов, не из EVD
2. ДВОЙНОЕ ХРАНЕНИЕ
- Il3CString — для нового кода (интернирование, безопасность)
- Статический буфер — для старого кода (HyTech, ISAM)
3. ОБРАТНАЯ СОВМЕСТИМОСТЬ
- TdaDocListAccessRec не менялась 30 лет
- Старый код читает её напрямую из файлов
4. ИНТЕГРАЦИЯ С MSS
- Полный набор скриптовых слов
- Документ доступен из скриптов как объект
5. ОПТИМИЗАЦИЯ ПАМЯТИ
- Интернирование строк (Il3CString)
- Статические буферы фиксированного размера (255 байт)
=============================================================================
СВЯЗЬ С ДРУГИМИ МОДУЛЯМИ
=============================================================================
m3AttrIndexSearcher (индексы)
v
NameByInternalHandle, CommentByInternalHandle, TypeByID, ...
v
m3DocInfo (Tm3DocInfo, Tm3DocInfo_C)
v
m3QueryResultSetFromLongintList (Tm3DocInfoHolder, GetItem)
v
daSchemeTypes (TdaDocListAccessRec, PdaDocListAccessRec)
v
GUI / Скрипты
=============================================================================
*]
*)
//#UC END# *67007FF200B4forDiagramm*
end.
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
воскресенье, 12 апреля 2026 г.
m3DocInfo
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий