unit uFrmModel;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ToolWin, Grids, DBGrids, ExtCtrls, ADODB, DB, StdCtrls,
  dbcgrids, ValEdit, uCommon, Menus ,QuickRpt, QRCtrls,Printers, IMM;const
    nHKL_LIST = 20;
    
type
    sortString=record
    fieldName:string;
    sortType:String;
end;Type
    SelectButton=record
    BTN:Tpanel;
    RowIndex:integer;
end;TYPE
    SpecialValueS=record
    TabIndex:integer;
    ValueName:String;
    Kind:Integer;         // 0:Deault Value   1:Lock Value    2: Auto Increase Value   3:Cannot Modify
    value:String;
end;type
  TFrmModel = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Splitter1: TSplitter;
    DBGrid1: TDBGrid;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    ValueListEditor1: TValueListEditor;
    TabSheet2: TTabSheet;
    BTN_Select: TPanel;
    ValueListEditor2: TValueListEditor;
    CoolBar1: TCoolBar;
    ToolBar1: TToolBar;
    ToolButton10: TToolButton;
    ToolButton2: TToolButton;
    TB_ADD: TToolButton;
    TB_EDIT: TToolButton;
    TB_DEL: TToolButton;
    ToolButton6: TToolButton;
    ToolButton8: TToolButton;
    ToolButton1: TToolButton;
    TB_CHECK: TToolButton;
    TB_PRINT: TToolButton;
    ToolBar2: TToolBar;
    TB_Save: TToolButton;
    TB_Cancle: TToolButton;
    TB_Refresh: TToolButton;
    TB_Menu_DropDown: TPopupMenu;
    StatusBar1: TStatusBar;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ToolButton1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ToolButton10Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure TB_DELClick(Sender: TObject);
    procedure TB_EDITClick(Sender: TObject);
    procedure ToolButton13Click(Sender: TObject);
    procedure ToolButton8Click(Sender: TObject);
    procedure MyADOScroll(DataSet: TDataSet);
    procedure TB_ADDClick(Sender: TObject);
    procedure TB_CancleClick(Sender: TObject);
    procedure TB_SaveClick(Sender: TObject);
    procedure BTN_SelectClick(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure TB_RefreshClick(Sender: TObject);    Procedure DoInsertSpecialValue;
    Procedure DoUpdateSpecialValue;    procedure ValueListEditor1StringsChange(Sender: TObject);
    procedure TB_PRINTClick(Sender: TObject);
    procedure TB_CHECKClick(Sender: TObject);
    procedure ValueListEditor1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    procedure ValueListEditor1DrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure ValueListEditor2Enter(Sender: TObject);
    Procedure RefreshSelectButton;
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);    //**********************************
    //   输入法系列函数
    //**********************************
    function GetImeFileName: string;
    function SetActivateIme(sWanted: string): boolean;
    procedure ToChinese(hWindows: THandle; bChinese: boolean);
    procedure ValueListEditor1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ValueListEditor1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure PageControl1Changing(Sender: TObject;
      var AllowChange: Boolean);
    procedure N3Click(Sender: TObject);
    procedure TB_Menu_DropDownPopup(Sender: TObject);  private
    { Private declarations }    FirstActive:Boolean;
    DataSource:TDataSource;
    SelectBTN:array of SelectButton;    ValueLock:boolean;
    //************************************
    //   为 Update 准备 的 String;
    //************************************
    CaptionStrings:TStrings;
    StartStrings:TStrings;
    EndStrings:TStrings;    //************************************
    //     为  从表  准备的 ADO 控件
    //************************************    DataSource2:TDatasource;  protected
    ActionString:String;    InsertSPValues:array of specialValues;
    UpdateSPValues:array of specialValues;
    DisableEditField:array of specialValues;
    EnableEditField:Array of SpecialValues;
    isDisableOrEnable:integer;                  //*****   0: N/A   1:Disable First  2:Enable First  
    
    CheckFieldName:String;          //  缺省的 "生效" 作用字段名称
    CheckFieldValue:integer;        //  “生效”的  字段值    FieldTypes:TStrings;
    FieldNameS:TStrings;
    FKFieldNames:TStrings;          // 为了在 ValueListEditor中 进行 PopUP 用
    FKFieldSQLS:TStrings;
    FKFieldValueFieldS:TStrings;    //************************************
    //     为从表准备 的Ado  String
    //************************************
    DetailSQLString:String;
    MasterFields:String;            //  主表中的   字段
    DetailFields:String;            //   从表中的  字段
    LogID:String;    //*************************************
    Procedure InsertSpecialValue(TabIndex:integer;ValueName:String;Kind:integer;Value:String); // 0:Deault Value   1:Lock Value    2: Auto Increase Value
    Procedure UpdateSpecialValue(TabIndex:integer;ValueName:String;Kind:integer;Value:String); // 0:Deault Value   1:Lock Value    2: Auto Increase Value
    Procedure DisableEditValue(TabIndex:integer;FieldName:String;DisabledAction:Integer);
    Procedure EnableEditValue(TabIndex:integer;FieldName:String;EnabledAction:Integer);
    
    Procedure SetFilter(UnitInfoIndex:integer;FieldName,Sql,ValueCaption:String);
    Procedure SetCheckField(FieldName:String;FieldValue:integer);    //Procedure OpenLog;
    //Procedure CloseLog;
      public
    { Public declarations }
    sortStrings1,sortStrings2:array of sortString;
    strSort1,strSort2:String;    OldViewAdoQuerySQL:String;    ViewSql:String;                  //上半部分的显示用 SQL 语句
    ModuleListIndex:integer;         //该窗口在 Frmmain.ModuleLists中所在的位置
    TableName:String;                //  所操作的  Table  表名称
    CompanyID:String;
    actionName:string;               // 该模块的名称
    Action:integer;                  // 0:没有操作   1:New     2:Edit
    keyFieldString:String;           // 主键 字符串    //*****************************************************************
    //*****************************************************************
    ViewAdoquery:TAdoquery;
    AdoDataSet2:TAdoDataSet;
    FilterString:String;             //  ViewAdoquery中的Filter的字符串
    FilterSetString:String;          //  在 FrmFilter中 返回的字符串
    LocateString1,LocateString2:String;    allowEditAfterCheck:boolean;     //  允许  在生效后继续修改    UnitInfo:array of UnitInfomation;    procedure ShowSelect;
    procedure ErrorInfoFeedBack(err:exception);
    Procedure EditCurrentFieldValue(TableName:String;FieldName:String;Value:String);  end;var
  FrmModel: TFrmModel;implementationuses uFrmDataConnection, uFrmmain,  uFrmFilter, uFrmSelect, uFrmPrint,
  uFrmView, uFrmPrintSet, uFrmInfoFeedBack;{$R *.dfm}

