воскресенье, 12 апреля 2026 г.

m3DocInfo

{$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.

Комментариев нет:

Отправить комментарий