doom4ster
2017-09-11 35406177d1cff43870f9da1aedb55f3c4f281e66
CB_IMGPSScanImp.pas
@@ -14,7 +14,7 @@
  ExtCtrls, ComCtrls, Menus, StdCtrls, Gauges, EnImgScr, PJMenuSpeedButtons,
  Buttons, ImgList, SBSimpleSSL, SBHTTPSClient, SBWinCertStorage, SBX509,
  SBCustomCertStorage, SBUtils,mpsBarco,BarcodesFinder,HTTPApp,ErrList,
  Xmltool,inifiles,printers;
  Xmltool,inifiles,printers,IdHashMessageDigest, idHash;
var
  Ch_WriteNote : Boolean;
@@ -407,6 +407,7 @@
    FImgDelete:string; // Y/N  有權限可在補件時刪除影像
    FIsExternal:string;//Y/N
    FCheck_main_form:string; //Y/N
    FWH_category:string;  //Y/N  Y是歸類時有區分入庫非入庫文件  N 是不區分
    ////////傳入參數///////
    //********Http參數********
@@ -835,6 +836,11 @@
    function ISDivPageFormID(FormID: String): Boolean;
    function GetSampleInf: Boolean;
    procedure InitExistImgList(casepath:String);
    function LoadFileGetMD5(const filename:string):string; //20170809 取的檔案的MD5
    function ISExistImg(const filename:string):boolean;  //20170809 確認是否存在原有影像
    procedure _DelTreeForExistImg(ASourceDir:String);   //2017 刪除前確認 有舊影像嗎
    function DocNoIsExistImg(DocNopath: String): boolean; //2017 刪除前確認 有舊影像嗎
    function CheckCaseAttach_OK: Boolean;     //2017 確認是否有未歸類文件
  protected
    { Protected declarations }
    procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override;
@@ -954,6 +960,8 @@
    function Get_isExternal: WideString; safecall;
    procedure Set_check_main_form(const Value: WideString); safecall;
    procedure Set_isExternal(const Value: WideString); safecall;
    function Get_WH_CATEGORY: WideString; safecall;
    procedure Set_WH_CATEGORY(const Value: WideString); safecall;
  public
    { Public declarations }
    procedure Initialize; override;
@@ -1213,9 +1221,9 @@
  ST1:=TStringList.Create;
  ST2:=TStringList.Create;
  ST3:=TStringList.Create;
  ST4:=TStringList.Create;
