doom4ster
2018-09-19 b012fccf647c4d253174e5dfcdea4d15335c3436
CB_IMGPSScanImp.pas
@@ -257,6 +257,7 @@
    ISB1: TImageScrollBox;
    Label3: TLabel;
    LogFile1: TLogFile;
    ScanGrayCB: TCheckBox;
    procedure ActiveFormCreate(Sender: TObject);
    procedure Panel9Resize(Sender: TObject);
    procedure ISB1Click(Sender: TObject);
@@ -372,6 +373,9 @@
    procedure ImageScrollBox1NewGraphic(const Graphic: TDibGraphic);
    procedure SmoothCBClick(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure TreeView1MouseEnter(Sender: TObject);
    procedure ScrollBox1MouseEnter(Sender: TObject);
    procedure ScanGrayCBClick(Sender: TObject);
  private
    { Private declarations }
    HotKeyId1,HotKeyId2,HotKeyId3,HotKeyId4 :Integer;
@@ -849,6 +853,8 @@
    function CheckRequiredColumnValues(workno,caseno:String) :Boolean;  //20171003  此大類下此案是否檢核必填
    function logTimeString :String;
    procedure ReduceLogFile ;
    function FindLastestDocDirForPage(CaseID, DocNo, formid: String): String;
    function OMRErrini2ListForLog(CaseID: String):String;
  protected
    { Protected declarations }
    procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override;
@@ -1026,32 +1032,89 @@
end;
procedure TCB_IMGPSScanX.WMMOUSEWHEEL(var message: TWMMouseWheel);
var
  I: Integer;
  iISB : TImageScrollBox;
begin
    inherited;
    //lb1.Caption:=IntToStr(message.Keys);
    if (message.WheelDelta = WHEEL_DELTA) Then
    begin
    if (message.WheelDelta = WHEEL_DELTA) Then begin
     if Edit1.Focused then
     begin
       ScrollBox1.VertScrollBar.Increment := 50;
       ScrollBox1.Perform(WM_VSCROLL, SB_LINEUP, 0);
     end
     else if DisplayISB.Focused then
     begin
       DisplayISB.VertScrollBar.Increment := 50;
       DisplayISB.Perform(WM_VSCROLL, SB_LINEUP, 0);
     end;
     end else if (message.WheelDelta = -WHEEL_DELTA) then begin
     if Edit1.Focused then
     begin
       ScrollBox1.VertScrollBar.Increment := 50;
       ScrollBox1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
     end
     else if DisplayISB.Focused then
     begin
       DisplayISB.VertScrollBar.Increment := 50;
       DisplayISB.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
     end;
      if ScrollBox1.Focused then
      begin
        ScrollBox1.VertScrollBar.Increment := 50;
        ScrollBox1.Perform(WM_VSCROLL,SB_Lineup,0);
      end;
      if DisplayISB <> nil then
      begin
        if (DisplayISB.Focused) and (message.Keys=0) then
        begin
           DisplayISB.VertScrollBar.Increment := 50;
           DisplayISB.Perform(WM_VSCROLL,SB_Lineup,0);
        end;
        if (DisplayISB.Focused) and (message.Keys=50) then
        begin
          DisplayISB.ZoomMode := zmPercent;
          if DisplayISB.ZoomPercent < 90 then
            DisplayISB.ZoomPercent := DisplayISB.ZoomPercent+10;
        end;
      end;
      i:=0;
      while FindComponent(ISBName+inttostr(i)) <> nil do
      begin
        iISB := TImageScrollBox(FindComponent(ISBName+inttostr(i)));
        if iISB.Focused then
        begin
          ScrollBox1.VertScrollBar.Increment := 50;
          ScrollBox1.Perform(WM_VSCROLL,SB_Lineup,0);
        end;
        inc(i);
      end;
    end
    else if (message.WheelDelta = -WHEEL_DELTA) then
    begin
      if ScrollBox1.Focused then
      begin
        ScrollBox1.VertScrollBar.Increment := 50;
        ScrollBox1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
      end;
      if DisplayISB <> nil then
      begin
        if (DisplayISB.Focused) and (message.Keys=0) then
        begin
           DisplayISB.VertScrollBar.Increment := 50;
           DisplayISB.Perform(WM_VSCROLL,SB_LINEDOWN,0);
        end;
        if (DisplayISB.Focused) and (message.Keys=50) then
        begin
          DisplayISB.ZoomMode := zmPercent;
          if DisplayISB.ZoomPercent > 10 then
            DisplayISB.ZoomPercent := DisplayISB.ZoomPercent-10;
        end;
      end;
      i:=0;
      while FindComponent(ISBName+inttostr(i)) <> nil do
      begin
        iISB := TImageScrollBox(FindComponent(ISBName+inttostr(i)));
        if iISB.Focused then
        begin
          ScrollBox1.VertScrollBar.Increment := 50;
          ScrollBox1.Perform(WM_VSCROLL,SB_Lineup,0);
        end;
        inc(i);
      end;
    end;
end;
procedure TCB_IMGPSScanX.WNoteBtnClick(Sender: TObject);
@@ -1306,7 +1369,7 @@
procedure TCB_IMGPSScanX.ISB1Enter(Sender: TObject);
begin
  //ISB1.SetFocus;
  ISB1.SetFocus;
end;
procedure TCB_IMGPSScanX.ISB1ImageMouseDown(Sender: TObject; Button: TMouseButton;
@@ -1315,7 +1378,8 @@
  p : Integer;
begin
  DisplayISB := TImageScrollBox(Sender);
  DisplayISB.SetFocus;
  if NowClick<>0 then
    DisplayISB.SetFocus;
  Shape1.Left := TPanel(TImageScrollBox(Sender).Parent).Left - Seg;
  Shape1.Top := TPanel(TImageScrollBox(Sender).Parent).Top - Seg;
  P := strtoint(copy(DisplayISB.Name,4,1)) + ScrollBar1.Position-2;
@@ -1350,17 +1414,25 @@
begin
   //Edit1.SetFocus;
  //TImageScrollBox(Sender).SetFocus;
  if TImageScrollBox(Sender).FileName = '' then
  begin
//ShowMessage('AAA');
Label3.Caption:='FileName='+TImageScrollBox(Sender).FileName+'  time='+FormatDateTime('yyyy/mm/dd HH:MM:SS', now);
    TImageScrollBox(Sender).MouseMode := mmUser
  end
  Else
  begin
Label3.Caption:='FileName='+TImageScrollBox(Sender).FileName;
    ViewMouseMode(NowClick);
  end;
  ISB1.AlwaysShowAnnotations := False;
//  if TImageScrollBox(Sender).FileName = '' then
//  begin
////ShowMessage('AAA');
//Label3.Caption:='FileName='+TImageScrollBox(Sender).FileName+'  time='+FormatDateTime('yyyy/mm/dd HH:MM:SS', now);
//    TImageScrollBox(Sender).MouseMode := mmUser
//  end
//  Else
//  begin
//Label3.Caption:='FileName='+TImageScrollBox(Sender).FileName;
//    ViewMouseMode(NowClick);
//  end;
end;
procedure TCB_IMGPSScanX.ISB1ImageMouseUp(Sender: TObject; Button: TMouseButton;
@@ -1619,6 +1691,12 @@
  ExistImgList.Free;
  reSizeExistImgList.Free;
  //********清單區********
  if (FMode = 'DSCAN') or (FMode = 'ESCAN')  then //重掃件及異動件要只能掃指定編號的件
  begin
    if ImagePath<>'' then
      _Deltree(ImagePath);
  end;
  if FEvents <> nil then FEvents.OnDestroy;
end;
@@ -1953,6 +2031,7 @@
  if TreeView1.Selected.Parent = MyTreeNode1 then
    PreNode2Name:= GetNode2Name(MyTreeNode2);
  ShowText := _Msg('文件歸類中,請稍候');
LogFile1.LogToFile(logTimeString+'縮圖  歸類開始');
  DataLoading(True,True);
  GoAtt := False;
  if (MytreeNode2 <> nil) and (Pos('Attach',MyTreeNode2.Text)>0) then
@@ -2014,6 +2093,7 @@
//ShowMessage('DocNoNeedDiv(DocNo)='+BoolToStr(DocNoNeedDiv(DocNo),true));
//ShowMessage('DocDir='+DocDir);
          if DocNoNeedDiv(DocNo) then   //要分份數
          begin
            if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(NowCaseno,DocDir)>0)) or (DocDir = '') then
@@ -2050,6 +2130,7 @@
              DocDir:=DocNo2DocNoDir(ImageSavePath+NowCaseno+'\',DocNo);
            SetDocNoList('A',-1,NowCaseno,DocDir);
          end; }
LogFile1.LogToFile(logTimeString+'縮圖  FormID='+FormID);
          if Not DirectoryExists(ImageSavePath+NowCaseno+'\'+DocDir) then
            Mkdir(ImageSavePath+NowCaseno+'\'+DocDir);
          ContextList.Clear;
@@ -2120,6 +2201,7 @@
  end;
  if CustomDocNo = '' then Exit;
  DocDir := CustomDocNo;
LogFile1.LogToFile(logTimeString+'縮圖 歸類自訂文件 DocDir='+DocDir);
  SavePath := ImageSavePath+NowCaseNo+'\'+DocDir+'\';
  Str2Dir(SavePath);
  SetDocNoList('A',-1,NowCaseNo,DocDir,'1');
@@ -2211,7 +2293,7 @@
//          Exit;
//        end;
//      end;
LogFile1.LogToFile(logTimeString+'縮圖刪除 iISB.FileName='+iISB.FileName);
      DeleteImageFile(ExtractFilePath(iISB.FileName),ExtractFileName(iISB.FileName),NowCaseNo);
    end;
  end;
@@ -2249,6 +2331,7 @@
    Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入'));
    Exit;
  end;
LogFile1.LogToFile(logTimeString+'掃瞄開始');
  if (FMode = 'RSCAN') or (FMode = 'ESCAN') or (FMode = 'DSCAN') then
  begin
    if NewTreeNode.Count > 0 then
@@ -2278,6 +2361,7 @@
    ContextList.Clear;
    Try
      StatrTwainScan;
LogFile1.LogToFile(logTimeString+'掃瞄結束');
    Except
      Panel1.Enabled := True;
      Panel2.Enabled := True;
@@ -2438,9 +2522,10 @@
  P,v,v1,v2,ln,i : Integer;
  iDocDir,iDocNo : String;
begin
LogFile1.LogToFile(logTimeString+'Tree 按下刪除');
  if TreeView1.Selected = NewTreeNode then  //全刪  //新掃描件
  begin
LogFile1.LogToFile(logTimeString+'Tree 全部刪除');
    If Messagedlg(_Msg('是否刪除所有案件?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
    clearView(1);
    Application.ProcessMessages;
@@ -2455,7 +2540,7 @@
  end
  Else if TreeView1.Selected = MyTreeNode1 then       //案件編號
  begin
LogFile1.LogToFile(logTimeString+'Tree 案件編號刪除 NowCaseno='+NowCaseno);
    If Messagedlg(Format(_Msg('編號(%s)是否刪除?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
    clearView(1);
    Application.ProcessMessages;
@@ -2501,6 +2586,7 @@
    ClearView(1);
    Application.ProcessMessages;
//ShowMessage(NowDocDir);
LogFile1.LogToFile(logTimeString+'Tree 文件層號刪除 NowDocDir='+NowDocDir);
    if (Length(NowDocDir)=8) or (NowDocDir=AttName) then
    begin
//ShowMessage('DeleteDocNoFileForESCAN');
@@ -2525,7 +2611,7 @@
  Else if TreeView1.Selected = MyTreeNode3 then       //FormID層
  begin
    If Messagedlg(Format(_Msg('文件(%s)是否刪除?'),[NowFormName]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
LogFile1.LogToFile(logTimeString+'Tree FormID層號刪除 NowFormCode='+NowFormCode);
    DeleteFormCodeFile(NowCaseNo,NowDocDir,NowFormCode);
    SetRecordEditedDocDir('A',NowCaseNo,NowDocDir);
    DrawDocItem2(MytreeNode1,NowCaseno);
@@ -2544,7 +2630,6 @@
  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
@@ -2635,11 +2720,13 @@
  if (Treeview1.Selected = NewTreeNode) {or (Treeview1.Selected = MyTreeNode1)} then
  begin
//ShowMessage('NewScanBtnClick');
LogFile1.LogToFile(logTimeString+'Tree NewScanBtnClick');
    NewScanBtnClick(self)
  end
  Else
  begin
//ShowMessage('AddScanBtnclick');
LogFile1.LogToFile(logTimeString+'Tree AddScanBtnclick');
    AddScanBtnclick(self);
  end;
end;
@@ -2669,6 +2756,7 @@
    ISB := TImageScrollBox.Create(self);
try
    ShowText := _Msg('檔案加入中,請稍候');
LogFile1.LogToFile(logTimeString+'檔案加入中開始');
    DataLoading(True, True);
    If TreeView1.Selected = Nil Then
      Exit;
@@ -2703,17 +2791,34 @@
      ShowText := _Msg('檔案加入中,請稍候(' + inttostr(i) + '/' + inttostr(P) + ')');
      DataLoading(True, True);
      ISB.LoadFromFile(FName, i);
      // ISB.SaveToFile('C:\OCX\aaaaaa'+IntToStr(i)+'.tif');
      DeskewImg(ISB.Graphic);
      // ISB.SaveToFile('C:\OCX\bbbbbb'+IntToStr(i)+'.tif');
      ISB_BW.Graphic.Assign(ISB.Graphic); //20180104
      If ISB.Graphic.ImageFormat <> ifBlackWhite Then   //20180104
      begin
        ConvertToBW(ISB_BW.Graphic);
      end;
      ///ISB_BW.SaveToFile('KKKKKKKK.tif');
      iGraphic_First := TTiffGraphic.Create;
      iGraphic_sec := TTiffGraphic.Create;
      iGraphic_First.Assign(ISB.Graphic);
      //ShowMessage(IntToStr(iGraphic_First.Palette.palNumEntries)); //彩色 會為0  黑白 為2
      MpsGetBarcode(ISB.Graphic, MpsBarcodeinf); //判斷A3 有用FormID 所以要先辨條碼
      MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf); //判斷A3 有用FormID 所以要先辨條碼
      For n := 1 To MpsBarcodeinf.Count Do
      Begin
        If MpsBarcodeinf.r180[n] <> 0 Then // 依條碼角度轉影像
        Begin
          Rotate(ISB.Graphic, MpsBarcodeinf.r180[n]);
          //MpsGetBarcode(iGraphic_First, MpsBarcodeinf);
          Break;
        End;
      End;
      iGraphic_First.Assign(ISB.Graphic);
      //有必要的話先把影像轉正 再開始切圖
      If CheckNeedCrop(iGraphic_First) Then
      Begin
@@ -2741,17 +2846,25 @@
          (TreeView1.Selected = MyTreeNode1) Then
        Begin
          SaveFilename := '';
          MpsGetBarcode(iGraphic, MpsBarcodeinf);
          ISB_BW.Graphic.Assign(iGraphic); //20180104
          If iGraphic.ImageFormat <> ifBlackWhite Then   //20180104
          begin
            ConvertToBW(ISB_BW.Graphic);
          end;
          MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
//ShowMessage(IntToStr(MpsBarcodeinf.Count));
          For n := 1 To MpsBarcodeinf.Count Do
          Begin
            If MpsBarcodeinf.r180[n] <> 0 Then // 依條碼角度轉影像
            Begin
              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
              MpsGetBarcode(iGraphic, MpsBarcodeinf);
              MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
              Break;
            End;
          End;
//ShowMessage('XXX '+IntToStr(MpsBarcodeinf.Count));
          FormID := BarCode2FormID;
//ShowMessage('FormID='+FormID);
          // 取出FormID
          SaveFilename := FormID;
          If (TreeView1.Selected = NewTreeNode) Then
@@ -2779,11 +2892,19 @@
          DocNo := FormCode2DocNo(FormID);
          DocDir := FindLastestDocDir(CaseID, DocNo);
          if (FMode='ESCAN') and (FModeName='補件掃描') then
          begin
            DocDir := FindLastestDocDirForPage(CaseID, DocNo,FormID);
//ShowMessage('DocDir='+DocDir);
          end;
          If DocNoNeedDiv(DocNo) Then // 要分份數
          Begin
            If ((FormCode2Page(FormID) = '01') And
              (GetDocDir_Page(CaseID, DocDir) > 0)) Or (DocDir = '') Then
              DocDir := DocNo2DocNoDir(ImageSavePath + CaseID + '\', DocNo);
              begin
                DocDir := DocNo2DocNoDir(ImageSavePath + CaseID + '\', DocNo);
              end;
          End
          Else // 不分份數
          Begin
@@ -2815,12 +2936,12 @@
            If MpsBarcodeinf.r180[n] <> 0 Then // 依條碼角度轉影像
            Begin
              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
              MpsGetBarcode(iGraphic, MpsBarcodeinf);
              MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
              Break;
            End;
          End;
          if iGraphic.Palette.palNumEntries = 0 then  //20171130 彩色 會為0  黑白 為2
//ShowMessage(IntToStr(iGraphic.Palette.palNumEntries));
          if (iGraphic.Palette.palNumEntries = 0) or (iGraphic.Palette.palNumEntries = 256) then  //20171130 彩色 會為0  黑白 為2  灰階256
          begin
            iGraphic.Compression:=tcJPEG;
            iGraphic.JpegQuality:=cooom;
@@ -2856,9 +2977,6 @@
              // SaveStream.Free;
            End;
          End;
          // Rotate(ISB.Graphic,MpsBarcodeinf.r180[n]);  //20170705 加入有條碼就轉正
          // ISB.SaveToFile(SavePath+SaveFilename);
          SetContextList('A', -1, CaseID, DocDir, SaveFilename);
          If (TreeView1.Selected = NewTreeNode) Then
@@ -2899,8 +3017,8 @@
              Break;
            End;
          End;
          // Rotate(ISB.Graphic,MpsBarcodeinf.r180[n]); //20170705 加入有條碼就轉正
          if iGraphic.Palette.palNumEntries = 0 then  //20171130 彩色 會為0  黑白 為2
          if (iGraphic.Palette.palNumEntries = 0) or (iGraphic.Palette.palNumEntries = 256) then  //20171130 彩色 會為0  黑白 為2
          begin
            iGraphic.Compression:=tcJPEG;
            iGraphic.JpegQuality:=cooom;
@@ -3094,6 +3212,7 @@
begin
  DocListForm := TDocListForm.Create(self);
  try
LogFile1.LogToFile(logTimeString+'Tree 歸類開始');
    InitialLanguage(DocListForm); //載入多國語言
    DocListForm.CheckBox1.Visible:=True;
    for i := 1 to FORM_INF_List.Count - 1 do
@@ -3119,6 +3238,7 @@
      begin
        //歸類到自訂文件
        NewFormID:=DocListForm.Edit1.Text;
        if Trim(DocListForm.Edit1.Text)='' then
        begin
          Showmessage('未輸入文件名稱');
@@ -3141,6 +3261,7 @@
        end;
        CustomDocNo := GetNewCustomDocNo(DisplayPath,NewFormID);
//ShowMessage('CustomDocNo='+CustomDocNo);
LogFile1.LogToFile(logTimeString+'Tree 歸類到自訂文件 CustomDocNo='+CustomDocNo);
        ShowText := _Msg('歸類中,請稍侯');
        DataLoading(True,True);
        FormIDReplace(NowCaseNo,NowDocDir,NowFormCode,CustomDocNo+'010101A');
@@ -3160,7 +3281,8 @@
        end;
        ShowText := _Msg('歸類中,請稍侯');
        DataLoading(True,True);
//ShowMessage('NowDocDir='+NowDocDir);
LogFile1.LogToFile(logTimeString+'Tree 歸類到既有文件 NewFormID='+NewFormID);
        FormIDReplace(NowCaseNo,NowDocDir,NowFormCode,NewFormID);
      end;
@@ -3882,6 +4004,11 @@
end;
procedure TCB_IMGPSScanX.ScrollBox1MouseEnter(Sender: TObject);
begin
ScrollBox1.SetFocus;
end;
procedure TCB_IMGPSScanX.SelectScanBtnClick(Sender: TObject);
begin
  Panel1.Enabled := False;
@@ -4250,14 +4377,14 @@
          end;
        end;
        pScanInfo^.Graphic.Compression := tcJpeg;
        pScanInfo^.Graphic.JpegQuality := 70;
        pScanInfo^.Graphic.JpegQuality := FJpgCompression;
    end
    else if pScanInfo^.Graphic.ImageFormat = ifColor256 Then
    begin
      //Ext := '.jpg';
      ConvertToGray(pScanInfo^.Graphic);
      pScanInfo^.Graphic.Compression := tcJpeg;
      pScanInfo^.Graphic.JpegQuality := 70;
      pScanInfo^.Graphic.JpegQuality := FJpgCompression;
    end
    else if pScanInfo^.Graphic.ImageFormat = ifGray256 Then
    begin
@@ -4275,7 +4402,13 @@
        end;
      end;
      pScanInfo^.Graphic.Compression := tcJpeg;
      pScanInfo^.Graphic.JpegQuality := 70;
      pScanInfo^.Graphic.JpegQuality := FJpgCompression;
//ShowMessage(IntToStr(pScanInfo^.Graphic.JpegQuality));
//if pScanInfo^.Graphic.Compression = tcJpeg then
//begin
//ShowMessage('jpg');
//end;
    end
    else
    begin
@@ -4308,6 +4441,19 @@
    end;
    //iGraphic.Assign(iGraphic_First);
    iGraphic := iGraphic_First;
    if iGraphic.ImageFormat=ifGray256 then  //20180104
    begin
      iGraphic.Compression:=tcJPEG;
      iGraphic.JpegQuality:=FJpgCompression;
    end;
    if iGraphic.ImageFormat=ifTrueColor then  //20180104
    begin
      iGraphic.Compression:=tcJPEG;
      iGraphic.JpegQuality:=FJpgCompression;
    end;
//ShowMessage('WTF');
    while not iGraphic.IsEmpty do
    begin
      //Application.ProcessMessages;
@@ -4317,6 +4463,25 @@
        ImageScrollBox1NewGraphic(ImageScrollBox1.Graphic);
        MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);
        For i := 1 To MpsBarcodeinf.Count Do
        Begin
          If MpsBarcodeinf.r180[i] <> 0 Then // 依條碼角度轉影像
          Begin
            Rotate(iGraphic, MpsBarcodeinf.r180[i]);
            Break;
          End;
        End;
        if iGraphic.ImageFormat=ifGray256 then  //20180104 因此旋轉後變為回packbits 所以要改為jpeg
        begin
          iGraphic.Compression:=tcJPEG;
          iGraphic.JpegQuality:=FJpgCompression;
        end;
        if iGraphic.ImageFormat=ifTrueColor then
        begin
          iGraphic.Compression:=tcJPEG;
          iGraphic.JpegQuality:=FJpgCompression;
        end;
        PageEnd;
        IF PEFileName <> '' Then
        begin
@@ -4341,7 +4506,7 @@
            JpgGr := TJpegGraphic.Create;
            try
              JpgGr.Assign(iGraphic);
              JpgGr.SaveQuality := 30;
              JpgGr.SaveQuality := FJpgCompression;
              //JpgGr.AppendToStream(SaveStream);
              JpgGr.SaveToFile(PEFileName);
            finally
@@ -4486,7 +4651,9 @@
          Str2Dir(ScanPath);
          ScanDocDir := FindLastestDocDir(ScanCaseno,DocNo);
//ShowMessage('AA ScanDocDir='+ScanDocDir);
//ShowMessage('BB ScanDocDir='+ScanDocDir);
          if DocNoNeedDiv(DocNo)then   //要分份數
          begin
            //Showmessage(DocNo+#13+FormCode2Page(FormID)+#13+inttostr(GetDocDir_Page(ScanCaseno,ScanDocDir))+#13+ScanDocDir);
@@ -4562,7 +4729,12 @@
          FormID := NowGuideFormID;
        DocNo := FormCode2DocNo(FormID);
        ScanDocDir := FindLastestDocDir(ScanCaseno,DocNo);
//ShowMessage('ScanDocDir='+ScanDocDir);
        if (FMode='ESCAN') and (FModeName='補件掃描') then    //20180207 加入的特殊邏輯
        begin
          ScanDocDir := FindLastestDocDirForPage(ScanCaseno, DocNo,FormID);
        end;
        if (DocNoNeedDiv(DocNo)) then   //要分份數
        begin
          if TreeView1.Selected = MyTreeNode1 then   //20170421 掃瞄插頁時選則在案號上才要分份數 選在FormID上就不分份數
@@ -5875,19 +6047,26 @@
Function TCB_IMGPSScanX.CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //取案件裡的文件_版本頁數
var
  i,n,Count : integer;
  S : TStringlist;
  S, S2 : TStringlist;
  FormCode,iPage : String;
  docInt,tempInt:integer;
  v,v2:integer;
begin
  Count := 0;
  docInt:=0;
  tempInt:=0;
  S := TStringlist.Create;
  S2 := TStringlist.Create;
//ShowMessage('page='+IntToStr(Pages));
  try
    S.LoadFromFile(ImageSavePath+CaseID+'\upload\Context.dat');
    S2.LoadFromFile(ImageSavePath+CaseID+'\upload\DocDir.dat'); //2017 1220 改成只承認第一份的
    for I := 1 to pages do //從0到pages-1  改成 1到pages 20170316 這樣可以修改檢核的頁數問題
    begin
      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
@@ -5895,9 +6074,33 @@
            Continue;
          end;
        end;
        if (Length(S2.Strings[n])>8) and (Pos(DocNo,S2.Strings[n])<>0) then //2017 1220 改成只承認第一份的
        begin
//LogFile1.LogToFile(logTimeString+'有進'+docno+','+S2.Strings[n]+IntToStr(Pos(DocNo,S2.Strings[n])));
          v:=Pos('(',S2.Strings[n]);
          v2:=Pos(')',S2.Strings[n]);
          tempInt:=StrToInt(Copy(S2.Strings[n],v+1,v2-v-1));
          if docInt=0 then
          begin
            docInt:=tempInt;
          end;
          if docInt<>tempInt then
          begin
//LogFile1.LogToFile(logTimeString+'docInt='+IntToStr(docInt)+',tempInt='+IntToStr(tempInt));
            Result := Count;
            Break;
          end;
        end;
        FormCode := FileName2FormCode(S.Strings[n]);
//LogFile1.LogToFile(logTimeString+'S.Strings[n]='+S.Strings[n]);
//Showmessage('1:'+version+','+FormCode2Version(FormCode)+','+DocNo+','+FormCode2DocNo(FormCode)+','+iPage+','+FormCode2Page(FormCode));
//LogFile1.LogToFile(logTimeString+'FormCode='+FormCode);
LogFile1.LogToFile(logTimeString+'CheckCaseDocNoPage caseno='+CaseID+','+version+','+FormCode2Version(FormCode)+','+DocNo+','+FormCode2DocNo(FormCode)+','+iPage+','+FormCode2Page(FormCode));
//ShowMessage(DocNo+','+IntToStr(docInt)+','+IntToStr(tempInt));
//LogFile1.LogToFile(logTimeString+'FormCode='+FormCode);
        if (version = FormCode2Version(FormCode)) and (DocNo = FormCode2DocNo(FormCode)) and (ipage = FormCode2Page(FormCode)) then
        begin
LogFile1.LogToFile(logTimeString+'CheckCaseDocNoPage caseno='+CaseID+','+version+','+FormCode2Version(FormCode)+','+DocNo+','+FormCode2DocNo(FormCode)+','+iPage+','+FormCode2Page(FormCode));
@@ -5910,6 +6113,7 @@
    end;
  finally
  S.Free;
  S2.free;
  end;
  Result := Count;
end;
@@ -7235,7 +7439,16 @@
    NewDocNo := FormCode2DocNo(NewFormID);
    NewDocDir := FindLastestDocDir(CaseID,NewDocNo);
    if NewDocDir = '' then
      NewDocDir := NewDocNo;
    begin
      if DocNoNeedDiv(NewDocNo) then
      begin
        NewDocDir:=DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',NewDocNo);
      end
      else
      begin
        NewDocDir := NewDocNo;
      end;
    end;
//ShowMessage('NewDocDir='+NewDocDir);
    if DocNoNeedDiv(NewDocNo) and (FormCode2Page(NewFormID)='01') then
    begin
@@ -8032,6 +8245,35 @@
  //R_W_ScanIni('W');       //user要求改成預設後不能改
end;
procedure TCB_IMGPSScanX.ScanGrayCBClick(Sender: TObject);
begin
  if ScanGrayCB.Checked then
  begin
    ScanColor:=ifGray256;
  end
  else
  begin
    if FScanColor = 0 then
    begin
      ScanColor := ifBlackWhite;
    end;
    if FScanColor = 1 then
    begin
      //ScanColor := ifGray256 ;
      ScanColor := ifBlackWhite; //
    end;
    if FScanColor = 2 then
    begin
      ScanColor := ifTrueColor ;
    end;
  end;
end;
Function TCB_IMGPSScanX.GetFormatID(CaseID: string):String;
Var
  S : TStringlist;
@@ -8301,12 +8543,14 @@
begin
  ShowText := _Msg('處理檢核失敗中,請稍候');
  DataLoading(True,True);
LogFile1.LogToFile(logTimeString+'處理檢核失敗中開始');
  ErrlistForm := TErrlistForm.Create(Self);
  RejectCase := False;
  S := TStringlist.Create;
  try
    InitialLanguage(ErrlistForm);
    Application.ProcessMessages;
    ErrlistForm.LogFile1.LogFile:=LogFile1.LogFile;
    ErrlistForm.DeleteBt.Caption := ErrlistForm.DeleteBt.Caption+'(&D)';
    ErrlistForm.iniPath := ImageSavePath + NowCaseNo+'\upload\';
    OMRErrini2List(NowCaseno,ErrlistForm);
@@ -8500,6 +8744,7 @@
      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('頁'),[CaseDocNoList.Strings[i],DocNo2DocName(Caseno,iDocNo),DocNoPage]));
      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[CaseDocNoList.Strings[i],DocNo2DocName(Caseno,iDocNo),DocNoCopies]));
//ShowMessage('iDocNo='+iDocNo);
      DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[DocNo2DocName(Caseno,iDocNo),CaseDocNoList.Strings[i],DocNoCopies]));
      if GetUseCase('F',ImageSavePath+Caseno+'\',CaseDocNoList.Strings[i]) <> '' Then
@@ -8722,6 +8967,7 @@
  if FScanColor = 1 then
  begin
    ScanColor := ifGray256 ;
    ScanGrayCB.Checked:=True;
  end;
  if FScanColor = 2 then
@@ -9686,6 +9932,48 @@
  FileList.Free;
  end;
end;
Function TCB_IMGPSScanX.FindLastestDocDirForPage(CaseID,DocNo,formid:String):String; //找出最新的DocDir  20180207  排除隱藏的資料夾
var
  i,j:integer;
  DocNoList,FileList : TStringlist;
  Imglist: TStringlist;
  DirIsHide:Boolean;
begin
  Result := '';
  DocNoList := TStringlist.Create;
  FileList := TStringlist.Create;
  imglist := TStringlist.Create;
  try
  if FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then
    DocNoList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
  for i := DocNoList.Count-1 downto 0 do
  begin
    if Copy(DocNoList.Strings[i],1,length(DocNo)) = DocNo then
    begin
//ShowMessage(ImageSavePath+CaseID+'\'+DocNoList.Strings[i]);
      if not DocNoIsExistImg(ImageSavePath+CaseID+'\'+DocNoList.Strings[i]+'\') then
      begin
//ShowMessage('DDDDD');
        Result := '';
        Break;
      end
      else
      begin
        Result := DocNoList.Strings[i];
        Break;
      end;
    end;
  end;
  finally
    DocNoList.Free;
    FileList.Free;
    imglist.Free;
  end;
end;
Procedure TCB_IMGPSScanX.Create_Cust_DocDir(CaseID:String); //產生外面傳入的文件代號及自定文件
var
@@ -11199,6 +11487,7 @@
  begin
    If FindSQLData(Doc_Inf_List,'DOC_U_DESC','DOC_NO',DocNo,0,FindResult) Then
    begin
//ShowMessage(FindResult.Text);
      Result := GetFindResult('DOC_U_DESC');
    end;
  end;
@@ -11501,6 +11790,7 @@
              MainFormPage := GetDataDocNoPage(MainDocNo,MainVersion); //資料庫記錄主文件頁數
              CaseFormPage := CheckCaseDocNoPage(CaseID,MainDocNo,MainVersion,MainFormPage); //案件主文件的頁數
LogFile1.LogToFile(logTimeString+CaseID+',MainDocNo='+MainDocNo+',MainVersion='+MainVersion+',MainFormPage='+IntToStr(MainFormPage)+',CaseFormPage='+IntToStr(CaseFormPage));
              //CheckFirstDocNoPage
              IF (MainFormPage > 0) and (MainFormPage <> CaseFormPage) then
              begin
                ErrStr:=MainDocNo+Format(OMRErrInfo[1].Info,[Inttostr(MainFormPage),Inttostr(CaseFormPage)]); //主要文件需有XX頁僅附XX頁
@@ -12174,6 +12464,44 @@
  ini.Free;
  end;
end;
function TCB_IMGPSScanX.OMRErrini2ListForLog(CaseID: String): String;
var
  ini : Tinifile;
  Errcount : Integer;
  Del : Boolean;
  i,j : Integer;
  ST,CaseList:TStringList;
begin
  Result:='';
  //CaseList.dat
  ST:=TStringList.Create;
  CaseList:=TStringList.Create;
  CaseList.LoadFromFile(ImageSavePath+'CaseList.dat');
  for I := 0 to CaseList.Count - 1 do
  begin
    ini := Tinifile.Create(ImageSavePath + CaseList.Strings[i]+'\upload\Checkerr.ini');
    try
      Errcount := ini.ReadInteger('OMRCount','Count',0);
      for j := 1 to ErrCount do
      begin
        Del := ini.ReadBool(inttostr(j),'Del',False); //是否被移除了
        if Not Del then
        begin
          ST.Add(ini.ReadString(inttostr(j),'Reason','')) ;
        end;
      end;
    finally
    ini.Free;
    end;
  end;
  Result:=ST.Text;
  ST.Free;
  CaseList.Free;
end;
Function TCB_IMGPSScanX.DownLanguage:Boolean;  //下載多國語言檔
begin
@@ -12853,7 +13181,7 @@
Procedure TCB_IMGPSScanX.ISBMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  Edit1.SetFocus;
  //Edit1.SetFocus;
  if Draging then
  begin
    if not (TShape(FindComponent('SP'+Copy(TImageScrollBox(Sender).Name,length(ISBName)+1,length(TImageScrollBox(Sender).Name)-length(ISBName)))) = nil) then
@@ -14454,6 +14782,7 @@
    Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入'));
    Exit;
  end;
LogFile1.LogToFile(logTimeString+'按下上傳');
  ClearView(1);
  CaseHelpBtn.Visible := False;
  DisplayPath := '';
@@ -14585,8 +14914,10 @@
  if ReCasecount > 0 then
    TransMsg := TransMsg + #13#10 + Format(_Msg('無法上傳件【%d】件'),[ReCasecount]);
  if CheckErrCount > 0 then
  begin
    TransMsg := TransMsg + #13#10 + Format(_Msg('檢核失敗件【%d】件,請先點選「案件編號」,再點選「問號」查看錯誤原因'),[CheckErrCount]);
LogFile1.LogToFile(logTimeString+'檢核失敗原因:'+OMRErrini2ListForLog(''));
  end;
  if (FMode = 'DSCAN') and (SuccessCount = 1)  then
  begin
@@ -15069,10 +15400,15 @@
end;
procedure TCB_IMGPSScanX.TreeView1MouseEnter(Sender: TObject);
begin
TreeView1.SetFocus;
end;
procedure TCB_IMGPSScanX.TreeView1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  TreeView1.SetFocus;
  //TreeView1.SetFocus;
  {UnRegisterHotKey(Handle, HotKeyId1);
  UnRegisterHotKey(Handle, HotKeyId2); }
end;