解决方案 »

  1.   

    unit uCommon;interfaceuses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, ExtCtrls, ComCtrls, StdCtrls, Menus, ADODB, Registry, ComObj, DBGrids;// ****************************
    //  FrmModel_Tree:树状结构维护
    //*****************************
    Type
        PRecNode=^recNode;
        recNode=Record          //****  表“Tree节点 ” ****
        nodeID:String;          //  节点ID
        FAID:String;            //  方案ID (主键)
        Code:String;            //  代码   (主键)
        Name:String;            //  名称
        Level:integer;          //  层次
        Index:integer;          //  层内序号
        ParentNodeID:String;    //  父节点ID
        Memo:String;            //  说明
    end;type
        arrayNodes=record
        nodes:array of recNode;
    end;//***********************************
    //   文件的版本号
    //***********************************
    Type
      PFixedFileInfo = ^TFixedFileInfo;
      TFixedFileInfo = record
         dwSignature       : DWORD;
         dwStrucVersion    : DWORD;
         wFileVersionMS    : WORD;  // 次版本号
         wFileVersionLS    : WORD;  // 主版本号
         wProductVersionMS : WORD;  // 建立次数(build)
         wProductVersionLS : WORD;  // 发行次数(release)
         dwFileFlagsMask   : DWORD;
         dwFileFlags       : DWORD;
         dwFileOS          : DWORD;
         dwFileType        : DWORD;
         dwFileSubtype     : DWORD;
         dwFileDateMS      : DWORD;
         dwFileDateLS      : DWORD;
      end; // TFixedFileInfoType
        UserInfomation=record
        UserID:String;
        UserName:String;
        UserPassword:String;
        CompanyID:String;
        CompanyName:String;
        LogInTime:TDateTime;
    end;
    Type
        UnitInfomation=record
        UI_Index:integer;
        UI_PageName:String;
        UI_ViewSQL:widestring;
        UI_TableName:String;
        UI_DetailSQLString:String;
        UI_MasterFields:String;
        UI_DetailFields:String;
        UI_FKFieldNames:TStrings;           //*** setFilter 的 触发键 名称
        UI_FKFieldSQLs:TStrings;            //*** setFilter 的 显示 SQL
        UI_FKFieldValueFields:TStrings;     //*** setFilter 的 返回键名称
        UI_FKTreeTableNames:TStrings;       //*** SetFilter 的 Tree方案 中的表名称(新:根据其判断是否显示 FrmModel_Tree)
        UI_UpdateWhereFields:String;
    end;type
        ModuleList=record
        nodeIndex:integer;
        moduleID:string;
        moduleName:String;
        MGid:string;
        MGname:string;
        companyId:String;
        companyName:String;
        ModuleFormName:String;
        UM_ADD:integer;
        UM_EDIT:integer;
        UM_DEL:integer;
        UM_CHECK:integer;
        UM_Print:integer;
        UM_1:integer;
        UM_2:integer;
        UM_3:integer;
        UM_4:integer;
        UM_5:integer;
        UM_6:integer;
    end;
      

  2.   

    const     strCrLf:String=chr(13)+chr(10);
        const     isLimitNeeded:Boolean=False;        //  false :无限  ,true :受限
        Const     LimitDate:integer=30;               //需要限制使用日期 :30天    Procedure ShowUserModule(UserID:String;Company_ID:String;Viewer:TTreeView);    Function GetNodeCompany(Viewer:TTreeView;IsName:Boolean):String;
        Function CanOpenModule(CompanyID:String;UserID:String;FormName:String):Boolean;
        Function GetServerDateTime(DateTimeField:String):String;
        function GetWindowsDir: String;
        function EncodeString(Decoded:string):String;
        function EncodeBASE64(Encoded: TMemoryStream {TMailText}; Decoded: TMemoryStream): Integer; //编码函数
        function GetIdeDiskSerialNumber:String;       //取得 硬盘序列号
        function isLimit:boolean;
        function FileInfo( const FileName :String ) : TFixedFileInfo;    procedure CopyDbDataToExcel(Args: array of const);     // ***  将 DBGrid 中内容写入 EXcel中 ***
        Procedure MyMessageBox(Handle:HWND;MessageText,MessageCaption:String;MessageType:Cardinal);implementationuses uFrmDataConnection, uFrmmain, uFrmInfoFeedBack;
    Procedure MyMessageBox(Handle:HWND;MessageText,MessageCaption:String;MessageType:Cardinal);
    var
        FrmIFB:TFrmInfoFeedBack;
    begin
        FrmIFB:=TFrminfofeedback.Create(nil);    FrmIFB.Label_Info.Caption:=MessageCaption;
        FrmIFB.Memo_Info.Lines.add(MessageText);
        
        FrmIFB.Edit_date.Text :=getserverdatetime('sdate');
        FrmIFB.Edit_Time.Text:=getserverdatetime('stime');
        FrmIFB.Edit_user.Text:=frmmain.UserInfo.UserName;
        FrmIFB.Edit_company.Text:=frmmain.UserInfo.CompanyID;
        FrmIFB.edit_moduleGroup.Text:=frmmain.moduleLists[frmmain.modulelistindex].MGid;
        FrmIFB.edit_module.Text:=frmmain.moduleLists[FrmMain.modulelistindex].moduleID;
        //frmIFB.Edit_infoType.Text:=inttostr(err.HelpContext);
        frmIFB.Edit_infoType.Text:='自定义错误处理';
        frmIFB.Memo1.lines.Add('【模____块】 '+Frmmain.actionName);
        frmIFB.Memo1.Lines.Add('【错误信息】 '+MessageText);    frmIFB.ShowModal;end;//得到windows目录
    function GetWindowsDir: String;
    var
        ac: array [1..80] of Char;
        pc: PChar;
    begin
        pc := @ac;
        GetWindowsDirectory(pc, 80);
        Result := trim(pc);
    end;Function GetServerDateTime(DateTimeField:String):String;
    var
        ado:Tadoquery;
        s:String;
    begin
        ado:=tadoquery.Create(nil);
        ado.Connection:=frmdataconnection.ADOConnection1;
        ado.SQL.Add('select * from V_Datetime');
        ado.Open;
        ado.First;
        s:=ado.fieldbyname(DatetimeField).AsString;
        result:=s;end;Procedure ShowUserModule(UserID:String;Company_ID:String;Viewer:TTreeView);
    var
        adoquery:TAdoquery;
        adoquery1:TAdoquery;
        CompanyID:String;
        CompanyName:String;
        CompanyNode,ModuleGroupNode,ModuleNode:TTreeNode;
        MG_Name:String;
        i:Integer;
    begin
        adoquery:=TAdoquery.Create(nil);
        //adoquery.Connection:=frmDataConnection.ADOConnection1;
        adoquery.Connection:=frmDataConnection.ADOConnection_base;
        adoquery1:=TAdoquery.Create(nil);
        //adoquery1.Connection:=frmDataConnection.ADOConnection1;
        adoquery1.Connection:=frmDataConnection.ADOConnection_base;    //adoquery.SQL.Add('select distinct 公司ID,公司名 from V_UserModule where 用户ID='''+UserID+'''');
        adoquery.SQL.Add('select distinct 公司ID,公司名 from V_UserModule where 用户ID='''+UserID+''' and 公司ID='''+company_ID+'''');
        adoquery.Open;
        adoquery.First;    if adoquery.Eof then exit;    while not adoquery.Eof do
        begin
            companyId:=trim(adoquery.fieldbyname('公司ID').AsString);
            companyName:=trim(adoquery.fieldbyname('公司名').asString);
            CompanyNode:=viewer.Items.Add(nil,CompanyName);
            CompanyNode.stateindex:=1;
            //CompanyNode.SelectedIndex:=0;
            MG_Name:='';        adoquery1.Close;
            adoquery1.SQL.Clear;
            adoquery1.SQL.Add('select * from V_userModule where 用户ID='''+userID+''' and 公司ID='''+companyID+''' order by MG_ID,Module_ID');
            adoquery1.Open;
            adoquery1.First;        if adoquery1.Eof then continue;        setlength(frmmain.moduleLists,0);        while not adoquery1.Eof do
            begin
                if not (MG_Name=trim(adoquery1.fieldbyname('MG_Name').AsString)) then
                begin
                    // *********************************
                    //      新的   ModuleGroup
                    // *********************************
                    MG_Name:=trim(adoquery1.fieldbyname('MG_Name').AsString);
                    ModuleGroupNode:=Viewer.Items.AddChild(CompanyNode,MG_Name);
                    ModuleGroupNode.stateindex:=1;
                    //ModuleGroupNode.imageIndex:=1;
                end;            ModuleNode:=Viewer.Items.AddChild(ModuleGroupNode,trim(adoquery1.fieldbyname('module_name').AsString));
                ModuleNode.StateIndex:=2;
                //***********************************************************
                //      整理  FrmMain.ModuleLists
                //***********************************************************            i:=length(frmmain.moduleLists);
                setlength(frmmain.moduleLists,i+1);
                frmmain.ModuleLists[i].MGname:=MG_Name;
                frmmain.ModuleLists[i].nodeIndex:=moduleNode.AbsoluteIndex;
                frmmain.ModuleLists[i].MGid:=trim(adoquery1.fieldbyname('MG_ID').AsString);
                frmmain.ModuleLists[i].MGname:=trim(adoquery1.fieldbyname('MG_name').AsString);
                frmmain.ModuleLists[i].moduleID:=trim(adoquery1.fieldbyname('module_ID').AsString);
                frmmain.ModuleLists[i].moduleName:=trim(adoquery1.fieldbyname('module_name').AsString);
                frmmain.ModuleLists[i].companyId:=trim(adoquery1.fieldbyname('公司ID').AsString);
                frmmain.ModuleLists[i].companyName:=trim(adoquery1.fieldbyname('公司名').AsString);            Frmmain.ModuleLists[i].ModuleFormName:=trim(adoquery1.fieldbyName('module_formName').AsString);
                frmMain.ModuleLists[i].UM_ADD:=adoquery1.fieldbyname('UM_ADD').AsInteger;
                frmMain.ModuleLists[i].UM_EDIT:=adoquery1.fieldbyname('UM_EDIT').AsInteger;
                frmMain.ModuleLists[i].UM_DEL:=adoquery1.fieldbyname('UM_DEL').AsInteger;
                frmMain.ModuleLists[i].UM_CHECK:=adoquery1.fieldbyname('UM_CHECK').AsInteger;
                frmMain.ModuleLists[i].UM_PRINT:=adoquery1.fieldbyname('UM_PRINT').AsInteger;
                frmMain.ModuleLists[i].UM_1:=adoquery1.fieldbyname('UM_1').AsInteger;
                frmMain.ModuleLists[i].UM_2:=adoquery1.fieldbyname('UM_2').AsInteger;
                frmMain.ModuleLists[i].UM_3:=adoquery1.fieldbyname('UM_3').AsInteger;
                frmMain.ModuleLists[i].UM_4:=adoquery1.fieldbyname('UM_4').AsInteger;
                frmMain.ModuleLists[i].UM_5:=adoquery1.fieldbyname('UM_5').AsInteger;
                frmMain.ModuleLists[i].UM_6:=adoquery1.fieldbyname('UM_6').AsInteger;            adoquery1.Next;
            end;        adoquery.Next;
        end;end;Function GetNodeCompany(Viewer:TTreeView;IsName:Boolean):String;    //IsName:1 返回CompanyName,否则返回CompanyID
    var
        s1,s2:String;
        s:String;
        Node:TTreeNode;
        Adoquery:TAdoquery;
    begin
        node:=TTreeNode.Create(nil);
        node:=viewer.Selected;    while node.Level<>0  do
        begin
            node:=node.Parent;
        end;    S:=node.Text;
        Adoquery:=TAdoquery.Create(nil);
        Adoquery.Connection:=frmDataConnection.ADOConnection1;
        Adoquery.SQL.Add('Select 公司ID,公司名 from 公司 where 公司名='''+s+'''');
        adoquery.Open;
        Adoquery.First;
        s1:=trim(adoquery.fieldbyname('公司ID').AsString);
        s2:=trim(Adoquery.fieldbyname('公司名').AsString);
        if Isname then
            result:=s2
        else
            result:=s1;end;
      

  3.   

    Function CanOpenModule(CompanyID:String;UserID:String;FormName:String):Boolean;
    var
        adoquery:TAdoquery;
    begin
        Adoquery:=TAdoquery.Create(nil);
        //adoquery.Connection:=frmDataConnection.ADOConnection1;
        adoquery.Connection:=frmDataConnection.ADOConnection_base;
        adoquery.SQL.Add('select * from V_UserModule where 公司ID='''+CompanyID+''' and 用户ID='''+userId+''' and Module_FormName='''+FormName+'''');
        adoquery.open;
        adoquery.First;
        if Adoquery.Recordset.RecordCount<>0 then
            result:=true
        else
            result:=False;end;//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    //
    //              Base64算法 >>>>>  EncodeString(SourceString):返回串
    //
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    //****************对参数Decoded字符串进行Base64编码,返回编码后的字符串
    function EncodeString(Decoded:string):String;
    var
        mmTemp,mmDecoded:TMemoryStream;
        strTemp:TStrings;
    begin
        mmTemp := TMemoryStream.Create;
        mmDecoded:=TMemoryStream.Create;
        strTemp:=TStringList.Create;
        strTemp.Add(Decoded);
        strTemp.SaveToStream(mmTemp);
        mmTemp.Position := 0;
        //*********剔除mmTemp从strTemp中带来的字符#13#10
        mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2);
        //*********对mmDecoded进行Base64编码,由mmTemp返回编码后的结果
        EncodeBASE64(mmTemp,mmDecoded);
        //*********获得Base64编码后的字符串
        mmTemp.Position:=0;
        strTemp.LoadFromStream(mmTemp);
        //*********返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会带来不必要的字符#13#10
        Result:=strTemp[0];
    end;
    function EncodeBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
    const
        _Code64: String[64] =('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
    var
        I: LongInt;
        B: array[0..2279] of Byte;
        J, K, L, M, Quads: Integer;
        Stream: string[76];
        EncLine: String;
    begin
        Encoded.Clear;
        Stream := '';
        Quads := 0;
        //*********为提高效率,每2280字节流为一组进行编码
        J := Decoded.Size div 2280;
        Decoded.Position := 0;
        //*********对前J*2280个字节流进行编码
        for I := 1 to J do
        begin
            Decoded.Read(B, 2280);
            for M := 0 to 39 do
            begin
                for K := 0 to 18 do
                begin
                    L:= 57*M + 3*K;
                    Stream[Quads+1] := _Code64[(B[L] div 4)+1];
                    Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1];
                    Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1];
                    Stream[Quads+4] := _Code64[B[L+2] mod 64+1];
                    Inc(Quads, 4);
                    if Quads = 76 then
                    begin
                        Stream[0] := #76;
                        EncLine := Stream+#13#10;
                        Encoded.Write(EncLine[1], Length(EncLine));
                        Quads := 0;
                    end;
                end;
            end;
        end;    //*********对以2280为模的余数字节流进行编码
        J := (Decoded.Size mod 2280) div 3;
        for I := 1 to J do
        begin
            Decoded.Read(B, 3);
            Stream[Quads+1] := _Code64[(B[0] div 4)+1];
            Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
            Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1];
            Stream[Quads+4] := _Code64[B[2] mod 64+1];
            Inc(Quads, 4);
            //*********每行76个字符
            if Quads = 76 then
            begin
                Stream[0] := #76;
                EncLine := Stream+#13#10;
                Encoded.Write(EncLine[1], Length(EncLine));
                Quads := 0;
            end;
        end;
        //*********   “=”补位
        if (Decoded.Size mod 3) = 2 then
        begin
            Decoded.Read(B, 2);
            Stream[Quads+1] := _Code64[(B[0] div 4)+1];
            Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
            Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1];
            Stream[Quads+4] := '=';
            Inc(Quads, 4);
        end;