//FImgDelete:='Y';
  if FileExists(casepath+'CaseDocNo.dat') then
  {if FileExists(casepath+'CaseDocNo.dat') then
  begin
    ST1.LoadFromFile(casepath+'CaseDocNo.dat');
    for I := 0 to ST1.Count - 1 do
@@ -1244,6 +1252,12 @@
    begin
      ExistImgList.Add(casepath+'Attach\'+ST3.Strings[i])
    end;
  end; }
  ExistImgList.Clear;
  ST1.LoadFromFile(casepath+'Download\Context.dat');
  for I := 0 to ST1.Count - 1 do
  begin
    ExistImgList.Add(LoadFileGetMD5(casepath+'Download\'+ST1.Strings[i])) ;
  end;
  ST1.Free;
@@ -1972,7 +1986,7 @@
      FormID :=  GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
      FormName := GetSQLData(FORM_INF_List,'T1.FORM_DESC',i);
      DocNo := GetSQLData(FORM_INF_List,'T1.DOC_NO',i)+GetSQLData(FORM_INF_List,'T1.DOC_VERSION',i);
      if not FormIDAppear(FormID) then Continue;
      if not FormIDAppear(FormID) then Continue;   //20170816 先秀全部
      //Showmessage(FORM_INF_List.Text);
      //showmessage(inttostr(FORM_INF_List.Count)+#13+inttostr(self.Doc_Inf_List.Count));
@@ -2004,7 +2018,7 @@
          Else
            DocDir := FindLastestDocDir(NowCaseno,DocNo);
//ShowMessage('DocNoNeedDiv(DocNo)='+BoolToStr(DocNoNeedDiv(DocNo),true));
          if DocNoNeedDiv(DocNo) then   //要分份數
          begin
            if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(NowCaseno,DocDir)>0)) or (DocDir = '') then
@@ -2178,9 +2192,19 @@
      iISB := TImageScrollBox(FindComponent(iISBName));
//ShowMessage('iISB.FileName='+iISB.FileName);
//ShowMessage(ExtractFilePath(iISB.FileName)+','+ExtractFileName(iISB.FileName)+','+NowCaseNo);
//      if (FMode = 'ESCAN') and (FModeName<>'異動件') then
//      begin
//        if ISExistImg(iISB.FileName) then
//        begin
//          ShowMessage(_Msg('此圖為非當次掃瞄,不可刪除'));
//          Exit;
//        end;
//      end;
      DeleteImageFile(ExtractFilePath(iISB.FileName),ExtractFileName(iISB.FileName),NowCaseNo);
    end;
  end;
//ShowMessage('iISB.FileName='+iISB.FileName);
  ReSortFileName(ExtractFilePath(iISB.FileName));
  DrawDocItem2(MytreeNode1,NowCaseno);
  MyTreeNode1.Text := Format('%s-%d'+_Msg('頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
@@ -2405,6 +2429,7 @@
begin
  if TreeView1.Selected = NewTreeNode then  //全刪  //新掃描件
  begin
    If Messagedlg(_Msg('是否刪除所有案件?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
    clearView(1);
    Application.ProcessMessages;
@@ -2419,6 +2444,7 @@
  end
  Else if TreeView1.Selected = MyTreeNode1 then       //案件編號
  begin
    If Messagedlg(Format(_Msg('編號(%s)是否刪除?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
    clearView(1);
    Application.ProcessMessages;
@@ -2463,6 +2489,7 @@
    If Messagedlg(Format(_Msg('文件(%s)是否刪除?'),[DocNo2DocName(NowCaseno,NowDocNo)]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
    ClearView(1);
    Application.ProcessMessages;
    _DelTree(ImageSavePath+NowCaseno+'\'+NowDocDir);
    SetUseCase('D',ImageSavePath+NowCaseno+'\',NowDocDir,'','');
    SetDocNoList('D',-1,NowCaseNo,NowDocDir,'');
@@ -2474,34 +2501,12 @@
    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
    NewTreeNodeRefresh;
    {if (FMode <>'ESCAN') and (ContextList.Count = NowShowFileList.Count) then
    begin
      if Messagedlg(_Msg('刪除後將無影像,案件將刪除,是否確定?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
      _DelTree(DisplayPath);
      SetCaseList('D',NewTreeNode.IndexOf(MyTreeNode1),'');
      if (FMode = 'ESCAN') then
      begin
        MkDir(ImageSavePath+FCaseID);
        CreateEmptyCase(ImageSavePath,FCaseID);
      end;
      LoadImgFile;
    end
    Else
    begin
      DeleteShowFile(DisplayPath);
      DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);
      P := ContextList.Count;
      MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,p]);
      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
      NewTreeNodeRefresh;
    end;
    Showmessage(_Msg('刪除完成')); }
    //Showmessage(_Msg('刪除完成'));  //20101102 User要求拿掉
  end
  Else if TreeView1.Selected = MyTreeNode3 then       //FormID層
  begin
    If Messagedlg(Format(_Msg('文件(%s)是否刪除?'),[NowFormName]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
    DeleteFormCodeFile(NowCaseNo,NowDocDir,NowFormCode);
    SetRecordEditedDocDir('A',NowCaseNo,NowDocDir);
    DrawDocItem2(MytreeNode1,NowCaseno);
@@ -2509,30 +2514,39 @@
    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
    NewTreeNodeRefresh;
    {if (FMode <>'ESCAN') and (ContextList.Count = NowShowFileList.Count) then
    begin
      if Messagedlg(_Msg('刪除後將無影像,案件將刪除,是否確定?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
      _DelTree(DisplayPath);
      SetCaseList('D',NewTreeNode.IndexOf(MyTreeNode1),'');
      if (FMode = 'ESCAN') then
      begin
        MkDir(ImageSavePath+FCaseID);
        CreateEmptyCase(ImageSavePath,FCaseID);
      end;
      LoadImgFile;
    end
    Else
    begin
      DeleteShowFile(DisplayPath);
      DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);
      P := ContextList.Count;
      MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,p]);
      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
      NewTreeNodeRefresh;
    end;
    Showmessage(_Msg('刪除完成'));
    //Showmessage(_Msg('刪除完成'));   //20101102 User要求拿掉 }
  end;
end;
function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean;
var
  i:integer;
  ST:TStringList;
begin
  Result:=False;
  ST:=TStringList.Create;
  ST.loadFromfile(DocNopath+'\Context.dat');
//ShowMessage(ST.Text);
  for I := 0 to ST.Count - 1 do
  begin
    if ISExistImg(DocNopath+ST.Strings[i]) then
    begin
      Result:=False;
      Exit;
      Break;
    end;
  end;
  Result:=True;
end;
procedure TCB_IMGPSScanX._DelTreeForExistImg(ASourceDir:String);
var
  i:integer;
  ST:TStringList;
begin
end;
procedure TCB_IMGPSScanX.PM102Click(Sender: TObject);
@@ -2914,7 +2928,7 @@
    begin
      NewFormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
      NewFormName := GetSQLData(FORM_INF_List,'T1.FORM_DESC',i);
      if not FormIDAppear(NewFormID) then Continue;
      if not FormIDAppear(NewFormID) then Continue;   //20170816 先秀全部的
      if (NewFormID <> FileName2FormCode(DisplayISB.FileName)) and FormIDExists(NewFormID,False,i) then
      begin
        DocListForm.FormIDList.Add(NewFormID+'#@#'+NewFormName);
@@ -3269,14 +3283,33 @@
      PM104.Visible := True;   //檔案加入影像
    end;
    if FMode='ESCAN' then
    if FModeName='異動件' then
    begin
      PM101.Visible := False;
      PM101.Visible := True;
    end;
//    if FMode='ESCAN' then
//    begin
//      PM101.Visible := True;
//    end;
  end
  Else if TreeView1.Selected = MyTreeNode1 then    //案件層
  begin
    PM101.Visible := True;   //刪除
    if FImgDelete='Y' then
    begin
      PM101.Visible:=True;
    end;
    if FImgDelete='N' then
    begin
      PM101.Visible:=false;
    end;
    if FModeName='異動件' then
    begin
      PM101.Visible := True;
    end;
    if not CaseDelete_Enable(NowCaseno) then //
      PM101.Enabled := False
    else
@@ -3291,10 +3324,10 @@
    begin
      PM102.Visible := True;   //修改案件編號
    end;
    if FMode='ESCAN' then
    begin
      PM101.Visible := False;
    end;
//    if FMode='ESCAN' then
//    begin
//      PM101.Visible := True;
//    end;
  end
  Else if TreeView1.Selected = MyTreeNode2 then    //文件層
  begin
@@ -3303,6 +3336,20 @@
    //PM109.Visible := True;   //檢核此筆
    if FCustDocYN <> 'N' Then
      PM110.Visible := True;   //新增自訂文件
    if FImgDelete='Y' then
    begin
      PM101.Visible:=True;
    end;
    if FImgDelete='N' then
    begin
      PM101.Visible:=false;
    end;
    if FModeName='異動件' then
    begin
      PM101.Visible := True;
    end;
    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //沒有被引用走的
      PM101.Enabled := False    //刪除
    Else
@@ -3311,10 +3358,10 @@
      PM111.Visible := True;   //修改份數
    if (FMode = 'NSCAN') then
      PM102.Visible := True;   //修改案件編號
    if FMode='ESCAN' then
    begin
      PM101.Visible := False;
    end;
//    if FMode='ESCAN' then
//    begin
//      PM101.Visible := True;
//    end;
  end
  Else if TreeView1.Selected = MyTreeNode3 then    //表單層
  begin
@@ -3325,7 +3372,23 @@
    if FCustDocYN <> 'N' Then
      PM110.Visible := True;   //新增自訂文件
    if GetFormIDPage(ContextList,NowFormCode) < 1 Then
    begin
      PM108.Visible := False;   //歸類
    end;
    if FImgDelete='Y' then
    begin
      PM101.Visible:=True;
    end;
    if FImgDelete='N' then
    begin
      PM101.Visible:=false;
    end;
    if FModeName='異動件' then
    begin
      PM101.Visible := True;
    end;
    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //被引用走的
    begin
      PM101.Enabled := False;   //刪除
@@ -3340,24 +3403,12 @@
    end;
    if (FMode = 'NSCAN') then
      PM102.Visible := True;   //修改案件編號
    //PM103.Visible := True;   //掃瞄器加入影像
    //PM104.Visible := True;   //檔案加入影像
    //PM107.Visible := True;   //寫備註
    //PM109.Visible := True;   //檢核此筆
    if FMode='ESCAN' then
    begin
      PM101.Visible := False;
      PM108.Visible := False;
      PM110.Visible := False;
      PM102.Visible := True;   //修改案件編號
    end;
  end;
  if FImgDelete='Y' then
  begin
    PM101.Visible:=True;
  end;
end;
@@ -3417,14 +3468,14 @@
  PM604.Visible := False;  //歪斜矯正
  PM605.Visible := True;  //刪除
  if FMode='ESCAN' then
  begin
    PM601.Visible := False;  //歸類
    PM602.Visible := False;  //自行定義文件名稱
    PM603.Visible := False;  //掃描替換此頁
    PM604.Visible := False;  //歪斜矯正
    PM605.Visible := False;  //刪除
  end;
//  if FMode='ESCAN' then
//  begin
//    PM601.Visible := False;  //歸類
//    PM602.Visible := False;  //自行定義文件名稱
//    PM603.Visible := False;  //掃描替換此頁
//    PM604.Visible := False;  //歪斜矯正
//    PM605.Visible := False;  //刪除
//  end;
  if ((NowDocNo = 'Attach') or (NowDocNo = 'S_Attach')) and (FCustDocYN <> 'N') then
  begin
@@ -3435,26 +3486,27 @@
    PM605.Visible := True;  //刪除
  end;
  if  FModeName<>'異動件' then
  begin
    if (FImgDelete='Y') then
    begin
      PM605.Enabled:=True;
    end;
    if FImgDelete='N' then
    begin
      PM605.Enabled:=false;
    end;
  end;
  if CheckSelectImg_UseCase(DisplayPath,NowCaseNo) then //選擇的影像不可有引用的
  begin
    PM601.Enabled := False;  //歸類
    PM605.Enabled := False;  //刪除
  end
  Else
  begin
    PM601.Enabled := True;  //歸類
    PM605.Enabled := True;  //刪除
  end;
  if FMode='ESCAN' then
  begin
    PM605.Enabled:=False;
  end;
  if FImgDelete='Y' then
  begin
    PM605.Enabled:=True;
  end;
end;
@@ -3801,8 +3853,10 @@
    'FCaseNoLength='+ IntToStr(FCaseNoLength)   +#10#13+
    'FImgDelete='+    FImgDelete+#10#13+
    'FIsExternal='+    FIsExternal+#10#13+
    'FWH_category='+FWH_category+
    'FCheck_main_form='+    FCheck_main_form);
    //FImgDelete:='Y';
  LoadImgFile;
 { ShowMessage('UpLPoint='+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+#10#13+
    'UpRPoint='+IntToStr(UpRPoint.X)+','+IntToStr(UpRPoint.Y)+#10#13+
    'DownLPoint='+IntToStr(DownLPoint.X)+','+IntToStr(DownLPoint.Y)+#10#13+
@@ -3837,6 +3891,8 @@
  ShowMessage('LASTEST_FORM_INF_List='+LASTEST_FORM_INF_List.Text)   ;
  ShowMessage('SampleFormIDList='+SampleFormIDList.Text);
  ShowMessage('ExistImgList='+ExistImgList.Text);
  ShowMessage('LastInitFormidList='+LastInitFormidList.Text);
  ShowMessage('IN_WH_DocNoList='+IN_WH_DocNoList.Text);
//  SampleFormIDList.Add('31A00101011706A');
//  SampleFormIDList.Add('31A00101021706A');
@@ -4616,7 +4672,7 @@
//ShowMessage('Xdpi='+IntToStr(Xdpi)+#10#13+'Ydpi='+IntToStr(Ydpi)+#10#13+'H='+IntToStr(H)+#10#13+'W='+IntToStr(W)+#10#13);
//ShowMessage('Site='+Site);
    OMRRect := CM_Str2Rect(Site,Xdpi,UpLPoint);
//ShowMessage(IntToStr(OMRRect.Left)+#10#13+IntToStr(OMRRect.top)+#10#13+IntToStr(OMRRect.Right)+#10#13+IntToStr(OMRRect.Bottom));
Display1.Lines.Add('UpLPoint=('+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+');'+Site+';'+IntToStr(OMRRect.Left)+','+IntToStr(OMRRect.top)+','+IntToStr(OMRRect.Right)+','+IntToStr(OMRRect.Bottom));
    if OMRRect.Left < 0 then
      OMRRect.Left := 0;
    if OMRRect.Top < 0  then
@@ -4628,6 +4684,7 @@
    result := Get_OMR(ISB_BW.Graphic,OMRRect);
//ShowMessage('result='+IntToStr(result));
  end;
end;
@@ -4709,7 +4766,7 @@
  Def_ScannerReverse := False;
  Def_BoardClear := False;
  Def_ScanDpi := 300;
  Def_ScanDuplex := False;
  Def_ScanDuplex := True;
  Def_ScanRotate := 0;
  Def_ScanDeskew := False;
  Def_ScanImgSetUse := False;
@@ -5410,8 +5467,11 @@
  FileList:TStringlist;
  DocDir : String;
begin
  DeleteFile(Path+FileName);
  DocDir := Path2DocDir(Path,CaseID);
//ShowMessage('DocDir='+DocDir);
  SetContextList('D',-1,CaseID,DocDir,FileName);
  {FileList:=TStringlist.Create;
  try
@@ -5448,6 +5508,14 @@
    begin
      if FileName2FormCode(FileList.Strings[i]) = FormID then
      begin
        if (FMode = 'ESCAN') and (FModeName<>'異動件') then
        begin
          if ISExistImg(ImageSavePath+CaseID+'\'+DocDir+'\'+FileList.Strings[i]) then
          begin
            ShowMessage('有圖為非當次掃瞄,不可刪除');
            Exit;
          end;
        end;
        DeleteImageFile(ImageSavePath+CaseID+'\'+DocDir+'\',FileList.Strings[i],CaseID);
      end;
    end;
@@ -5549,6 +5617,14 @@
      iPage := Add_Zoo(i,2);
      for n := 0 to S.Count - 1 do
      begin
        if (FWH_category='N') and (FIs_In_Wh='Y') then
        begin
          if ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[n]) then
          begin
            Continue;
          end;
        end;
        FormCode := FileName2FormCode(S.Strings[n]);
//Showmessage('1:'+version+','+FormCode2Version(FormCode)+','+DocNo+','+FormCode2DocNo(FormCode)+','+iPage+','+FormCode2Page(FormCode));
        if (version = FormCode2Version(FormCode)) and (DocNo = FormCode2DocNo(FormCode)) and (ipage = FormCode2Page(FormCode)) then
@@ -5578,6 +5654,13 @@
    S.LoadFromFile(ImageSavePath+CaseID+'\upload\Context.dat');
    for i := 0 to S.Count - 1 do
    begin
      if FWH_category='N' then
      begin
        if ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[i]) then
        begin
          Continue;
        end;
      end;
      iFormCode := FileName2FormCode(S.Strings[i]);
      if FormCode = iFormCode then
      begin
@@ -5643,7 +5726,7 @@
    DW := GetFindResult('T1.FORM_WIDTH');
    ANCHOR := UpperCase(GetFindResult('T1.ANCHOR'));
    ANCHOR := Index2Anchor(ANCHOR);
//showmessage(FormID+#13+DH+#13+DW+#13);
Display1.Lines.Add(FormID+','+DH+','+DW);
//ShowMessage('AAAAAAAAA');
    if ((ANCHOR = 'ANCHOR') or (ANCHOR = 'FRAME')) and (DH <> '') and (DW <> '') then  //有十字定位點
    begin
@@ -5803,6 +5886,7 @@
  ST1:=TStringList.Create;
  ST1.LoadFromFile(path+'FormCode_Name.dat');
//ShowMessage(ST1.Text);
//ShowMessage(LastInitFormidList.Text);
  ST2:=TStringList.Create;
  for I := 0 to ST1.Count - 1 do
@@ -5810,14 +5894,13 @@
    if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-11) then
    begin
      str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1);
      if ST2.IndexOf(str1) = -1 then
      begin
        ST2.Add(str1);
        must_formidStr:= must_formidStr+str1+'@#,';
      end;
      ST2.Add(str1);
      must_formidStr:= must_formidStr+str1+'@#,';
    end;
  end;
  must_formidStr:=Copy(must_formidStr,1,Length(must_formidStr)-3) ;
//ShowMessage('must_formidStr='+must_formidStr);
//ShowMessage('AST2='+ST2.Text);
  for I := 0 to LastInitFormidList.Count - 1 do
  begin
    if ST2.IndexOf(LastInitFormidList.Strings[i]) <> -1 then
@@ -5825,19 +5908,15 @@
      ST2.Delete(ST2.IndexOf(LastInitFormidList.Strings[i]));
    end;
  end;
//ShowMessage('BST2='+ST2.Text);
  for I := 0 to ST2.Count - 1 do
  begin
    if i <> ST2.Count then
    begin
      last_add_formidstr:=last_add_formidstr+ST2.Strings[i]+'@#,';
    end
    else
    begin
      last_add_formidstr:=last_add_formidstr+ST2.Strings[i]
    end;
  end;
  last_add_formidstr:=Copy(last_add_formidstr,1,Length(last_add_formidstr)-3) ;
  ST1.Free;
  ST2.Free;
//ShowMessage('last_add_formidstr='+last_add_formidstr);
  ///////必要formid 20170315 end //////////////////////////
  ///保留外部影像  start///////////////////////////////
@@ -5883,8 +5962,6 @@
  +'&in_doc2='+HTTPEncode(UTF8Encode(In_Doc2));
//ShowMessage('SendData='+SendData);
//ShowMessage(FData+#10#13+Doc_Data);
//exit;
  if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/caseupload',SendData,'file',Path+'Img.zip',FReWrite,Memo1,False) then
  begin
    Showmessage(Format(_Msg('傳送案件編號(%s)檔案時,網路發生錯誤!!'+_Msg('錯誤代碼:')),[CaseID])+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
@@ -6162,7 +6239,7 @@
    Result := False;
    Exit;
  end;
//ShowMessage('sssss');
//ShowMessage('替換zip');
  AttPath := Path + 'AttFile\';
  if FileExists(Path+CaseID+'.zip') then
  begin
@@ -6474,6 +6551,13 @@
    S.LoadFromFile(Path+'Context.dat');
    for I := 0 to S.Count - 1 do
    begin
      if FWH_category='N' then
      begin
        if ISExistImg(Path+S.Strings[i]) then
        begin
          Continue;
        end;
      end;
      FormCode := FileName2FormCode(S.Strings[i]);
      DocNo := FormCode2DocNo(FormCode);
      Ver := FormCode2Version(FormCode);
@@ -6650,7 +6734,7 @@
          end;
    end;
    //Showmessage('abc'+#13+ImageSavePath+CaseNo+'\CaseDocNo.dat'+#13+inttostr(CaseDocNoList.Count)+#13+CaseDocNoList.Text);
    if CaseDocNoList.Count > 0 then
    if CaseDocNoList.Count >= 0 then
    begin
      CaseDocNoList.SaveToFile(ImageSavePath+CaseNo+'\CaseDocNo.dat');
      CaseDocNo_CopiesList.SaveToFile(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat');
@@ -6668,6 +6752,7 @@
  //DocNo:String;
begin
  //DocNo := FormCode2DocNo(FileName2FormCode(FileName));
//ShowMessage('FileName='+FileName);
  if DocDir = '' then
    DocDir := AttName ; //附件
  ContextList.Clear;
@@ -6757,6 +6842,24 @@
    begin
      Result := False;
      Break;
    end;
  end;
end;
Function TCB_IMGPSScanX.CheckCaseAttach_OK:Boolean;  //檢查是否有未歸類的案件
var
  i,j : Integer;
begin
  Result := True;
  for i := 0 to NewTreeNode.Count - 1 do
  begin
    for j := 0 to NewTreeNode.Item[i].Count - 1 do
    begin
      if Pos(_msg('未歸類'),NewTreeNode.Item[i].Item[j].Text) > 0 then
      begin
        Result := False;
        Break;
      end;
    end;
  end;
end;
@@ -6963,13 +7066,14 @@
Function TCB_IMGPSScanX.GetCasePage(Path,CaseID:String):Integer;
var
  DocDirList,FileList :TStringlist;
  DocDirList,FileList,ST1 :TStringlist;
  iDocDir,iDocNo : String;
  i,Count : Integer;
  i,n,Count : Integer;
begin
  Count := 0;
  DocDirList := TStringlist.Create;
  FileList := TStringlist.Create;
  ST1:=TStringList.Create;
  try
    if FileExists(Path+CaseID+'\CaseDocNo.dat') then
      DocDirList.LoadFromFile(Path+CaseID+'\CaseDocNo.dat');
@@ -6984,11 +7088,35 @@
      begin
        Continue;
      end;}
      if not DocNoAppear(iDocNo) then Continue;
      //if not DocNoAppear(iDocNo) then Continue; //20170817 先註解
      FileList.Clear;
      if FileExists(Path+CaseID+'\'+iDocDir+'\Context.dat') then
      begin
        FileList.LoadFromFile(Path+CaseID+'\'+iDocDir+'\Context.dat');
        if (FWH_category='N') and (FIs_In_Wh='Y') then
        begin
          ST1.Clear;
          for n := 0 to FileList.Count - 1 do
          begin
            if ISExistImg(Path+CaseID+'\'+iDocDir+'\'+FileList.Strings[n]) then
            begin
              ST1.Add(FileList.Strings[n]);
            end;
          end;
          for n := 0 to ST1.Count - 1 do
          begin
            if (FileList.IndexOf(ST1.Strings[n])<>-1) and (not DocNoIs_In_WH(iDocNo)) then
            begin
              FileList.Delete(FileList.IndexOf(ST1.Strings[n]));
            end;
          end;
        end;
      end;
      Count := Count+ FileList.Count;
    end;
    if FileExists(Path+CaseID+'\'+AttName+'\Context.dat') then
@@ -7001,6 +7129,7 @@
  finally
  DocDirList.Free;
  FileList.Free;
  ST1.free;
  end;
end;
@@ -7801,7 +7930,7 @@
    ErrlistForm.Timer1.Enabled := true;
    if ErrlistForm.ShowModal = mrok then
    begin
      TransPath := ImageSavePath+NowCaseNo+'\';
      TransPath := ImageSavePath+NowCaseNo+'\upload\';
      if FMode = 'ISCAN' then
        TransPath :=  ImageSavePath + NowCaseNo+'\DownTemp\';
      ShowText := NowCaseNo+_Msg('資料上傳中,請稍候');
@@ -7907,12 +8036,14 @@
  FormName : String;
  CaseDocNoList,CaseDocNo_CopiesList,StrList : TStringlist;
  iiDocNo,iiFormID,iiDocVer : String;
  ST1:TStringList;
begin
  Result := False;
  FileList := TStringlist.Create;
  CaseDocNoList := TStringlist.Create;
  CaseDocNo_CopiesList := TStringlist.Create;
  StrList := TStringlist.Create;
  ST1:=TStringList.Create;
  try
    CaseNode.ImageIndex := 1;
    CaseNode.SelectedIndex := 1;
@@ -7931,19 +8062,47 @@
      //Showmessage(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\Context.dat');
      if FileExists(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\Context.dat') then
        FileList.LoadFromFile(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\Context.dat');
      //Showmessage('aaa '+FileList.Text);
      iDocNo := DocNoDir2DocNo(CaseDocNoList.Strings[i]);
      ST1.Clear;
//ShowMessage(FileList.Text);
      if (FWH_category='N') and (FIs_In_Wh='Y') then
      begin
        for n := 0 to FileList.Count - 1 do
        begin
          if ISExistImg(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\'+FileList.Strings[n]) then
          begin
            ST1.Add(FileList.Strings[n]);
          end;
        end;
        for n := 0 to ST1.Count - 1 do
        begin
          if (FileList.IndexOf(ST1.Strings[n])<>-1) and (not DocNoIs_In_WH(iDocNo)) then
          begin
            FileList.Delete(FileList.IndexOf(ST1.Strings[n]));
          end;
        end;
      end;
      if FileList.Count=0 then Continue;
//Showmessage('aaa '+FileList.Text);
      DocNoCopies := Strtoint(CaseDocNo_CopiesList.Strings[i]);
      DocNoPage := FileList.Count;
      iDocNo := DocNoDir2DocNo(CaseDocNoList.Strings[i]);
      //Showmessage(iDocNo);
      //Showmessage(DocNo2DocName(Caseno,iDocNo));
//Showmessage(iDocNo);
//Showmessage(DocNo2DocName(Caseno,iDocNo));
//ShowMessage('FileList='+FileList.Text);
      {if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(iDocNo))) or   //入庫掃描不看非入庫文件
         ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(iDocNo)))) and
         ((iDocNo <> 'Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then     //非入庫掃描不看入庫文件
      begin
        Continue;
      end;}
      if not DocNoAppear(iDocNo) then Continue;
      //if not DocNoAppear(iDocNo) then Continue;
      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('頁'),[CaseDocNoList.Strings[i],DocNo2DocName(Caseno,iDocNo),DocNoPage]));
@@ -8041,6 +8200,7 @@
    if DirectoryExists(ImageSavePath+Caseno+'\'+AttName) then
    begin
      FileList.Clear;
      if FileExists(ImageSavePath+Caseno+'\'+AttName+'\Context.dat') then
        FileList.LoadFromFile(ImageSavePath+Caseno+'\'+AttName+'\Context.dat')
@@ -8070,11 +8230,48 @@
        end;
      end;
    end;
    if FModeName='件' then  //20170904 先裝死  因為異動 同時存在兩種附件太難寫
    begin
      if DirectoryExists(ImageSavePath+Caseno+'\Attach') then
      begin
        FileList.Clear;
        if FileExists(ImageSavePath+Caseno+'\Attach'+'\Context.dat') then
          FileList.LoadFromFile(ImageSavePath+Caseno+'\Attach'+'\Context.dat')
        Else
        begin
          Rmdir(ImageSavePath+Caseno+'\Attach');
          Exit;
        end;
        DocNoPage := FileList.Count;
        iDocNo := DocNoDir2DocNo(AttName);
        //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[AttName,DocNo2DocName(Caseno,iDocNo),1]));
        DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[DocNo2DocName(Caseno,iDocNo),'Attach',1]));
        DocNode.ImageIndex := 2;
        DocNode.SelectedIndex := 2;
        for n := 0 to FileList.Count - 1 do
        begin
          FormID := FileName2FormCode(FileList.Strings[n]);
          if not CheckFormIDExists(DocNode,FormID) then
          begin
            FormPage := GetFormIDPage(FileList,FormID);
            FormName := FormCode2FormName(Caseno,FormID);
            //FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
            FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
            FormNode.ImageIndex := 4;
            FormNode.SelectedIndex := 4;
          end;
        end;
      end;
    end;
  Finally
  FileList.Free;
  CaseDocNoList.Free;
  CaseDocNo_CopiesList.Free;
  StrList.Free;
  ST1.Free;
  end;
end;
@@ -8377,14 +8574,35 @@
    if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-11) then
    begin
      str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1);
      if LastInitFormidList.IndexOf(str1) = -1 then
      begin
        LastInitFormidList.Add(str1);
      end;
      LastInitFormidList.Add(str1);
    end;
  end;
  ST1.Free;
end;
function TCB_IMGPSScanX.LoadFileGetMD5(const filename: string): string;
var
  Stream: TFileStream;
  //Buffer: array[0..1023] of AnsiChar;
  Buffer: array[0..1023] of AnsiChar;
  TempStr: string;
  i: Integer;
  idmd5:TIdHashMessageDigest5;  //import IdHashMessageDigest, idHash
begin
  idmd5 := TIdHashMessageDigest5.Create;
  try
    Stream := TFileStream.Create(filename, fmOpenRead);
    Stream.Read(Buffer[0], SizeOf(Buffer));
    result := idmd5.HashStreamAsHex(Stream) ;
  finally
    idmd5.Free;
    Stream.Free;
  end;
end;
procedure TCB_IMGPSScanX.LoadImgFile;  //載入新件及替換件
@@ -8431,6 +8649,7 @@
    end;
    CasePage := GetCasePage(ImageSavePath,CaseList.Strings[i]);
//ShowMessage('CasePage='+IntToStr(CasePage));
    MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[i],CasePage]));
    MytreeNode1.ImageIndex := 1;
    MytreeNode1.SelectedIndex := 1;
@@ -9015,6 +9234,7 @@
  S := TStringlist.Create;
  GraphicPrinter := TDibGraphicPrinter.Create;
  PrtDialog := TPrintDialog.Create(self);
  //PrtDialog.Copies:=99;
  try
    IF PrtDialog.Execute Then
    begin
@@ -9670,6 +9890,20 @@
     ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(iDocNo)))) and      //非入庫掃描不看入庫文件
     ((iDocNo <> 'Attach') and (iDocNo <> 'S_Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then
       Result := False;
  if (FIs_In_Wh='Y') and (FWH_category='Y') then //20170816 新加
  begin
    if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(iDocNo))) or   //入庫掃描不看非入庫文件
     ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(iDocNo)))) and      //非入庫掃描不看入庫文件
     ((iDocNo <> 'Attach') and (iDocNo <> 'S_Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then
       Result := False;
  end;
  if (FIs_In_Wh='Y') and (FWH_category='N') then //20170816 新加
  begin
    Result:=True;
  end;
end;
Function TCB_IMGPSScanX.DocNoAppear(DocNo:String):Boolean;   //DocNo是否可出現
@@ -9679,6 +9913,7 @@
     ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(DocNo)) or (DocNo ='Attach') )) {and      //非入庫掃描不看入庫文件
     (Copy(DocNo,1,5)<>'ZZZZZ')} then
       Result := False;
end;
Function TCB_IMGPSScanX.GetDocNoCount(CaseID,DocNo:String):Integer; //取DocNo數量
@@ -9897,6 +10132,18 @@
      Result := True;
      Break;
    end;
  end;
end;
function TCB_IMGPSScanX.ISExistImg(const filename: string): boolean;
begin
  if ExistImgList.IndexOf(LoadFileGetMD5(filename))<>-1 then
  begin
    Result:=True;
  end
  else
  begin
    Result:=False;
  end;
end;
@@ -10723,6 +10970,14 @@
    S.LoadFromFile(ImageSavePath + CaseID+'\upload\Context.dat');
    for i := 0 to S.Count - 1 do
    begin
      if FWH_category='N' then
      begin
        if ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[i]) then
        begin
          Continue;
        end;
      end;
      LForm := FileName2FormCode(S.Strings[i]);
      AddOk := True;
      for n := 0 to OMRFileList.Count - 1 do
@@ -10773,6 +11028,8 @@
  OMROkCount : Integer;
  //Casecheck : Boolean;  //是否要做檢核
  //AllCheck : Boolean;  //是否要做完整檢核
  ISB8W,ISB8H:integer;
begin
  ///OMRErrInfo  1: 必要文件  2:相依文件 3:互斥文件  4:必填 5:欄位有值附文件  6:欄位有值不附文件
  ///            7: 欄位有值相關欄位也要有值  8:欄位有值要寫備註 9:停用日期 10:最大頁數
@@ -10820,7 +11077,7 @@
        begin
          //////主要非主要文件//////
          DistinctDocinCase(ImageSavePath+CaseID+'\upload\');
//ShowMessage(DocNo_VerinCase.Text);
          if ModeNeedCheck(OMRErrInfo[1].Mode,FMode) then //是否要檢核
          begin
            for i := 0 to DocNo_VerinCase.Count - 1 do
@@ -10863,6 +11120,13 @@
            begin
              if not Case_DocNoExists(CaseID,List.Strings[i]) then  //沒附相依文件
              begin
                if FWH_category='N' then
                begin
                  if ISExistImg(ImageSavePath+CaseID+'\upload\'+List.Strings[i]) then
                  begin
                    Continue;
                  end;
                end;
                ErrStr:=Format(OMRErrInfo[2].Info,[DocNo2DocName(CaseID,List.Strings[i])]);   //沒附相依文件
                OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[2].Ignore,OMRErrInfo[2].Display);
                if OMRErrInfo[2].Display then
@@ -10880,6 +11144,13 @@
            begin
              if Case_DocNoExists(CaseID,List.Strings[i]) then  //附了互斥文件
              begin
                if FWH_category='N' then
                begin
                  if ISExistImg(ImageSavePath+CaseID+'\upload\'+List.Strings[i]) then
                  begin
                    Continue;
                  end;
                end;
                ErrStr:=Format(OMRErrInfo[3].Info,[DocNo2DocName(CaseID,List.Strings[i])]);   //有附互斥文件
                OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[3].Ignore,OMRErrInfo[3].Display);
                if OMRErrInfo[3].Display then
@@ -10932,9 +11203,16 @@
      DistinctFormCode(CaseID);
      if ModeNeedCheck(OMRErrInfo[10].Mode,FMode) then //是否要檢核
      begin
//ShowMessage(OMRFileList.Text);
//ShowMessage('AAA'+OMRFileList.Text);
        For i := 0 to OMRFileList.Count - 1 do
        begin
          if FWH_category='N' then
          begin
            if ISExistImg(ImageSavePath+CaseID+'\upload\'+OMRFileList.Strings[i]) then
            begin
              Continue;
            end;
          end;
          FormCode := FileName2FormCode(OMRFileList.Strings[i]);
          FormDataPages := GetDataFormCodePages(FormCode);
@@ -10957,22 +11235,31 @@
      DistinctFormCode(CaseID);
      ValueXT := TXmltool.Create;
      Try
//ShowMessage('必填'+OMRFileList.Text);
        For i := 0 to OMRFileList.Count - 1 do
        begin
//          if FWH_category='N' then
//          begin
//            if ISExistImg(ImageSavePath+CaseID+'\upload\'+OMRFileList.Strings[i]) then
//            begin
//              Continue;
//            end;
//          end;
          OMRFile := OMRFileList.Strings[i];
          OMRFormCode := FileName2FormCode(OMRFileList.Strings[i]);
          OMRFormName := FormCode2FormName(CaseID,OMRFormCode);
          Anchor := FormID2Anchor(OMRFormCode);
          ///依十字定位點縮放////
          ImageReSize_FormID(CaseID,OMRFile);
          ////依十字定位點縮放////
          ////依十字定位點縮放///
//Display1.Lines.Add('OMRFile='+OMRFile+',OMRFormCode='+OMRFormCode+',OMRFormName='+OMRFormName);
          if not FileExists(CheckXmlPath+OMRFormCode+'.xml') then  //沒有Xml就不用檢核
            Continue;
          XT := TXmltool.Create(CheckXmlPath+OMRFormCode+'.xml');
          RelaXT := TXmltool.Create;
//ShowMessage('ModeNeedCheck='+BoolToStr(ModeNeedCheck(OMRErrInfo[4].Mode,FMode),true));
          try
            //*******必填********
            if ModeNeedCheck(OMRErrInfo[4].Mode,FMode) then //是否要檢核
@@ -10998,7 +11285,8 @@
                    //有填就ok
                    //Showmessage(ColCName +','+ inttostr(OMRMpsV1.GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site))+','+inttostr(Pixel + SafePixel));
//SafePixel:=90000;
//ShowMessage(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
//FindPoint(ISB_BW.Graphic,UpLPoint,UpRPoint,DownLPoint,ANCHOR);
                    if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel)  then
                    begin
                      //Showmessage('oh');
@@ -11040,6 +11328,7 @@
                else
                  SiteRec := SiteRec+'@'+Site;
                Pixel := XT.Node['/form/settype3/'+ColEName+'/'].Attributes['pixel'];
Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then
                begin
                  ////有填寫////
@@ -11058,6 +11347,11 @@
                      RelaFormName := FormCode2FormName(CaseID,RelaFormCode);
                      Anchor1 := FormID2Anchor(RelaFormCode);
                      RelaXT.LoadFromFile(CheckXmlPath+RelaFormCode+'.xml');
Display1.Lines.Add(RelaFile+','+RelaFormName);
                      ISB8.LoadFromFile(ImageSavePath+CaseID+'\upload\'+RelaFile,1); //20170815
                      ISB8W:= ISB8.Graphic.Width;
                      ISB8H:= ISB8.Graphic.Height;
                      FindPoint(ISB8.Graphic,UpLPoint,UpRPoint,DownLPoint,ISB8W,ISB8H,ANCHOR);  //20170815  抓相關然欄位所在圖檔的定位
                      OMROK := False;
                      //OMROK := False;
                      //if RelaXT.SubNodes['/form/settype2/'].First then
@@ -11078,17 +11372,18 @@
                              RelaSiteRec := RelaSiteRec+'@'+RelaSite;
                            if  FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then
                            begin
Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                              if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSite,Bt) > (RelaPixel + SafePixel)  then
                              begin
                                OMROK := True;
                                Break;
                              end;
                              ///依十字定位點縮放////
                              ImageReSize_FormID(CaseID,OMRFile); //20170815 重新抓定位
                              ////依十字定位點縮放////
                            end;
                          end;
                          //Else
                          //begin
                            //ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/'];
                          //end;
                        Until not RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Next;
                        if not OMROk then
                        begin
@@ -11128,6 +11423,7 @@
                else
                  SiteRec := SiteRec+'@'+Site;
                Pixel := XT.Node['/form/settype8/'+ColEName+'/'].Attributes['pixel'];
Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then
                begin
@@ -11148,6 +11444,10 @@
                    RelaFormName := FormCode2FormName(CaseID,RelaFormCode);
                    Anchor1 := FormID2Anchor(RelaFormCode);
                    RelaXT.LoadFromFile(CheckXmlPath+RelaFormCode+'.xml');
                    ISB8.LoadFromFile(ImageSavePath+CaseID+'\upload\'+RelaFile,1); //20170815
                    ISB8W:= ISB8.Graphic.Width;
                    ISB8H:= ISB8.Graphic.Height;
                    FindPoint(ISB8.Graphic,UpLPoint,UpRPoint,DownLPoint,ISB8W,ISB8H,ANCHOR);  //20170815  抓相關然欄位所在圖檔的定位
                    OMROK := False;
                    //OMROK := False;
                    //if RelaXT.SubNodes['/form/settype2/'].First then
@@ -11168,12 +11468,16 @@
                            RelaSiteRec := RelaSiteRec+'@'+RelaSite;
                          if  FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then
                          begin
Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                            if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSite,Bt) > (RelaPixel + SafePixel)  then
                            begin
                              inc(OMROkCount);
                              //OMROK := True;
                              //Break;
                            end;
                            ///依十字定位點縮放////
                            ImageReSize_FormID(CaseID,OMRFile);
                            ////依十字定位點縮放////
                          end;
                        end;
                        //Else
@@ -11219,6 +11523,8 @@
                else
                  SiteRec := SiteRec+'@'+Site;
                Pixel := XT.Node['/form/settype4/'+ColEName+'/'].Attributes['pixel'];
 Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then
                begin
                  ////有填寫////
@@ -11263,6 +11569,8 @@
                else
                  SiteRec := SiteRec+'@'+Site;
                Pixel := XT.Node['/form/settype5/'+ColEName+'/'].Attributes['pixel'];
 Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then
                begin
                  ////有填寫////
@@ -11307,6 +11615,9 @@
                  SiteRec := Site
                else
                  SiteRec := SiteRec+'@'+Site;
 Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel) then
                begin
                  ////有填寫////
@@ -11337,6 +11648,8 @@
                    OMRValue := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['getvalue'];
                    //有填就ok
 Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
                    if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel)  then
                    begin
                      ValueXT['/content/'+ColEName+'/@savevalue'] := OMRValue;  //有填就換成設定的值
@@ -11581,10 +11894,13 @@
    v ,v1 : Integer;
    List_DocNo,Trans_DocNo,List_FormCode,Form_Page: String;
    iDocNo : String;
    iGroupNo,page,Ct : Integer;
    iGroupNo,page,Ct,int1 : Integer;
    ST1:TStringList;
begin
   ShowText := '影像顯示中,請稍候';
   DataLoading(True,True);
ST1:=TStringList.Create;
//Display1.Lines.Clear;
   IF DocNo = 'ShowAll' then  //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll)
   begin
     ClearView(1);
@@ -11594,26 +11910,54 @@
       Exit;
     end;
     CreatePreViewISB(GetCasePage(ImageSavePath,NowCaseno));
     //Showmessage(inttostr(GetCasePage(ImageSavePath,NowCaseno)));
//Showmessage(inttostr(GetCasePage(ImageSavePath,NowCaseno)));
     Ct := 0;
     For i := 0 to CaseDocNoList.Count-1 do
     begin
       {iDocno := DocNoDir2DocNo(CaseDocNoList.Strings[i]);
       if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(iDocNo))) or   //入庫掃描不看非入庫文件
          ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(iDocNo)))) and
          ((iDocNo <> 'Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then     //非入庫掃描不看入庫文件
       if (FWH_category='N') and (FIs_In_Wh='Y') then
       begin
         Continue;
       end; }
         if FileExists(ImageSavePath+NowCaseno+'\EditedDocDir.dat') then
         begin
           ST1.LoadFromFile(ImageSavePath+NowCaseno+'\EditedDocDir.dat');
         end;
       end;
       iDocNo := CaseDocNoList.Strings[i];
       if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue;
//ShowMessage('ST1.Count='+IntToStr(ST1.Count));
       if ST1.Count<>0 then
       begin
         if ST1.IndexOf(iDocNo)<>-1 then
         begin
         end
         else
         begin
           if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue;  //20170817 這不能被註解
         end;
       end
       else
       begin
         if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue;  //20170817 這不能被註解
       end;
       ContextList.Clear;
       if FileExists(Path+iDocNo+'\Context.dat') then
         ContextList.LoadFromFile(Path+iDocNo+'\Context.dat');
//ShowMessage('ContextList='+ContextList.Text);
       for n := 0 to ContextList.Count - 1 do
       begin
         if (FWH_category='N') and (FIs_In_Wh='Y') then
         begin
           if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[n]) then
           begin
             if not DocNoIs_In_WH(Copy(iDocNo,1,8)) then
             begin
               Continue;
             end;
           end;
         end;
         inc(Ct);
         ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct)));
         ISB.AntiAliased := True;
@@ -11625,6 +11969,7 @@
         ISB.Redraw(true);
       end;
     end;
     //if DirectoryExists(Path+'Attach') then
     if DirectoryExists(Path+AttName) then
@@ -11644,18 +11989,38 @@
         ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1);
       end;
     end;
     FitPreViewISB;
   end
   Else if (DocNo <> '') and (FormID = '') then  //顯示指定DocNo+組別的影像  附件傳 Attach
   begin
   begin                               //顯示 文件層下的影像
     iDocNo := DocNo;
     ContextList.Clear;
     if FileExists(Path+iDocNo+'\Context.dat') then
       ContextList.LoadFromFile(Path+iDocNo+'\Context.dat');
//ShowMessage('ContextList.Count='+IntToStr(ContextList.Count));
     CreatePreViewISB(ContextList.Count);
//ShowMessage(IntToStr(ContextList.Count));
     int1:=0;
//ShowMessage(BoolToStr(DocNoIs_In_WH(Copy(iDocNo,1,8)),true));
     For i := 0 to ContextList.Count -1 do
     begin
       ISB := TImageScrollBox(FindComponent(ISBName+intToStr(i+1)));
       if (FWH_category='N') and (FIs_In_Wh='Y')  then
       begin
         if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]) then
         begin
           if not DocNoIs_In_WH(Copy(iDocNo,1,8)) and ( iDocNo<>'Attach') then
           begin
             inc(int1);
             Continue;
           end;
         end;
       end;
//ShowMessage(Path+iDocNo+'\'+ContextList.Strings[i]);
       ISB := TImageScrollBox(FindComponent(ISBName+intToStr(i+1-int1)));
       ISB.AntiAliased := True;
       if ISB.ZoomPercent > 100  then
         ISB.AntiAliased := False;
@@ -11677,60 +12042,42 @@
       page := 0;
       Ct := 0;
       CreatePreViewISB(Pages);
//ShowMessage('formID page'+IntToStr(Pages)+', ContextList='+ContextList.Text);
       For i := 0 to ContextList.Count -1 do
       begin
         if FileName2FormCode(ContextList.Strings[i]) = FormID then
         begin
           if (FWH_category='N') and (FIs_In_Wh='Y') then
           begin
//ShowMessage(Path+iDocNo+'\'+ContextList.Strings[i]);
//ShowMessage(BoolToStr(ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]),true));
             if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]) then
             begin
               if not DocNoIs_In_WH(FormCode2DocNo(FormID)) then
                 Continue;
             end;
           end;
           inc(Ct);
           ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct)));
//ShowMessage(ISB.Name);
           ISB.AntiAliased := True;
           if ISB.ZoomPercent > 100  then
             ISB.AntiAliased := False;
           ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[i],1);
           DpiResize(ISB.Graphic,36);
           ISB.Redraw(true);
           //NowShowFileList.Add(ContextList.Strings[i]);
         end;
       end;
       FitPreViewISB;
     end;
   end;
   {Else if (DocNo = 'Attach') and (FormID = 'Attach') then  //附件傳 Attach
   begin
     If (TreeView1.Selected <> nil) Then
     begin
       iGroupNo := 0;
       page := 0;
       CreatePreViewISB(Pages);
       For i := 0 to ContextList.Count -1 do
       begin
         List_FormCode := FileName2FormCode(ContextList.Strings[i]);
         Form_Page := FormCode2Page(List_FormCode);
         List_DocNo := FormCode2DocNo(List_FormCode);
         Trans_DocNo := Context_DocnoList.Strings[i];
         if (Trans_DocNo = DocNo) then
         begin
           if List_FormCode = FormID then
           begin
             inc(Page);
             if Page = GroupNo+1 then
             begin
               ISB := TImageScrollBox(FindComponent(ISBName+intToStr(1)));
               ISB.AntiAliased := True;
               if ISB.ZoomPercent > 100  then
                 ISB.AntiAliased := False;
               ISB.LoadFromFile(Path+ContextList.Strings[i],1);
               NowShowFileList.Add(ContextList.Strings[i]);
             end;
           end;
         end;
       end;
       FitPreViewISB;
     end;
   end;}
   if FindComponent(ISBName+'1') <> nil then
   begin
     ISBClick(TImageScrollBox(FindComponent(ISBName+'1')));
   end;
   ISB1Click(ISB1);
   DataLoading(False,False);
end;
@@ -12053,6 +12400,9 @@
  ln := length(SelectISB.Name);
  SelectPage := Strtoint(Copy(SelectISB.Name,v+1,ln-v));
  ISB1.ZoomMode := zmFittoPage;
//ShowMessage('SelectISB.FileName='+SelectISB.FileName);
  //if SelectISB.FileName='' then exit;
  ISB1.LoadFromFile(SelectISB.FileName,1);
  if (ISB1.Graphic.ImageFormat <> ifBlackWhite) and (SmoothCB.Checked)then
    Image_Smooth(ISB1.Graphic);
@@ -12769,6 +13119,7 @@
        OldName := Filelist.Strings[i];
        //NewName := Add_Zoo(i+1,3)+Copy(OldName,4,length(OldName)-3);
        NewName := Add_Zoo(i+1,3)+FileName2NoQuene_Filename(OldName);
//ShowMessage(OldName+#10#13+NewName);
        ReNameFile(Path+OldName,Path+NewName);
        Filelist.Strings[i] := NewName;
      end;
@@ -13235,7 +13586,9 @@
  i: Integer;
begin
  Timer1.Enabled := False;
  //FIs_In_Wh:='Y'; /// test 記得關掉
  //FWH_category :='N';  // test 記得關掉
//  FImgDelete := 'Y'; //test 記得關掉
  //Showmessage('a');
  //self.FIs_OldCase := 'Y';
  PageLVclear := True;
@@ -13568,6 +13921,8 @@
//ShowMessage(IntToStr(ScanDpi));
  R_W_Scanini('R'); //掃瞄設定的ini
//ShowMessage(IntToStr(ScanDpi));
//ShowMessage('停掉DataLoading');
//DataLoading(False,False);
  ScanDuplexCB.Checked := ScanDuplex;
  if FMode <> 'SAMPLESCAN' then
    LoadImgFile;
@@ -13627,6 +13982,14 @@
    Showmessage(_Msg('尚有未配號案件,無法上傳'));
    Exit;
  end;
  if not CheckCaseAttach_OK then  //20170911檢查是否有未歸類的案件
  begin
    Showmessage(_Msg('尚有未歸類文件,無法上傳'));
    Exit;
  end;
  if NewTreeNode.Count = 0  then
  begin
    Showmessage(_Msg('無影像需傳送'));
@@ -13724,7 +14087,6 @@
      ///////檢核//////
      ShowText := CaseID+_Msg('資料上傳中,請稍候');
      DataLoading(True,True);
//ShowMessage('NNNNN');
//ShowMessage('退出');DataLoading(False,False);Exit;
      If Not TransCaseID(TransPath,CaseID,True) Then  //傳送案件
      begin
@@ -14593,6 +14955,16 @@
  FIsExternal:=Value;
end;
function TCB_IMGPSScanX.Get_WH_CATEGORY: WideString;
begin
end;
procedure TCB_IMGPSScanX.Set_WH_CATEGORY(const Value: WideString);
begin
  FWH_category:=Value;
end;
initialization
  TActiveFormFactory.Create(
    ComServer,