From 630dbb00b682c2e5ebee6ec666694441230b29cf Mon Sep 17 00:00:00 2001
From: Hong-Dell\Hong <chlin1022@i-mps.com>
Date: 星期四, 04 七月 2024 15:22:55 +0800
Subject: [PATCH] Ver 2,0,1,80

---
 CB_IMGPSScanImp.pas | 6456 ++++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 4,550 insertions(+), 1,906 deletions(-)

diff --git a/CB_IMGPSScanImp.pas b/CB_IMGPSScanImp.pas
index dec6c88..88d347a 100644
--- a/CB_IMGPSScanImp.pas
+++ b/CB_IMGPSScanImp.pas
@@ -1,5 +1,5 @@
-unit CB_IMGPSScanImp;
-
+unit CB_IMGPSScanImp;
+//TEST
 {$WARN SYMBOL_PLATFORM OFF}
 
 interface
@@ -9,37 +9,47 @@
   EnDiGrph, { for TDibGraphic }
   EnMisc,   { for MinFloat }
   EnTifGr,  { for TTifGraphic }
+  {$IFDEF Production}
+  CB_IMGPSScan_TLB,
+  {$ENDIF}
+  {$IFDEF Test}
+  CB_IMGPSScan_test_TLB,
+  {$ENDIF}
+
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
-  ActiveX, AxCtrls, CB_IMGPSScan_TLB, StdVcl, VCLUnZip, VCLZip, Encryp,
+  ActiveX, AxCtrls, StdVcl, VCLUnZip, VCLZip, Encryp,
   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, LogFile,ShellApi,
+  SBSocket,IIS_Ftp, SBSimpleFTPS;
+Type
+  TTransMode =(tsHttp,tsFtp,tsNone);
 
 var
   Ch_WriteNote : Boolean;
   RejectCase : Boolean;
   ErrIndex : Integer;
 
-  //*****�w�]��*****//
-    Def_DeviceDelete : Boolean;  //�ťխ��R���Ұ�
-    Def_DeviceDeleteSize : Integer;  //�ťխ�Size
-    Def_ScannerReverse : Boolean; //�O�_�ݤϬ�
-    Def_BoardClear : Boolean; //�O�_�M����
-    Def_ScanDpi : Integer;    //����DPI
-    Def_ScanDuplex : Boolean; //�O�_��������
-    Def_ScanRotate : Integer; //���ˮɱ��ਤ��
-    Def_ScanDeskew : Boolean; //�O�_�ɱ��B��
-    Def_ScanBright : Integer; //�G��
-    Def_ScanContrast : Integer; //���
-    Def_ScanImgShowMode : Integer; //0:�M���v�� 1:���M���v�� 2:�����
-    Def_ScanImgSetUse : Boolean; //�O�_�ϥΫG�׹��]�w
-  //*****�w�]��*****//
+  //*****預設區*****//
+    Def_DeviceDelete : Boolean;  //空白頁刪除啟動
+    Def_DeviceDeleteSize : Integer;  //空白頁Size
+    Def_ScannerReverse : Boolean; //是否需反相
+    Def_BoardClear : Boolean; //是否清黑邊
+    Def_ScanDpi : Integer;    //掃瞄DPI
+    Def_ScanDuplex : Boolean; //是否雙面掃瞄
+    Def_ScanRotate : Integer; //掃瞄時旋轉角度
+    Def_ScanDeskew : Boolean; //是否傾斜矯正
+    Def_ScanBright : Integer; //亮度
+    Def_ScanContrast : Integer; //對比
+    Def_ScanImgShowMode : Integer; //0:清楚影像 1:不清楚影像 2:不顯示
+    Def_ScanImgSetUse : Boolean; //是否使用亮度對比設定
+  //*****預設區*****//
 
 Const
   ISBName = 'PreViewISB';
 
-{����ۨ��������һݭn }
+{獲取自身版本號所需要 }
 type
   TVersionLanguage = (vlArabic, vlBulgarian, vlCatalan, vlTraditionalChinese,
      vlCzech, vlDanish, vlGerman, vlGreek, vlUSEnglish, vlCastilianSpanish,
@@ -58,7 +68,7 @@
    $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F, $0420, $0421,
    $0804, $0807, $0809, $080A, $080C, $0810, $0813, $0814, $0816, $081A,
    $0C0C, $100C, $0000);
-{����ۨ��������һݭn end}
+{獲取自身版本號所需要 end}
 
 
 type
@@ -72,8 +82,8 @@
     ImageCount : LongInt;
   end;
   TOMRErrInfo = record
-    Display : Boolean;  //�O�_���
-    Ignore : Boolean; //�i�_�R��
+    Display : Boolean;  //是否顯示
+    Ignore : Boolean; //可否刪除
     Info : String;
     Mode : String;
   end;
@@ -111,7 +121,6 @@
     Splitter1: TSplitter;
     Panel3: TPanel;
     Label7: TLabel;
-    TreeView1: TTreeView;
     Panel6: TPanel;
     CB1: TCheckBox;
     ScanDuplexCB: TCheckBox;
@@ -145,7 +154,6 @@
     ISB2: TImageScrollBox;
     imgp1: TPanel;
     lb1: TLabel;
-    ISB1: TImageScrollBox;
     Memo1: TMemo;
     Display1: TMemo;
     Panel22: TPanel;
@@ -181,7 +189,6 @@
     PM402: TMenuItem;
     PM403: TMenuItem;
     PM404: TMenuItem;
-    HTTPSClient: TElHTTPSClient;
     ElWinCertStorage: TElWinCertStorage;
     ElMemoryCertStorage: TElMemoryCertStorage;
     Panel5: TPanel;
@@ -189,8 +196,6 @@
     Panel11: TPanel;
     SampleScanBtn: TBitBtn;
     WNoteBtn: TBitBtn;
-    Panel13: TPanel;
-    CaseHelpBtn: TBitBtn;
     PopupMenu1: TPopupMenu;
     PM101: TMenuItem;
     N12: TMenuItem;
@@ -248,13 +253,31 @@
     Edit1: TEdit;
     PM110: TMenuItem;
     Image1: TImage;
-    PrtLb: TLabel;
     UseOldCaseLb: TLabel;
     PM111: TMenuItem;
     SmoothCB: TCheckBox;
     ISB_BW: TImageScrollBox;
     N1: TMenuItem;
     N2: TMenuItem;
+    ISB1: TImageScrollBox;
+    Label3: TLabel;
+    LogFile1: TLogFile;
+    ScanGrayCB: TCheckBox;
+    AttFileGB: TGroupBox;
+    AttListBox: TListBox;
+    Panel20: TPanel;
+    AddAttFileLB: TLabel;
+    DelAttFileLB: TLabel;
+    Splitter2: TSplitter;
+    Panel17: TPanel;
+    TreeView1: TTreeView;
+    Panel13: TPanel;
+    PrtLb: TLabel;
+    CaseHelpBtn: TBitBtn;
+    HTTPSClient: TElHTTPSClient;
+    Button5: TButton;
+    FTPSClient1: TElSimpleFTPSClient;
+    Button6: TButton;
     procedure ActiveFormCreate(Sender: TObject);
     procedure Panel9Resize(Sender: TObject);
     procedure ISB1Click(Sender: TObject);
@@ -370,14 +393,27 @@
     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);
+    procedure AddAttFileLBClick(Sender: TObject);
+    procedure DelAttFileLBClick(Sender: TObject);
+    procedure AttListBoxDblClick(Sender: TObject);
+    procedure AttListBoxClick(Sender: TObject);
+    procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure HTTPSClientRedirection(Sender: TObject; const OldURL: string;
+      var NewURL: string; var AllowRedirection: Boolean);
+    procedure Button5Click(Sender: TObject);
+    procedure Button6Click(Sender: TObject);
   private
     { Private declarations }
     HotKeyId1,HotKeyId2,HotKeyId3,HotKeyId4 :Integer;
 
-    ////////�ǤJ�Ѽ�/////////
+    ////////傳入參數/////////
     FUrl : String;
     FCaseID : String;
-    FMode : String;        //NSCAN:�s��;ESCAN:�ק�
+    FMode : String;        //NSCAN:新件;ESCAN:修改 20170306 DSCAN:被配合待掃瞄清單使用
     FModeName : String;
     FWork_no : String;
     FUserID : String;
@@ -387,122 +423,150 @@
     FVerify : String;
     FReWrite : String;
     FLanguage : String;
-    FLoanDoc_Value : String; //�s�W�«H������
-    FLoanDoc_Enable : String; //�s�W�«H���O�_�i����
-    FUseProxy : String; //�O�_�ϥ�Proxy
-    FC_DocNoList : String; //�~���Ǩӭn�s�W�����s��
-    FC_DocNameList : String; //�~���Ǩӭn�s�W���ۭq���
-    FFixFileList : String; //�n����ɦW
-    FIs_In_Wh : String; //�O�_�u��ܤJ�w���  (Y:�u��ܤJ�w N:�u��ܫD�J�w �ť�:�����)
-    FOldCaseInfo : String; //�¥��T  CaseID_year[tab]CaseID_year
-    FPrintyn : String; //�O�_�i�C�L
-    FIs_OldCase : String; //�O�_�O�®ײĤ@���i�J
-    FCustDocYN : String; //�O�_�i�ۭq���
-    ////////�ǤJ�Ѽ�///////
+    FLoanDoc_Value : String; //新增授信卷的值
+    FLoanDoc_Enable : String; //新增授信卷是否可異動
+    FUseProxy : String; //是否使用Proxy
+    FC_DocNoList : String; //外面傳來要新增的文件編號
+    FC_DocNameList : String; //外面傳來要新增的自訂文件
+    FFixFileList : String; //要鎖住的檔名
+    FIs_In_Wh : String; //是否只顯示入庫文件  (Y:只顯示入庫 N:只顯示非入庫 空白:都顯示)
+    FOldCaseInfo : String; //舊件資訊  CaseID_year[tab]CaseID_year
+    FPrintyn : String; //是否可列印
+    FIs_OldCase : String; //是否是舊案第一次進入
+    FCustDocYN : String; //是否可自訂文件
+    //20170222 新增
+    FImgDPI:integer;//DPI  依業務別決定 150~~1200  預設300
+    FScanColor:integer;///掃瞄色彩  依業務別決定   0 :黑白  1:灰階   2:彩色 預設黑白
+    FFileSizeLimit:integer;//匯入單一檔案大小限  依業務別決定  以KB為單位  預設5*1024kb
+    FCaseNoLength:integer;//案件編號長度檢查  依業務別決定   無預設  一定要傳入
+    FImgDelete:string; // Y/N  有權限可在補件時刪除影像
+    FIsExternal:string;//Y/N
+    FCheck_main_form:string; //Y/N
+    FWH_category:string;  //Y/N  Y是歸類時有區分入庫非入庫文件  N 是不區分
+    ////////傳入參數///////
 
-    //********Http�Ѽ�********
-    HttpErrStr : String; //���~�T��
-    //********Http�Ѽ�********
+    TransMode : TTransMode;   //用何種方式上傳檔案
+    //********Http參數********
+    HttpErrStr : String; //錯誤訊息
+    //********Http參數********
 
-    //********ini�Ѽ�********
-    DeviceDelete : Boolean;     //�ťխ��R���Ұ�
-    DeviceDeleteSize : Integer;  //�ťխ�Size
-    ScannerReverse : Boolean; //�O�_�ݤϬ�
-    BoardClear : Boolean; //�O�_�M����
-    ScanDpi : Integer;    //����DPI
-    ScanDuplex : Boolean; //�O�_��������
-    ScanRotate : Integer; //���ˮɱ��ਤ��
-    ScanDeskew : Boolean; //�O�_�ɱ��B��
-    ScanBright : Integer; //�G��
-    ScanContrast : Integer; //���
-    ScanImgShowMode : Integer; //0:�M���v�� 1:���M���v�� 2:�����
-    ScanImgSetUse : Boolean; //�O�_�ϥΫG�׹��]�w
+    //********Ftp參數*********
+    FFtpIP : String;
+    FFtpID : String;
+    FFtpPwd : String;
+    FFtpRootPath : String;
+    FFtpExtraPath : String;
+    FFtpPort : Integer;
+    FFtpProtocol : TFtpProtocol;
+    //********Ftp參數*********
 
-    //********ini�Ѽ�********
+    //********ini參數********
+    DeviceDelete : Boolean;     //空白頁刪除啟動
+    DeviceDeleteSize : Integer;  //空白頁Size
+    ScannerReverse : Boolean; //是否需反相
+    BoardClear : Boolean; //是否清黑邊
+    ScanDpi : Integer;    //掃瞄DPI
+    ScanDuplex : Boolean; //是否雙面掃瞄
+    ScanRotate : Integer; //掃瞄時旋轉角度
+    ScanDeskew : Boolean; //是否傾斜矯正
+    ScanBright : Integer; //亮度
+    ScanContrast : Integer; //對比
+    ScanImgShowMode : Integer; //0:清楚影像 1:不清楚影像 2:不顯示
+    ScanImgSetUse : Boolean; //是否使用亮度對比設定
+
+    //********ini參數********
     ScanColor : TImageFormat;
 
-    //********�ɶ�********
+    //********時間********
     ServerDate : String;
     ServerTime : String;
-    Balance : Longint; //local��server���ɶ��t
-    ScanDenialTime : String; //����i��ɶ�
-    //********�ɶ�********
-    ScanDenialHint : String; //���y��ܴ����r��
+    Balance : Longint; //local跟server的時間差
+    ScanDenialTime : String; //停止進件時間
+    //********時間********
+    ScanDenialHint : String; //掃描顯示提醒字串
 
-    //********���|********
+    //********路徑********
     ScanPath : String;       // SpecifyDir\Workid\userunit\mode
     ImagePath : String;      // SpecifyDir\Workid\userunit\mode
     ImageSavePath : String;   // ImagePath\
     ScaniniPath : String;    // SpecifyDir\Workid\userunit\
-    LngPath :String;         //�h��y���ɥؿ�
-    CheckXmlPath : String;   //�ˮ֥Ϊ�Xml�s��ؿ�
-    SitePath : String;      //�n����m(��ñ�W��)
-    SamplePath : String;     //�d���ؿ�
-    TransPath : String;     //�ɮפW�Ǫ����|(�ɥR��|�h�@�h�ؿ�)
-    //********���|********
-    ScanSaveFilename : String; //���˪��ɦW
-    ScanCaseno : String;  //���ˮɪ��׸�
-    ScanDocDir : String;  //���y�ɪ����N���ؿ�
-    //********�M���********
-    Doc_Inf_List : TStringList;  //Doc_Inf �M��
-    DM_FORM_INF_List :TstringList;  //DM_FORM_INF �M��
-    FORM_INF_List : TStringList; //FORM_INF���M��
-    CHECK_RULE_INF_List : TStringList;  //CHECK_RULE_INF  �M��
-    MEMO_INF_List : TStringList;  //MEMO_INF �M��
-    WORK_INF_List : TStringList;  //WORK_INF �M��
-    LASTEST_FORM_INF_List : TStringList;  // LASTEST_FORM_INF �M��
+    LngPath :String;         //多國語言檔目錄
+    CheckXmlPath : String;   //檢核用的Xml存放目錄
+    SitePath : String;      //登打位置(切簽名用)
+    SamplePath : String;     //範本目錄
+    TransPath : String;     //檔案上傳的路徑(補充件會多一層目錄)
+    //********路徑********
+    ScanSaveFilename : String; //掃瞄的檔名
+    ScanCaseno : String;  //掃瞄時的案號
+    ScanDocDir : String;  //掃描時的文件代號目錄
+    //********清單區********
+    Doc_Inf_List : TStringList;  //Doc_Inf 清單
+    DM_FORM_INF_List :TstringList;  //DM_FORM_INF 清單
+    FORM_INF_List : TStringList; //FORM_INF的清單
+    CHECK_RULE_INF_List : TStringList;  //CHECK_RULE_INF  清單
+    MEMO_INF_List : TStringList;  //MEMO_INF 清單
+    WORK_INF_List : TStringList;  //WORK_INF 清單
+    LASTEST_FORM_INF_List : TStringList;  // LASTEST_FORM_INF 清單
 
-    FindResult : TStringList;    //��SQLData�����G
-    CaseList : TStringList;    //�O�����ˮץ󪺶���
-    Context_DocnoList : TStringlist; //�ץ�̪�Docno�M��
-    CaseDocNoList : TStringlist;  //�ץ�̪�DocNo�M��(������)
-    CaseDocNo_CopiesList : TStringlist; //�ץ�̪�DocNo���ƲM��
-    ContextList : TStringlist; //�ץ�̪��ɮײM��
-    OMRFileList : TStringList; //�nOMR�ˮ֪����(�u�ˬd�C��Form���Ĥ@��)
-    Cust_DocNoList : TStringlist; //�ۦ�w�q���W��
-    IN_WH_DocNoList : TStringlist; //�J�w�����M��
+    FindResult : TStringList;    //找SQLData的結果
+    CaseList : TStringList;    //記錄掃瞄案件的順序
+    Context_DocnoList : TStringlist; //案件裡的Docno清單
+    CaseDocNoList : TStringlist;  //案件裡的DocNo清單(不重複)
+    CaseDocNo_CopiesList : TStringlist; //案件裡的DocNo份數清單
+    ContextList : TStringlist; //案件裡的檔案清單
+    AttContextList : TStringlist; //案件裡的附加檔案清單
+    OMRFileList : TStringList; //要OMR檢核的文件(只檢查每種Form的第一頁)
+    Cust_DocNoList : TStringlist; //自行定義文件名稱
+    IN_WH_DocNoList : TStringlist; //入庫的文件清單
 
-    FormCode_PageSize : TStringList; //��󪺹w�]�j�p  FormCode_Height_Width
-    DocNo_NeedDoc : TStringList; //��Docno�ɭn�̪ۨ����   DocNo_�̤ۨ��_�̤ۨ��
-    DocNo_NoDoc : TstringList; //��Docno�ɤ��������   DocNo_�������_�������
-    DocNo_VerinCase : TStringlist; //�ץ�̪�DocNo+�������M��
+    FormCode_PageSize : TStringList; //文件的預設大小  FormCode_Height_Width
+    DocNo_NeedDoc : TStringList; //有Docno時要相依的文件   DocNo_相依文件_相依文件
+    DocNo_NoDoc : TstringList; //有Docno時互斥的文件   DocNo_互斥文件_互斥文件
+    DocNo_VerinCase : TStringlist; //案件裡的DocNo+版本的清單
 
-    NoSaveBarCodeList : TStringlist; //���x�s�����X�M��
-    FormID_List : TStringlist;    //FormID �M��  20130403 �]����FormCode2Docno�|�ܺC..��FormID��X��
-    DocNo_List : TStringlist;     //DocNo �M��  20130403 �]����FormCode2Docno�|�ܺC..��DocNo��X��
-    NowShowFileList : TStringlist;  //�ثe��ܪ��v���M��
-    NowSelectFileList : TStringlist; //�ثe�Q�I�諸�v���M��
-    GuideFormIDList : TStringlist; //�n��ɤޭ����M��
-    //********�M���********
+    NoSaveBarCodeList : TStringlist; //不儲存的條碼清單
+    FormID_List : TStringlist;    //FormID 清單  20130403 因為原FormCode2Docno會很慢..把FormID抽出來
+    DocNo_List : TStringlist;     //DocNo 清單  20130403 因為原FormCode2Docno會很慢..把DocNo抽出來
+    NowShowFileList : TStringlist;  //目前顯示的影像清單
+    NowSelectFileList : TStringlist; //目前被點選的影像清單
+    GuideFormIDList : TStringlist; //要當導引頁表單清單
+    DivPageFormIDList:TStringlist; //要當分案頁表單清單
+    LastInitFormidList:TStringList;
+    LastAddFormidList:TstringList;
+    SampleFormIDList:TStringList; //20170627 已存在範本的formid
+    ExistImgList:TStringList;  //20170724  已經存在的影像list for ESCAN  //Img的完整路徑
+    reSizeExistImgList:TstringList; //20171012被縮放的舊圖MD5存入
+    //********清單區********
 
-    //********��ܰ�********
-    NowCaseno : String; //�ثe��ܪ��ץ�s��
-    NowDocNo : String;  //�ثe�����s��
-    NowDocDir : String; //�ثe�����ؿ�
-    NowFormCode : String; //�ثe��ܪ����s��
-    NowFormName : String; //�ثe��ܪ����W��
-    NowPage : Integer;   //�ثe�I�諸���X
-    DisplayPath : String; //�ثe��ܪ��ؿ�
-    //********��ܰ�********
+    //********顯示區********
+    NowCaseno : String; //目前顯示的案件編號
+    NowDocNo : String;  //目前的文件編號
+    NowDocDir : String; //目前的文件目錄
+    NowFormCode : String; //目前顯示的表單編號
+    NowFormName : String; //目前顯示的表單名稱
+    NowPage : Integer;   //目前點選的頁碼
+    DisplayPath : String; //目前顯示的目錄
+    //********顯示區********
 
-    //******���޸��*********
-    Case_loandoc : String; //�O�_�s�W�«H��
-    //******���޸��*********
+    //******索引資料*********
+    Case_loandoc : String; //是否新增授信卷
+    //******索引資料*********
 
-    //********�Q�r�w���I��T********
-    UpLPoint : Tpoint;  //���W�誺�Q�r�I
-    UpRPoint : Tpoint;  //�k�W�誺�Q�r�I
-    DownLPoint : Tpoint;  //���U�誺�Q�r�I
-    DownRPoint : Tpoint;  //�k�U�誺�Q�r�I
-    Point_Width : String;   //�Q�r�I���e
-    Point_Height : String;   //�Q�r�I����
-    //********�Q�r�w���I��T********
+    //********十字定位點資訊********
+    UpLPoint : Tpoint;  //左上方的十字點
+    UpRPoint : Tpoint;  //右上方的十字點
+    DownLPoint : Tpoint;  //左下方的十字點
+    DownRPoint : Tpoint;  //右下方的十字點
+    Point_Width : String;   //十字點的寬
+    Point_Height : String;   //十字點的高
+    //********十字定位點資訊********
 
-    CaseIDLength : Integer; //�ץ�s������
-    FormIDLength : Integer; //FormID����
-    DocNoLength : Integer;  //Docno����
+    CaseIDLength : Integer; //案件編號長度
+    FormIDLength : Integer; //FormID長度
+    DocNoLength : Integer;  //Docno長度
 
-    PEFileName : String; //���y�ɪ��ɦW
+    PEFileName : String; //掃描時的檔名
+    DownFileErrStr : String;  //下載影像時發生的錯誤
 
     ISB : TImageScrollBox;
     ScanInfo    : TScanInfo;
@@ -510,274 +574,287 @@
     MpsBarcodeinf : TMpsBarcodeinf;
     ScanMode : TScanMode;
     Mpskey : String;
-    Seg : Integer; //��ܪ���ɭ�
-    VMode : Integer; //��ܪ�index
-    NowClick : Integer;   //�ثe�I�쪺���s�\��Index
-    ScanIP : String;  //���˺ݪ�IP
-    DisplayISB : TImageScrollBox; //�Q�I�쪺�v��
-    SelectISB : TImageScrollBox; //�Q�I�쪺�Y��
-    SelectPage : Integer; //�Q�I�쪺����
+    Seg : Integer; //顯示的邊界值
+    VMode : Integer; //顯示的index
+    NowClick : Integer;   //目前點到的按鈕功能Index
+    ScanIP : String;  //掃瞄端的IP
+    DisplayISB : TImageScrollBox; //被點到的影像
+    SelectISB : TImageScrollBox; //被點到的縮圖
+    SelectPage : Integer; //被點到的頁數
     NewTreeNode,MyTreeNode1,MyTreeNode2,MyTreeNode3 : TTreenode;
-    InitialOk : Boolean; //��T���J�O�_����
-    ShowText : String; //DataLoading�ɭn�q�X���T��
-    Ext : String; //���ɦW  .tif .jpg
-    SafePixel : Integer;  //OMR�e�Ի~�t���I��
-    OMRErrInfo : Array[1..11] of TOMRErrInfo;  //�ˮ֪��覡�ΰT��
-    ScrollRec : Array[1..8] of TScrollRec; //�s������Scroll�O��
-    RecHozPos,RecVerPos : Integer;  //�O��MPSViewX1��ScrollBar��m
+    InitialOk : Boolean; //資訊載入是否完成
+    ShowText : String; //DataLoading時要秀出的訊息
+    Ext : String; //附檔名  .tif .jpg
+    SafePixel : Integer;  //OMR容忍誤差值點數
+    OMRErrInfo : Array[1..11] of TOMRErrInfo;  //檢核的方式及訊息
+    ScrollRec : Array[1..8] of TScrollRec; //瀏覽窗的Scroll記錄
+    RecHozPos,RecVerPos : Integer;  //記錄MPSViewX1的ScrollBar位置
     ReczoomPercent : Single;
     SortMode : Boolean;
     PreMytreeNode2Name:String;
     HS,VS : Integer;
     iRate : Single;
-    Bt : Integer; //�h���u�ɾ�u�P�_���e�ԭ�
-    BarCodeRotate : Integer; //���X�n�઺����
-    HaveAppDoc : Boolean; //�ɥ��ɬO�_���ɤJ�n�O��
+    Bt : Integer; //去直線時橫線判斷的容忍值
+    BarCodeRotate : Integer; //條碼要轉的角度
+    HaveAppDoc : Boolean; //補全時是否有補入要保書
     PageLVclear : Boolean;
-    CaseCount,PageCount : Integer; //�`�ץ�q���`����
+    CaseCount,PageCount : Integer; //總案件量及總頁數
     Item : TMenuItem;
-    SampleAnchorMode : String; //�d�����ˤQ�r�u���Ҧ�  NONE:�L;ANCHOR:�Q�r;FRAME:���
-    DownImgStatus : String;  //�U���v�������A(NO_DATA:�S���;NO_FILE:�S�v��)
-    TransForm_Field : String; //�n��OMR�Ŀ�T�{�O�_�ഫFORMID�����W��
-    NowWork_No : String; //�{�b���@�~�O
-    CropBarcode : String; //�n���v�������X
-    Has_Authorize :String; //�O�_�����v�Ѽv��
-    AttName : String; //���k���ؿ��W��
+    SampleAnchorMode : String; //範本掃瞄十字線的模式  NONE:無;ANCHOR:十字;FRAME:邊框
+    DownImgStatus : String;  //下載影像的狀態(NO_DATA:沒資料;NO_FILE:沒影像)
+    TransForm_Field : String; //要用OMR勾選確認是否轉換FORMID的欄位名稱
+    NowWork_No : String; //現在的作業別
+    CropBarcode : String; //要切影像的條碼
+    Has_Authorize :String; //是否有授權書影像
+    AttName : String; //未歸類目錄名稱
     NowGuideFormID : String;
+    NowDivPageFormID:String;
 
     FirstDocDir : String;
+    FMaxUploadSize:String;// 上傳zip大小限制
+    FJpgCompression:integer;// 20171211 jpg to tif 的壓縮率
 
     Draging : Boolean;
-
+    MDown : Boolean;  //20181210 用來判斷滑鼠右鍵要Popupmenu是否有MouseDonw發生
 
     FEvents: ICB_IMGPSScanXEvents;
 
     procedure HotKeyDown (var Msg : TMessage);message WM_HOTKEY;
-    Procedure InitialLanguage(Sender: TObject);   //�e�����J�h��y��
+    Procedure InitialLanguage(Sender: TObject);   //畫面載入多國語言
     //Function _Msg(S:String):String;
 
-    //*********SQL����************
-    Procedure SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //��SQL�ȶ�J
-    Function GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //�����ί��ި���
-    Function FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //����w�����
+    //*********SQL相關************
+    Procedure SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入
+    Function GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值
+    Function FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料
     Function GetFindResult(Col:String):String;
-    //*********SQL����************
+    //*********SQL相關************
 
+    //*********FTP相關************
+    Function GetFtpinfo(CaseID,Action:String):Boolean;
+    Procedure SetFtpInfo;     //餵入FTP資訊
+    Function FtpCaseComplete(SendData:String):Boolean;
+    //*********FTP相關************
 
-    //*******�ഫ��*********
-    Function FindDivFormCode(FormCode:String):Boolean; //�䦳�S�����ת����X
-    Function FormCode2FormName(CaseID,FormCode:String):String; //��FormCode�ন���W��
-    Function FormCode2FileName(FormCode:String;List:TStrings):String; //��FormCode��X�ɦW(�Ĥ@��)
-    Function FileName2FormCode(FileName:String):String; //�q�ɦW���XFormCode
-    Function FileName2FormName(CaseID,FileName:String):String; //�q�ɦW���X���W��
-    Function FileName2ScanPage(FileName:String):Integer; //�q�ɦW���X���˭���
-    Function FileName2NoQuene_Filename(FileName:String):String; //���X�S���Ǹ����ɦW
-    Function FileName2Index(FileName:String):Integer; //�q�ɦW���X�bContextList���Ǹ�
-    Function FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //�q�ɦW���X�k�ݪ����N��
-    Function FormCode2DocNo(FormCode:String):String;   //FormCode��Docno
-    Function FormCode2Version(FormCode:String):String; //FormCode�઩��
-    Function FormCode2Page(FormCode:String):String; //FormCode���󭶼�
-    Function DocNo2DocName(CaseID,DocNo:String):String; //Docno��Doc�W��
-    Function DocNo2FileName(DocNo:String;List:TStrings):String; //��DocNo��X�ɦW(�Ĥ@��)
-    Function FormCode2WorkNo(FormCode:String):String; //��FormCode���X�@�~�O
-    Function DocNo2WorkNo(DocNo:String):String; //��DocNo���X�@�~�O
-    Function DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo�নDocNo(����)�ؿ�
-    Function DocNoDir2DocNo(DocNoDir:String):String; //DocNo(����)�ؿ��নDocNo
-    Function DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(����)�ؿ��নindex
+    //*******轉換區*********
+    Function FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼
+    Function FormCode2FormName(CaseID,FormCode:String):String; //用FormCode轉成文件名稱
+    Function FormCode2FileName(FormCode:String;List:TStrings):String; //用FormCode找出檔名(第一頁)
+    Function FileName2FormCode(FileName:String):String; //從檔名取出FormCode
+    Function FileName2FormName(CaseID,FileName:String):String; //從檔名取出文件名稱
+    Function FileName2ScanPage(FileName:String):Integer; //從檔名取出掃瞄頁數
+    Function FileName2NoQuene_Filename(FileName:String):String; //取出沒有序號的檔名
+    Function FileName2Index(FileName:String):Integer; //從檔名取出在ContextList的序號
+    Function FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //從檔名取出歸屬的文件代號
+    Function FormCode2DocNo(FormCode:String):String;   //FormCode轉Docno
+    Function FormCode2Version(FormCode:String):String; //FormCode轉版本
+    Function FormCode2Page(FormCode:String):String; //FormCode轉文件頁數
+    Function DocNo2DocName(CaseID,DocNo:String):String; //Docno轉Doc名稱
+    Function DocNo2FileName(DocNo:String;List:TStrings):String; //用DocNo找出檔名(第一頁)
+    Function FormCode2WorkNo(FormCode:String):String; //用FormCode取出作業別
+    Function DocNo2WorkNo(DocNo:String):String; //用DocNo取出作業別
+    Function DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo轉成DocNo(份數)目錄
+    Function DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo
+    Function DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index
 
-    Function DocNoNeedDiv(DocNo:String):Boolean; //�O�_�O�ݤ����ƪ����N��
+    Function DocNoNeedDiv(DocNo:String):Boolean; //是否是需分份數的文件代號
     //Function CaseNo2DocNo(CaseNo:String):TStringList;
 
-    Function CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //�ץ�Node���ץ�s��  Mode: I:Caseno;P:Page
-    Function DocNode2Info(Node:TTreeNode;Mode:Char):String;     //���Node�����N�� Mode: I:Docno;N:Docname;P:Page;G:Group
-    Function FormNode2Info(Node:TTreeNode;Mode:Char):String;   //���Node�����N��  Mode: I:FormID;N:FormName;P:Page
-    //*******�ഫ��*********
+    Function CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //案件Node取案件編號  Mode: I:Caseno;P:Page
+    Function DocNode2Info(Node:TTreeNode;Mode:Char):String;     //文件Node取文件代號 Mode: I:Docno;N:Docname;P:Page;G:Group
+    Function FormNode2Info(Node:TTreeNode;Mode:Char):String;   //表單Node取表單代號  Mode: I:FormID;N:FormName;P:Page
+    //*******轉換區*********
 
-    Procedure PriorPage(Page:Integer); //�W�@��
-    Procedure NextPage(Page:Integer); //�U�@��
+    Procedure PriorPage(Page:Integer); //上一頁
+    Procedure NextPage(Page:Integer); //下一頁
 
-    Function DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //DocNo�O�_�v�s�b���
-    Function DocnoNeedGroup(DocNo:String):Boolean; //�ǤJ��DocNo�O�_�ݤ���
+    Function DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //DocNo是否己存在樹裡
+    Function DocnoNeedGroup(DocNo:String):Boolean; //傳入的DocNo是否需分組
 
     function GetSiteOMR(FileName, Site: String;bt: Integer): Integer;
-    Function FindISB2View(Vmode:Integer):TImageScrollBox; //���ISB�����
-    Procedure R_W_ScanIni(Mode:Char); //'R'��;'W'�g�J
-    Procedure GetDefScanIni; //���o���˪��w�]��
+    Function FindISB2View(Vmode:Integer):TImageScrollBox; //找空的ISB來顯示
+    Procedure R_W_ScanIni(Mode:Char); //'R'讀取;'W'寫入
+    Procedure GetDefScanIni; //取得掃瞄的預設值
     procedure DesableImage;
     procedure EnableImage(v:integer;Sender : TObject);
     Procedure ViewMouseMode(v:Integer);
     Procedure GoViewMode;
     Procedure DisplayMode(index,H_Count,W_Count:Integer;BasePanel:TPanel);
-    Function GetServerDate : Boolean; //���D���ɶ�
-    Function GetSetInf1 : Boolean; //���t�γ]�w��Tmode1  DOC_INF
-    Function GetSetInf2 : Boolean; //���t�γ]�w��Tmode2  DM_FORM_INF
-    Function GetSetInf3 : Boolean; //���t�γ]�w��Tmode3  FORM_INF
-    Function GetSetInf4 : Boolean; //���t�γ]�w��Tmode4  CHECK_RULE_INF
-    Function GetSetInf5 : Boolean; //���t�γ]�w��Tmode5  MEMO_INF
-    Function GetSetInf6 : Boolean; //���t�γ]�w��Tmode6  WORK_INF
-    Function GetSetInf7 : Boolean; //���t�γ]�w��Tmode7  LASTESTFORM_INF
-    Procedure SetFormID_DocNo; //�NFormID��Docno��X�ӥt�s�Jlist��
-    Procedure SetIn_WH_DocNo; //�N�n�J�w��DocNo��X�ӥt�s�Jlist��
+    Function GetServerDate : Boolean; //取主機時間
+    Function GetSetInf1 : Boolean; //取系統設定資訊mode1  DOC_INF
+    Function GetSetInf2 : Boolean; //取系統設定資訊mode2  DM_FORM_INF
+    Function GetSetInf3 : Boolean; //取系統設定資訊mode3  FORM_INF
+    Function GetSetInf4 : Boolean; //取系統設定資訊mode4  CHECK_RULE_INF
+    Function GetSetInf5 : Boolean; //取系統設定資訊mode5  MEMO_INF
+    Function GetSetInf6 : Boolean; //取系統設定資訊mode6  WORK_INF
+    Function GetSetInf7 : Boolean; //取系統設定資訊mode7  LASTESTFORM_INF
+    Procedure SetFormID_DocNo; //將FormID及Docno抽出來另存入list裡
+    Procedure SetIn_WH_DocNo; //將要入庫的DocNo抽出來另存入list裡
 
-    Procedure DataLoading(Loading,UseTimer:Boolean);  //��Ƹ��J���n�����I�諸�ʧ@
-    procedure ClearView(stkv:Integer); //�M���s�������v��
-    Function DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //�e�X���W�٪�Tree
+    Procedure DataLoading(Loading,UseTimer:Boolean);  //資料載入中要停止點選的動作
+    procedure ClearView(stkv:Integer); //清除瀏覽窗的影像
+    Function DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //畫出文件名稱的Tree
 
-    Procedure initkscan; //�ˬd���y�����\��
-    procedure LoadImgFile; //���J�ץ�
-    procedure LoadImgFile1; //���J�ץ�
-    Procedure DistinctFormCode(CaseID:String); //�ץ�̪�FormCode���X�Ĥ@��
-    Function OMRCheckCase(CaseID:String):Boolean; //OMR�ˮ�
-    Procedure OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR�ˮ֥��Ѽg�Jini
-    Procedure OMRErrini2List(CaseID:String;ErrlistForm : TErrlistForm); //OMR�ˮ֥��ѱqini�g�JListView
-    Function DownLanguage:Boolean;  //�U���h��y����
+    Procedure initkscan; //檢查掃描器的功能
+    procedure LoadImgFile; //載入案件
+    procedure LoadImgFile1; //載入案件
+    procedure LoadAttFile(CaseID:String); //載入附加檔案
+    Procedure DistinctFormCode(CaseID:String); //案件裡的FormCode取出第一頁
+    Function OMRCheckCase(CaseID:String):Boolean; //OMR檢核
+    Procedure OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini
+    Procedure OMRErrini2List(CaseID:String;ErrlistForm : TErrlistForm); //OMR檢核失敗從ini寫入ListView
+    Function DownLanguage:Boolean;  //下載多國語言檔
     Function FindMpsView(Vmode:Integer):TImageScrollBox;
-    Function CaseAsk(CaseID:String):Integer;  //�߰ݬO�_�i�W��  (-1:����;0:�i�H;1:����;)
-    Function CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //�q���ǰe����
-    Function GetCaseFormID(Path:String):String;  //���ץ�FormID
-    Procedure CreateFormID_FormName(Path,CaseID:String);  //����FormID_FormName.dat
-    Procedure CreateDocNo_DocName(Path,CaseID:String);  //����DocNo_DocName.dat
-    Procedure CreateIn_WH(CaseID:String);  //����In_WH.dat
-    Function CreateDocNo_Info(CaseID:String):String; //���ͫO�޳U��� DocNo[tab]����[tab]�`����[tab]�O�_����[����]DocNo[tab]����[tab]�`����[tab]�O�_����
-    Function CreateCustDocNo_Info(CaseID:String):String; //���ۭͦq��� DocName[tab]����[tab]�`����[tab]�O�_����[#13#10]DocName[tab]����[tab]�`����[tab]�O�_����
-    Function CreateAttach_Info(CaseID:String):String; //���ͬO�_��Attach Y:�� N:�S��
-    Function CreateDocnoFrom_Info(CaseID:String):String; //���ͳQ�޶i���O�޳U����T  Docno[tab]����[tab]�ץ�s��#13#10Docno[tab]����[tab]�ץ�s��
-    Function CreateCustDocNoFrom_Info(CaseID:String):String; //���ͳQ�޶i���۩w����T  Docno[tab]����[tab]�ץ�s��#13#10Docno[tab]����[tab]�ץ�s��
+    Function CaseAsk(CaseID:String):Integer;  //詢問是否可上傳  (-1:失敗;0:可以;1:不行;)
+    Function CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //通知傳送完成
+    Function GetCaseFormID(Path:String):String;  //取案件的FormID
+    Procedure CreateFormID_FormName(Path,CaseID:String);  //產生FormID_FormName.dat
+    Procedure CreateDocNo_DocName(Path,CaseID:String);  //產生DocNo_DocName.dat
+    Procedure CreateIn_WH(CaseID:String);  //產生In_WH.dat
+    Function CreateDocNo_Info(CaseID:String):String; //產生保管袋文件 DocNo[tab]份數[tab]總頁數[tab]是否異動[換行]DocNo[tab]份數[tab]總頁數[tab]是否異動
+    Function CreateCustDocNo_Info(CaseID:String):String; //產生自訂文件 DocName[tab]份數[tab]總頁數[tab]是否異動[#13#10]DocName[tab]份數[tab]總頁數[tab]是否異動
+    //Function CreateCustDocNo_Info(path,CaseID:String):String; overload
+    Function CreateAttach_Info(CaseID:String):String; //產生是否有Attach Y:有 N:沒有
+    Function CreateDocnoFrom_Info(CaseID:String):String; //產生被引進的保管袋文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
+    Function CreateCustDocNoFrom_Info(CaseID:String):String; //產生被引進的自定文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
 
-    Function GetDocNoEdit(CaseID,DocNo,DocName:String):String; //���XDocNo�O�_�Q���� (Y/N)
-    Function GetDocNo_Count(Path,DocNo:String):Integer;  //���X������
-    Function GetDocNo_Page(Path,DocNo:String):Integer;  //���X����`����
-    Function FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //�ˬdFormID�O�_�s�b�άO�_�n�ˬd�ҥΰ��Τ��
-    Function Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno�O�_�s�b�ץ��
-    Procedure ReSortFileName_New(Path:String); //�ɦW���s�Ƨ�
-    Procedure ReSortFileName(Path:String); //�ɦW���s�Ƨ�
-    Procedure ReSortFileName2Scanlist(Path:String); //�ɦW���s�Ƨǵ�Scanlist.dat
-    Function GetOMRCheckSet:Boolean;  //�U��OMR�ˮ�XML��
-    Function GetKeyinSet : Boolean; //���n���]�w
-    Procedure CheckRule2OMRErrInfo;   //�ˮֳW�h��JOMRErrINFo Record
+    Function GetDocNoEdit(CaseID,DocNo,DocName:String):String; //取出DocNo是否被異動 (Y/N)
+    Function GetDocNo_Count(Path,DocNo:String):Integer;  //取出文件份數
+    Function GetDocNo_Page(Path,DocNo:String):Integer;  //取出文件總頁數
+    Function FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //檢查FormID是否存在及是否要檢查啟用停用日期
+    Function Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno是否存在案件裡
+    Procedure ReSortFileName_New(Path:String); //檔名重新排序
+    Procedure ReSortFileName(Path:String); //檔名重新排序
+    Procedure ReSortFileName2Scanlist(Path:String); //檔名重新排序給Scanlist.dat
+    Function GetOMRCheckSet:Boolean;  //下載OMR檢核XML檔
+    Function GetKeyinSet : Boolean; //取登打設定
+    Procedure CheckRule2OMRErrInfo;   //檢核規則填入OMRErrINFo Record
     Procedure ReNameContext(Path,OldName,NewName:String);
-    Procedure DeleteImageFile(Path,FileName,CaseID:String); // �R���ɮ�
-    Procedure DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //�R�����wFormID���
-    Function DeleteDocNoFile(Path,DocNo:String):Boolean;  //�R�����wDocNo���
-    Procedure DeleteShowFile(Path:String); //�R����ܤ����v��
-    Function GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //���O�������_��������
-    Function CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //�ˬd�ץ�̪����_��������
-    Function FindFormCodePages(CaseID,FormCode:String):Integer;  //�p��ץ��FormID������
-    Function GetDataFormCodePages(FormCode:String):Integer;   //���O����FormcID������
-    Procedure CaseReSize(CaseID:String); //�ץ󪺼v���Y��
-    Procedure ImageReSize(CaseID,FileName:String);  //�̤Q�r�w���I���Y��
-    Procedure ImageReSize_tmp(FormID,FileName:String);  //�̤Q�r�w���I���Y��(�Ȧs��)
-    Function TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //�ǰe�ץ�
+    Procedure DeleteImageFile(Path,FileName,CaseID:String); // 刪除檔案
+    Procedure DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //刪除指定FormID文件
+    Function DeleteDocNoFile(Path,DocNo:String):Boolean;  //刪除指定DocNo文件
+    Procedure DeleteShowFile(Path:String); //刪除顯示中的影像
+    Function GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //取記錄的文件_版本頁數
+    Function CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //檢查案件裡的文件_版本頁數
+    Function FindFormCodePages(CaseID,FormCode:String):Integer;  //計算案件裡FormID的頁數
+    Function GetDataFormCodePages(FormCode:String):Integer;   //取記錄的FormcID的頁數
+    Procedure CaseReSize(CaseID:String); //案件的影像縮放
+    Procedure ImageReSize_FormID(CaseID,FileName:String);  //依十字定位點做縮放
+    Procedure ImageReSize_tmp(FormID,FileName:String);  //依十字定位點做縮放(暫存檔)
+    Function TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件
     Procedure NewTreeNodeRefresh;
     Procedure MyTreeNode1Refresh;
     Procedure MyTreeNode2ReFresh(CaseID:String);
     Procedure MyTreeNode3ReFresh(CaseID:String);
-    Function Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2��DocNo�X��
-    Function Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3��DocNo�X��
-    Function Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3��FormCode�X��
-    Function GetNode2Name(Node2:TTreeNode):String;  //��MyTreeNode2���ѧO�r�X��(�O���e�I���)
+    Function Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2取DocNo出來
+    Function Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3取DocNo出來
+    Function Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3取FormCode出來
+    Function GetNode2Name(Node2:TTreeNode):String;  //取MyTreeNode2的識別字出來(記之前點選用)
     //Function Down_Replace_Img(SPAth,DPath,CaseID:String):Boolean;
+    Function DownLoadImage(Path,CaseID:String):Boolean;
     Function Down_Img(Path,CaseID:String):Boolean;
-    Function GetNoNameCase(Path:string):String; //�����t��XXXX
-    Procedure CaseResort(Path:String); //�ץ��ɮ׭��s�Ƨ�(������Docno�D)
-    Procedure CaseResort2Scanlist(Path:String); //�ץ��ɮ׭��s�Ƨǵ�scanlist(������FormID��)
-    Procedure DistinctDocinCase(Path:String); //�C�X�ץ�̪�Docno_����
-    Procedure DistinctDocNoinCase(Path:String); //�C�X�ץ�̪�Docno
-    Procedure ClearErrini(CaseID:String;CaseNode:TTreeNode); //�M���ˮ��ɮ�
-    Procedure SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:�[�J,I:���J,D:�R��,E:�ק�'
-    Procedure SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:�[�J,I:���J,D:�R��,E:�ק�'
-    Procedure SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:�[�J,I:���J,D:�R��,E:�ק�'
-    Function checkCaseOMRDone:Boolean;  //�ˬd�ץ�O�_����OMR�ˮ�
-    Function CheckCaseID_OK:Boolean;  //�ˬd�O�_�����t�����ץ�
-    Procedure CreateEmptyCase(Path,CaseID:String);  //���ͪťծ׸�(�������)
-    Procedure InitScrollRec; //��l�Ƽv��Scroll�O��
-    Procedure GetScrollData(ISB:TImageScrollBox;Var HS,VS:Integer;Var iRate:Single); //���v��Scroll�O��
-    Procedure SetScrollData(ISB:TImageScrollBox;HS,VS:Integer;iRate:Single); //�g�v��Scroll�O��
-    Procedure FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //���wFormID�󴫦��s��FormID
-    Procedure ShowFileReplace(Path,NewFormID:String);//��ܪ��v�������s��FormID
-    Procedure PageReplaceFormID(Path,NowFormID,NewFormID:String); //�������FormID
-    Function ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //���˼Ҧ��O�_�n���ˮ�
+    Function GetNoNameCase(Path:string):String; //取未配號XXXX
+    Procedure CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno挑)
+    Procedure CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排)
+    Procedure DistinctDocinCase(Path:String); //列出案件裡的Docno_版本
+    Procedure DistinctDocNoinCase(Path:String); //列出案件裡的Docno
+    Procedure ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案
+    Procedure SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:加入,I:插入,D:刪除,E:修改'
+    Procedure SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:加入,I:插入,D:刪除,E:修改'
+    Procedure SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'
+    Procedure SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'
+
+
+    Function checkCaseOMRDone:Boolean;  //檢查案件是否完成OMR檢核
+    Function CheckCaseID_OK:Boolean;  //檢查是否有未配號的案件
+    Procedure CreateEmptyCase(Path,CaseID:String);  //產生空白案號(重掃件用)
+    Procedure InitScrollRec; //初始化影像Scroll記錄
+    Procedure GetScrollData(ISB:TImageScrollBox;Var HS,VS:Integer;Var iRate:Single); //取影像Scroll記錄
+    Procedure SetScrollData(ISB:TImageScrollBox;HS,VS:Integer;iRate:Single); //寫影像Scroll記錄
+    Procedure FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID
+    Procedure ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID
+    Procedure PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID
+    Function ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核
     procedure WMMOUSEWHEEL(var message: TWMMouseWheel); message WM_MOUSEWHEEL;
-    Function GetInputMask:String; //���o��J���O�渹�X
     Function GetCasePage(Path,CaseID:String):Integer;
     Function GetFormIDPage(FileList:TStringlist;FormID:String):Integer;
     Procedure SetFile2Case(CaseID,FileName:String);
-    Procedure WriteResize(ImgName,TxtName:String); //����Resize.dat
-    Function GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //���X�ץ󪺼ƶq�έ��� ID���ŭȮɬ����Ҧ���
-    Function BarCode2FormID : String; //Barcode�̳W�h�নFormID
-    Function BarCode2CaseID : String; //Barcode�̳W�h�নCaseID
+    Procedure WriteResize(ImgName,TxtName:String); //產生Resize.dat
+    Function GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數 ID為空值時為取所有的
+    Function BarCode2FormID : String; //Barcode依規則轉成FormID
+    Function BarCode2CaseID : String; //Barcode依規則轉成CaseID
     Procedure WriteCaseIndex(Path:String);
     Procedure ReadCaseIndex(Path:String);
     Procedure ClearCaseIndex;
     Procedure GetSelectImageFile;
-    Function GetDocNoDir(Path,DocNo:String):String; //���X�ثeDocNo������
-    Function CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //�ˬdFormID�O�_�s�b����
+    Function GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數
+    Function CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡
 
-    Procedure ZipMainFile(SoPath,DePath,ZipName:String); //���Y�v����
-    Procedure ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //���Y�B�n�v����
-    Procedure ParserPoint(S:String); //�ѪR�Q�r�I���r��
+    Procedure ZipMainFile(SoPath,DePath,ZipName:String); //壓縮影像檔
+    Procedure ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //壓縮遮罩影像檔
+    Procedure ParserPoint(S:String); //解析十字點的字串
     Function CheckScanDenialTime:Boolean;
-    Function FormID2Anchor(FormID:String):String;  //��FormID���X�Q�r�Ҧ�
-    Function Index2Anchor(Anchor:String):String;   //�Q�r�Ҧ� 0->NONE;1->ANCHOR;2->FRAME
-    Function MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //���O�N�X���O���O�ഫ  Mode 'ID':�N�X��W��;'NAME':�W����N�X
-    Function GetFormatID(CaseID:String):String; //���X�ץ�FormatID
-    Function FindNoSaveBarCode : Boolean; //��O�_�����n�x�s�v�������X
-    Function CheckAvailable:Boolean; //�ˬd�O�_�i�ϥΤ���
-    Function Case2Mask(SoPath,DePath:String):Boolean;//���;B�n�v��
-    Function CheckNeedCrop(Graphic:TDibGraphic):Boolean; //�O�_�OA3�n���v��
-    Function GetNewCustomDocNo(Path,DocName:String):String; //���X���ϥΪ��ۭq���N��
-    Function GetCustomDocName(Path,DocNo:String):String; //���X�۩w���W��
-    Function GetCustomFormID(Path,DocNo:String):String; //���X�۩w���FormID
-    Function GetCustomDocDir(Path,DocName:String):String; //���X�۩w���DocDir
-    Function FindCustomDocName(Path,DocName:String):Boolean; //�M��۩w���W�٬O�_�s�b
-    Procedure DeleteCustomDocDir(Path,DocNo:String); //�R���۩w���DocNo
-    Function CheckFormID_Prt(FormID:String):Boolean; //�ǤJ��FormID�O�_�w�]�C�L
+    Function FormID2Anchor(FormID:String):String;  //用FormID取出十字模式
+    Function Index2Anchor(Anchor:String):String;   //十字模式 0->NONE;1->ANCHOR;2->FRAME
+    Function MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //註記代碼註記類別轉換  Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼
+    Function GetFormatID(CaseID:String):String; //取出案件的FormatID
+    Function FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼
+    Function CheckAvailable:Boolean; //檢查是否可使用元件
+    Function Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像
+    Function CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像
+    Function GetNewCustomDocNo(Path,DocName:String):String; //取出未使用的自訂文件代號
+    Function GetCustomDocName(Path,DocNo:String):String; //取出自定文件名稱
+    Function GetCustomFormID(Path,DocNo:String):String; //取出自定文件FormID
+    Function GetCustomDocDir(Path,DocName:String):String; //取出自定文件DocDir
+    Function FindCustomDocName(Path,DocName:String):Boolean; //尋找自定文件名稱是否存在
+    Procedure DeleteCustomDocDir(Path,DocNo:String); //刪除自定文件DocNo
+    Function CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印
     procedure PrintImg(FileName, LoginID, Datetime,Path: WideString);
-    Function FindLastestDocDir(CaseID,DocNo:String):String; //��X�̷s��DocDir
-    Procedure Create_Cust_DocDir(CaseID:String); //���ͥ~���ǤJ�����N���Φ۩w���
-    Procedure OldCasetoNewCase(CaseID:String); //�N�®ץ����ন�s�W�h
-    Procedure ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//�N�®ת����~FormID�勵�T��FormID
-    Procedure SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //�O���Q���ʪ����ؿ�  'A:�[�JD:�R��'
-    Function GetDocDir_Page(CaseID,DocDir:String):Integer;  //���oDocDir������
+    Function FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir
+    Procedure Create_Cust_DocDir(CaseID:String); //產生外面傳入的文件代號及自定文件
+    Procedure OldCasetoNewCase(CaseID:String); //將舊案份數轉成新規則
+    Procedure ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//將舊案的錯誤FormID改正確的FormID
+    Procedure SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //記錄被異動的文件目錄  'A:加入D:刪掉'
+    Function GetDocDir_Page(CaseID,DocDir:String):Integer;  //取得DocDir的頁數
     Function Path2DocDir(Path,CaseID:String):String;
-    Function GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo�O�_���J�w���
-    Procedure SortDocDir_FormID(CaseID,DocDir:String); //�NDocDir�̪����s���Ƨ�
+    Function GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo是否為入庫文件
+    Procedure SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序
     Procedure GotoAttach(OldLevel:Integer);
-    Function DocNoIs_In_WH(DocNo:String):Boolean; //DocNo�O�_���J�w���
-    Procedure CreateCaseNeedData(Path:String);  //�����v���I���|�֤G�Ӥ�r��,����CaseDocNo.dat��DocDir.dat
+    Function DocNoIs_In_WH(DocNo:String):Boolean; //DocNo是否為入庫文件
+    Procedure CreateCaseNeedData(Path:String);  //先做影像截取會少二個文字檔,產生CaseDocNo.dat及DocDir.dat
     Procedure SetDocDirtoSelected(CaseNode:TTreeNode;DocDir:String);
-    Function CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //�ˬd��ܪ��v���O�_���]�t�Q�ޥΪ��v��
-    Function TransOldCaseFile(Path:String):Boolean;  //�W�Ǥޥ��¥󪺰O����
+    Function CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像
+    Function TransOldCaseFile(Path:String):Boolean;  //上傳引用舊件的記錄檔
     Function Writelog(CaseID:String):Boolean;
-    Function FormIDAppear(FormID:String):Boolean; //FormID�O�_�i�X�{
-    Function DocNoAppear(DocNo:String):Boolean;   //DocNo�O�_�i�X�{
-    Function GetDocNoCount(CaseID,DocNo:String):Integer; //��DocNo�ƶq
-    Function GetDocDirCopies(CaseID,DocDir:String):Integer; //��DocDir����
-    Procedure SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //�ק�DocDir����
-    Function GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //���O���̪�DocDir����
-    Function GetCustomNameCount(CustomName:String):Integer;   //���~�Ǫ��W�ټƶq
-    Function GetCustomDocNoCount(Docno:String):Integer;   //���~�Ǫ�DocNo�ƶq
+    Function FormIDAppear(FormID:String):Boolean; //FormID是否可出現
+    Function DocNoAppear(DocNo:String):Boolean;   //DocNo是否可出現
+    Function GetDocNoCount(CaseID,DocNo:String):Integer; //取DocNo數量
+    Function GetDocDirCopies(CaseID,DocDir:String):Integer; //取DocDir份數
+    Procedure SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //修改DocDir份數
+    Function GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //取記錄裡的DocDir份數
+    Function GetCustomNameCount(CustomName:String):Integer;   //取外傳的名稱數量
+    Function GetCustomDocNoCount(Docno:String):Integer;   //取外傳的DocNo數量
     Function ISGuideFormID(FormID:String):Boolean;
-    Function CaseDelete_Enable(CaseID:String):Boolean;  //�ץ�i�_�Q�R��
+    Function CaseDelete_Enable(CaseID:String):Boolean;  //案件可否被刪除
 
-    Procedure MoveImage(Path:String;mp:Integer); //���ʭ���
-    Procedure MoveImage_Drag(Path:String;fp,tp:Integer); //��Բ��ʭ���
+    Procedure MoveImage(Path:String;mp:Integer); //移動頁數
+    Procedure MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數
 
 
-    Procedure SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //�O���ޥΨ�L�ץ� A:�[�J D:�R��
-    Function GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:���Q�ޥ� To:�ޥ�
+    Procedure SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //記錄引用其他案件 A:加入 D:刪掉
+    Function GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:取被引用 To:引用
 
     Procedure Case2upload(CaseID:String);
     Procedure Download2Case(SoDir,DeDir:String);
 
-    procedure view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //��FormCode�ӧ�v��
-    procedure view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //��DocNo�ӧ�v��
+    procedure view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像
+    procedure view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像
 
-    Function ShapeName2PreViewISBName(SP:TShape):String; //��X���wPreViewISBName
+    Function ShapeName2PreViewISBName(SP:TShape):String; //轉出指定PreViewISBName
     Procedure CreatePreViewISB(Count:Integer);
     Procedure FreePreViewISB;
     Procedure FitPreViewISB;
-    Procedure PaintShape(FromImg,ToImg:TImageScrollBox); //�e���Q������v��
+    Procedure PaintShape(FromImg,ToImg:TImageScrollBox); //畫有被選取的影像
     Procedure FreeShapeobj(SelectISB : TImageScrollBox);
     Procedure ISBClick(Sender : TObject);
     Procedure ISBMouseMove(Sender: TObject; Shift: TShiftState;
@@ -793,8 +870,8 @@
 
     procedure BtnMouseEnter(Sender: TObject);
 
-    procedure PageEnd;   //���y��������
-    Procedure PageDone;  //���y��������ܼv��
+    procedure PageEnd;   //掃描接收完成
+    Procedure PageDone;  //掃描完成後顯示影像
     procedure StatrTwainScan;
     procedure OnAcquire( const DibHandle    : THandle;
                          const XDpi         : Word;
@@ -813,6 +890,23 @@
     procedure MouseLeaveEvent(Sender: TObject);
     procedure PaintEvent(Sender: TObject);
     function GetCurrentVersionNo: String;
+    procedure initParameter;
+    procedure LastInitFormidListCreate(path:string);
+    function checkFormCodeIsCustom(path,formcode:string):boolean;
+    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;
+    function DeleteDocNoFileForESCAN(Path, DocNo: String): Boolean;     //2017 確認是否有未歸類文件
+    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;
@@ -918,6 +1012,22 @@
     procedure Set_is_oldcase(const Value: WideString); safecall;
     function Get_custdocyn: WideString; safecall;
     procedure Set_custdocyn(const Value: WideString); safecall;
+    function Get_casenolength: WideString; safecall;
+    function Get_filesizelimit: WideString; safecall;
+    function Get_imgdpi: WideString; safecall;
+    function Get_scancolor: WideString; safecall;
+    procedure Set_casenolength(const Value: WideString); safecall;
+    procedure Set_filesizelimit(const Value: WideString); safecall;
+    procedure Set_imgdpi(const Value: WideString); safecall;
+    procedure Set_scancolor(const Value: WideString); safecall;
+    function Get_imgdelete: WideString; safecall;
+    procedure Set_imgdelete(const Value: WideString); safecall;
+    function Get_check_main_form: WideString; safecall;
+    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;
@@ -939,7 +1049,7 @@
 
 { TCB_IMGPSScanX }
 
-function TCB_IMGPSScanX.GetCurrentVersionNo: String; //����ۨ��������һݭn
+function TCB_IMGPSScanX.GetCurrentVersionNo: String; //獲取自身版本號所需要
 var
   dLength,dSize:DWORD;
   pcBuf,pcValue:PChar;
@@ -974,32 +1084,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);
@@ -1009,16 +1176,16 @@
   M_Content,M_ID,M_Name : String;
   S : TStringlist;
 begin
-  ShowText := _Msg('�Ƶ���J��,�еy��');
+  ShowText := _Msg('備註輸入中,請稍候');
   DataLoading(True,True);
   SortMemoForm := TSortMemoForm.Create(Self);
   S := TStringlist.Create;
   try
-    InitialLanguage(SortMemoForm); //���J�h��y��
+    InitialLanguage(SortMemoForm); //載入多國語言
 
-    SortMemoForm.ContentList := TStringlist.Create;      //���O���e
-    SortMemoForm.MemoIDList := TStringlist.Create;       //���O�N��
-    SortMemoForm.MemoNameList := TStringlist.Create;     //���O�W��
+    SortMemoForm.ContentList := TStringlist.Create;      //註記內容
+    SortMemoForm.MemoIDList := TStringlist.Create;       //註記代號
+    SortMemoForm.MemoNameList := TStringlist.Create;     //註記名稱
 
     for i := 1 to MEMO_INF_List.Count - 1 do
     begin
@@ -1026,9 +1193,9 @@
       M_ID := GetSQLData(MEMO_INF_List,'T1.MEMO_TYPE',i);
       M_Name := GetSQLData(MEMO_INF_List,'T2.MEMO_TYPE_NAME',i);
       SortMemoForm.ComboBox1.Items.Add(M_Name+'-->'+M_Content);
-      SortMemoForm.ContentList.Add(M_Content);   //���O���e
-      SortMemoForm.MemoIDList.Add(M_ID);         //���O�N��
-      SortMemoForm.MemoNameList.Add(M_Name);     //���O�W��
+      SortMemoForm.ContentList.Add(M_Content);   //註記內容
+      SortMemoForm.MemoIDList.Add(M_ID);         //註記代號
+      SortMemoForm.MemoNameList.Add(M_Name);     //註記名稱
     end;
     if FileExists(DisplayPath+'Scan_Memo.dat') then
     begin
@@ -1061,9 +1228,9 @@
       end;
       S.SaveToFile(DisplayPath+'Scan_Memo.dat');
     end;
-    SortMemoForm.ContentList.Free;       //���O���e
-    SortMemoForm.MemoIDList.Free;        //���O�N��
-    SortMemoForm.MemoNameList.Free;      //���O�W��
+    SortMemoForm.ContentList.Free;       //註記內容
+    SortMemoForm.MemoIDList.Free;        //註記代號
+    SortMemoForm.MemoNameList.Free;      //註記名稱
   finally
   SortMemoForm.Free;
   S.Free;
@@ -1168,6 +1335,31 @@
   PM605Click(nil);
 end;
 
+procedure TCB_IMGPSScanX.InitExistImgList(casepath: String);
+var
+  ST1,ST2,ST3,ST4:TStringList;
+  i,j,k:Integer;
+begin
+
+  ST1:=TStringList.Create;
+  ST2:=TStringList.Create;
+  ST3:=TStringList.Create;
+
+  ExistImgList.Clear;
+  ST1.LoadFromFile(casepath+'Download\Context.dat');
+  for I := 0 to ST1.Count - 1 do
+  begin
+LogFile1.LogToFile(logTimeString+casepath+'Download\'+ST1.Strings[i]+',MD5='+LoadFileGetMD5(casepath+'Download\'+ST1.Strings[i]));
+    ExistImgList.Add(LoadFileGetMD5(casepath+'Download\'+ST1.Strings[i])) ;
+  end;
+LogFile1.LogToFile(logTimeString+'ExistImgList.text'+ExistImgList.CommaText);
+
+  ST1.Free;
+  ST2.Free;
+  ST3.Free;
+
+end;
+
 procedure TCB_IMGPSScanX.Initialize;
 begin
   inherited Initialize;
@@ -1182,14 +1374,14 @@
   OnMouseLeave := MouseLeaveEvent;
   OnPaint := PaintEvent;
   MpsKey := 'fbim';
-  Seg := 3;  //�s���������
+  Seg := 3;  //瀏覽窗的邊界
   Ext := '.tif';
   SafePixel := 20;
-  CaseIDLength := 16;  //�ץ�s������ 16�X
-  FormIDLength := 15;  //FormID���� 15�X
-  DocNoLength := 8;   //DocNo���� 8�X (1~8)
-  Bt :=4; //�h���u�ɾ�u�P�_���e�ԭ�
-  CropBarcode := 'CC';//�n���v�������X
+  CaseIDLength := 16;  //案件編號長度 16碼   20170222 在用網頁參數來取代
+  FormIDLength := 15;  //FormID長度 15碼    20170222 發現是用來辨識條碼用的
+  ///DocNoLength := 8;   //DocNo長度 8碼 (1~8)  //20170222 發現沒用到就註解吧
+  Bt :=4; //去直線時橫線判斷的容忍值
+  CropBarcode := 'CC';//要切影像的條碼
 end;
 
 procedure TCB_IMGPSScanX.ISB1Click(Sender: TObject);
@@ -1209,6 +1401,7 @@
     NowPage := p+1;
     PageLV.ItemIndex := P;
   end;
+  //DisplayISB.SetFocus;
 end;
 
 procedure TCB_IMGPSScanX.ISB1EndScroll(Sender: TObject);
@@ -1237,7 +1430,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;
@@ -1270,12 +1464,27 @@
 procedure TCB_IMGPSScanX.ISB1ImageMouseMove(Sender: TObject; Shift: TShiftState;
   X, Y: Integer);
 begin
-   Edit1.SetFocus;
+   //Edit1.SetFocus;
   //TImageScrollBox(Sender).SetFocus;
+
   if TImageScrollBox(Sender).FileName = '' then
     TImageScrollBox(Sender).MouseMode := mmUser
   Else
     ViewMouseMode(NowClick);
+
+  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;
@@ -1303,7 +1512,7 @@
       SelectISB.Redraw(True);
       FitPreViewISB;
       ISBClick(SelectISB);
-      ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
     end;
   end;
 
@@ -1500,34 +1709,47 @@
 
 procedure TCB_IMGPSScanX.DestroyEvent(Sender: TObject);
 begin
-  //********�M���********
-  Doc_Inf_List.Free;  //Doc_Inf �M��   Docno + ������key
-  DM_FORM_INF_List.Free;  //DM_FORM_INF �M��   Docno + ������key
-  FORM_INF_List.Free; //FORM_INF���M��
-  CHECK_RULE_INF_List.Free;  //CHECK_RULE_INF  �M��
-  MEMO_INF_List.Free;  //MEMO_INF �M��
-  WORK_INF_List.Free;  //WORK_INF �M��
-  LASTEST_FORM_INF_List.Free; // LASTEST_FORM_INF �M��
-  FindResult.Free ;  //��SQLData�����G
-  OMRFileList.Free;  //�nOMR�ˮ֪����(�u�ˬd�C��Form���Ĥ@��)
-  FormCode_PageSize.Free; //��󪺹w�]�j�p  FormCode_Height_Width
-  DocNo_NeedDoc.Free; //��Docno�ɭn�̪ۨ����   DocNo_�̤ۨ��_�̤ۨ��
-  DocNo_NoDoc.Free; //��Docno�ɤ��������   DocNo_�������_�������
-  DocNo_VerinCase.Free; //�ץ�̪�DocNo+�������M��
-  CaseDocNoList.Free;  //�ץ�̪�DocNo�M��
-  CaseDocNo_CopiesList.Free; //�ץ�̪�DocNo���ƲM��
-  CaseList.Free;    //�O�����ˮץ󪺶���
-  NoSaveBarCodeList.Free; //���x�s�����X�M��
-  FormID_List.Free;  //FormID�M��
-  DocNo_List.Free; //DocNo�M��
-  Context_DocnoList.Free; //�ץ�̪��ɮ�Docno�M��
-  ContextList.Free; //�ץ�̪��ɮײM��
-  NowShowFileList.Free;  //�ثe��ܪ��v���M��
-  NowSelectFileList.Free; //�ثe�Q�I�諸�v���M��
-  Cust_DocNoList.Free; //�ۦ�w�q���W��
-  IN_WH_DocNoList.Free; //�J�w�����M��
-  GuideFormIDList.Free; //�n��ɤޭ����M��
-  //********�M���********
+  //********清單區********
+  Doc_Inf_List.Free;  //Doc_Inf 清單   Docno + 版本為key
+  DM_FORM_INF_List.Free;  //DM_FORM_INF 清單   Docno + 版本為key
+  FORM_INF_List.Free; //FORM_INF的清單
+  CHECK_RULE_INF_List.Free;  //CHECK_RULE_INF  清單
+  MEMO_INF_List.Free;  //MEMO_INF 清單
+  WORK_INF_List.Free;  //WORK_INF 清單
+  LASTEST_FORM_INF_List.Free; // LASTEST_FORM_INF 清單
+  FindResult.Free ;  //找SQLData的結果
+  OMRFileList.Free;  //要OMR檢核的文件(只檢查每種Form的第一頁)
+  FormCode_PageSize.Free; //文件的預設大小  FormCode_Height_Width
+  DocNo_NeedDoc.Free; //有Docno時要相依的文件   DocNo_相依文件_相依文件
+  DocNo_NoDoc.Free; //有Docno時互斥的文件   DocNo_互斥文件_互斥文件
+  DocNo_VerinCase.Free; //案件裡的DocNo+版本的清單
+  CaseDocNoList.Free;  //案件裡的DocNo清單
+  CaseDocNo_CopiesList.Free; //案件裡的DocNo份數清單
+  CaseList.Free;    //記錄掃瞄案件的順序
+  NoSaveBarCodeList.Free; //不儲存的條碼清單
+  FormID_List.Free;  //FormID清單
+  DocNo_List.Free; //DocNo清單
+  Context_DocnoList.Free; //案件裡的檔案Docno清單
+  ContextList.Free; //案件裡的檔案清單
+  AttContextList.Free; //案件裡的附加檔案清單
+  NowShowFileList.Free;  //目前顯示的影像清單
+  NowSelectFileList.Free; //目前被點選的影像清單
+  Cust_DocNoList.Free; //自行定義文件名稱
+  IN_WH_DocNoList.Free; //入庫的文件清單
+  GuideFormIDList.Free; //要當導引頁表單清單
+  DivPageFormIDList.Free; //要當分案頁表單清單
+  LastInitFormidList.Free;
+  LastAddFormidList.Free;
+  SampleFormIDList.Free;
+  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;
 
@@ -1714,12 +1936,12 @@
     FromIndex := PageLv.ItemIndex;
     if FromIndex = 0 then
     begin
-      Showmessage(_Msg('����q��1������'));
+      Showmessage(_Msg('不能從第1頁分案'));
       Exit;
     end;
 
-    If MessageDlg(Format(_Msg('�O�_�T�w�q%d�����X�s��'),[PageLV.ItemIndex+1]),Mtconfirmation,[mbyes,mbcancel],0) = mrcancel Then Exit;
-    ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+    If MessageDlg(Format(_Msg('是否確定從%d頁分出新案'),[PageLV.ItemIndex+1]),Mtconfirmation,[mbyes,mbcancel],0) = mrcancel Then Exit;
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
     CaseID := GetNoNameCase(ImageSavePath);
     NewPath := ImageSavePath + CaseID+'\';
     Str2Dir(NewPath);
@@ -1739,7 +1961,7 @@
       ContextList.SaveToFile(DisplayPath+'Context.dat');
     end;
     SetCaseList('I',MyTreeNode1.IndexOf(MyTreeNode2)+1,CaseID);
-    if FileExists(DisplayPath+'CaseIndex.dat') then  //���g��N�����X�ӦA�g�J�s���
+    if FileExists(DisplayPath+'CaseIndex.dat') then  //把原經辦代號取出來再寫入新件裡
     begin
       S.LoadFromFile(DisplayPath+'CaseIndex.dat');
     end;
@@ -1751,7 +1973,7 @@
   S.Free;
   end;
   LoadImgFile;
-  Showmessage(_Msg('���ק���'));
+  Showmessage(_Msg('分案完成'));
 end;
 
 procedure TCB_IMGPSScanX.PM402Click(Sender: TObject);
@@ -1785,11 +2007,11 @@
   PreNode2Name := '';
   if TreeView1.Selected.Parent = MyTreeNode1 then
     PreNode2Name:= GetNode2Name(MyTreeNode2);
-  ShowText := _Msg('����k����,�еy��');
+  ShowText := _Msg('文件歸類中,請稍候');
   DataLoading(True,True);
   DocListForm := TDocListForm.Create(self);
   try
-    InitialLanguage(PatchDlg); //���J�h��y��
+    InitialLanguage(PatchDlg); //載入多國語言
     for i := 1 to FORM_INF_List.Count - 1 do
     begin
       FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
@@ -1819,11 +2041,11 @@
         PageReplaceFormID(DisplayPath,NowFormCode,FormID);
       end;
       //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
-      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280��
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280改
       DrawDocItem2(MytreeNode1,NowCaseno);
-      ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
-      //Showmessage(_Msg('�k������'));  //20101103 User�n�D����
-      if PreNode2Name <> '' then  // �^��쥻�I�諸���`�I�W
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+      //Showmessage(_Msg('歸類完成'));  //20101103 User要求拿掉
+      if PreNode2Name <> '' then  // 回到原本點選的文件節點上
       begin
         for i := 0 to MyTreeNode1.Count - 1 do
         begin
@@ -1855,11 +2077,14 @@
   iISB : TImageScrollBox;
   GoAtt : Boolean;
   AttLv : Integer;
+  ST1 :TStringList;
 begin
   PreNode2Name := '';
+  ST1:=TStringList.Create;
   if TreeView1.Selected.Parent = MyTreeNode1 then
     PreNode2Name:= GetNode2Name(MyTreeNode2);
-  ShowText := _Msg('����k����,�еy��');
+  ShowText := _Msg('文件歸類中,請稍候');
+LogFile1.LogToFile(logTimeString+'縮圖  歸類開始');
   DataLoading(True,True);
   GoAtt := False;
   if (MytreeNode2 <> nil) and (Pos('Attach',MyTreeNode2.Text)>0) then
@@ -1869,14 +2094,15 @@
   end;
   DocListForm := TDocListForm.Create(self);
   try
-    InitialLanguage(DocListForm); //���J�h��y��
-    //InitialLanguage(PatchDlg); //���J�h��y��
+    InitialLanguage(DocListForm); //載入多國語言
+    //InitialLanguage(PatchDlg); //載入多國語言
+    DocListForm.CheckBox1.Visible:=False;
     for i := 1 to FORM_INF_List.Count - 1 do
     begin
       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));
@@ -1896,29 +2122,55 @@
       begin
         if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then
         begin
-          //Showmessage(Components[i].Name);
           iISBName := ShapeName2PreViewISBName(TShape(Components[i]));
           iISB := TImageScrollBox(FindComponent(iISBName));
           OldName := ExtractFileName(iISB.FileName);
           Ext := ExtractFileExt(OldName);
-          FormID := DocListForm.DocLV.Selected.Caption;
-          DocNo := FormCode2DocNo(FormID);
+
+          if DocListForm.CheckBox1.Checked then
+          begin
+            FormID := DocListForm.Edit1.Text;
+            DocNo := GetNewCustomDocNo(DisplayPath,FormID);
+          end
+          else
+          begin
+            FormID := DocListForm.DocLV.Selected.Caption;
+            DocNo := FormCode2DocNo(FormID);
+          end;
+
+
           if DocNoDir2DocNo(Path2DocDir(ExtractFilePath(iISB.FileName),NowCaseno)) = DocNo then
             DocDir := Path2DocDir(ExtractFilePath(iISB.FileName),NowCaseNo)
           Else
             DocDir := FindLastestDocDir(NowCaseno,DocNo);
 
+//ShowMessage('DocNoNeedDiv(DocNo)='+BoolToStr(DocNoNeedDiv(DocNo),true));
+//ShowMessage('DocDir='+DocDir);
 
-          if DocNoNeedDiv(DocNo) then   //�n������
+          if DocNoNeedDiv(DocNo) then   //要分份數
           begin
             if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(NowCaseno,DocDir)>0)) or (DocDir = '') then
+            begin
               DocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',DocNo);
+            end
+            else
+            begin //20171016  真對補件影響 所加的判斷
+              ST1.Clear;
+              if FileExists(ImageSavePath + NowCaseno+'\'+DocDir+'\Context.dat') then
+              begin
+                ST1.LoadFromFile(ImageSavePath + NowCaseno+'\'+DocDir+'\Context.dat');
+                if (ST1.Count > 0) and ISExistImg(ImageSavePath + NowCaseno+'\'+DocDir+'\'+ST1.Strings[0]) then   //20181210 多增加判斷ST1>0 否則會有機會出現List out of bound  Hong
+                begin
+                  DocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',DocNo);
+                end;
+              end;
+            end;
           end
-          Else        //��������
+          Else        //不分份數
           begin
             if DocNo <> '' then
               DocDir := DocNo
-            else      //Attach ����
+            else      //Attach 附件
               DocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',DocNo);
           end;
           if (not DirectoryExists(ImageSavePath + NowCaseno+'\'+DocDir+'\')) and (DocDir <> AttName) then
@@ -1931,6 +2183,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;
@@ -1946,9 +2199,10 @@
           //ReNameContext(iISB.FileName,OldName,NewName);
         end;
       end;
+//ShowMessage('KKKK');
       ReSortFileName(ExtractFilePath(iISB.FileName));
       DrawDocItem2(MytreeNode1,NowCaseno);
-      ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
 
       if GoAtt then
       begin
@@ -1960,6 +2214,7 @@
   finally
   DataLoading(False,False);
   DocListForm.Free;
+  ST1.Free;
   end;
 
 end;
@@ -1988,17 +2243,18 @@
     GoAtt := True;
   end;
 
-  if InputQuery('��J��L���W��','���W��',CustomDocName) then
+  if InputQuery(_Msg('輸入其他文件名稱'),_Msg('文件名稱'),CustomDocName) then
   begin
     if FindCustomDocName(DisplayPath,CustomDocName) then
     begin
-      Showmessage(Format('���W��:"%s"�v�s�b',[CustomDocName]));
+      Showmessage(Format(_Msg('文件名稱:"%s"己存在'),[CustomDocName]));
       Exit;
     end;
     CustomDocNo := GetNewCustomDocNo(DisplayPath,CustomDocName);
   end;
   if CustomDocNo = '' then Exit;
   DocDir := CustomDocNo;
+LogFile1.LogToFile(logTimeString+'縮圖 歸類自訂文件 DocDir='+DocDir);
   SavePath := ImageSavePath+NowCaseNo+'\'+DocDir+'\';
   Str2Dir(SavePath);
   SetDocNoList('A',-1,NowCaseNo,DocDir,'1');
@@ -2032,7 +2288,7 @@
   end;
   ReSortFileName(ExtractFilePath(iISB.FileName));
   DrawDocItem2(MytreeNode1,NowCaseno);
-  ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
 
   if GoAtt then
   begin
@@ -2071,7 +2327,7 @@
   iISBName,OldName : String;
   iISB : TImageScrollBox;
 begin
-  if MessageDlg('�O�_�T�w�R��??',mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+  if MessageDlg(_Msg('是否確定刪除??'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
 
   for i := 0 to ComponentCount -1 do
   begin
@@ -2080,14 +2336,26 @@
       //Showmessage(Components[i].Name);
       iISBName := ShapeName2PreViewISBName(TShape(Components[i]));
       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;
+LogFile1.LogToFile(logTimeString+'縮圖刪除 iISB.FileName='+iISB.FileName);
       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)]);
+  MyTreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
   NewTreeNodeRefresh;
-  ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
   TreeView1click(self);
 end;
 
@@ -2095,7 +2363,7 @@
 var
   mp:string;
 begin
-  mp := InputBox('���ʭ���','�п�J���J���X','');
+  mp := InputBox(_Msg('移動頁數'),_Msg('請輸入移入頁碼'),'');
   if (mp <> '') then
   begin
     MoveImage(DisplayPath+NowDocDir+'\',strtoint(mp));
@@ -2113,10 +2381,11 @@
 begin
   IF not InitialOk Then
   begin
-    Showmessage(_msg('��T�|���U������,�еy�ԩέ��s�i�J'));
+    Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入'));
     Exit;
   end;
-  if (FMode = 'RSCAN') or (FMode = 'ESCAN') then
+LogFile1.LogToFile(logTimeString+'掃瞄開始');
+  if (FMode = 'RSCAN') or (FMode = 'ESCAN') or (FMode = 'DSCAN') then
   begin
     if NewTreeNode.Count > 0 then
     begin
@@ -2124,6 +2393,7 @@
       TreeView1click(nil);
       FirstDocDir := '';
       NowGuideFormID := '';
+      NowDivPageFormID :='';
       AddScanBtnclick(nil);
     end;
   end
@@ -2139,10 +2409,12 @@
     ScanPath := '';
     ScanCaseno := '';
     NowGuideFormID := '';
+    NowDivPageFormID :='';
     ClearView(1);
     ContextList.Clear;
     Try
       StatrTwainScan;
+LogFile1.LogToFile(logTimeString+'掃瞄結束');
     Except
       Panel1.Enabled := True;
       Panel2.Enabled := True;
@@ -2183,15 +2455,15 @@
 begin
   IF not InitialOk Then
   begin
-    Showmessage(_msg('��T�|���U������,�еy�ԩέ��s�i�J'));
+    Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入'));
     Exit;
   end;
-  ShowText := _Msg('���˰ѼƳ]�w��,�еy��');
+  ShowText := _Msg('掃瞄參數設定中,請稍候');
   DataLoading(True,True);
 
   PatchDlg := TPatchDlg.Create(self);
   try
-    InitialLanguage(PatchDlg); //���J�h��y��
+    InitialLanguage(PatchDlg); //載入多國語言
     PatchDlg.BlankuseCB.Checked := DeviceDelete;
     if PatchDlg.BlankuseCB.Checked then
       PatchDlg.SpinEdit5.Enabled := True
@@ -2303,9 +2575,11 @@
   P,v,v1,v2,ln,i : Integer;
   iDocDir,iDocNo : String;
 begin
-  if TreeView1.Selected = NewTreeNode then  //���R  //�s���y��
+LogFile1.LogToFile(logTimeString+'Tree 按下刪除');
+  if TreeView1.Selected = NewTreeNode then  //全刪  //新掃描件
   begin
-    If Messagedlg(_Msg('�O�_�R���Ҧ��ץ�?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+LogFile1.LogToFile(logTimeString+'Tree 全部刪除');
+    If Messagedlg(_Msg('是否刪除所有案件?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
     clearView(1);
     Application.ProcessMessages;
     _DelTree(ImageSavePath);
@@ -2315,11 +2589,12 @@
       CreateEmptyCase(ImageSavePath,FCaseID);
     end;
     LoadImgFile;
-    Showmessage(_Msg('�R������'));
+    Showmessage(_Msg('刪除完成'));
   end
-  Else if TreeView1.Selected = MyTreeNode1 then       //�ץ�s��
+  Else if TreeView1.Selected = MyTreeNode1 then       //案件編號
   begin
-    If Messagedlg(Format(_Msg('�s��(%s)�O�_�R��?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+LogFile1.LogToFile(logTimeString+'Tree 案件編號刪除 NowCaseno='+NowCaseno);
+    If Messagedlg(Format(_Msg('編號(%s)是否刪除?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
     clearView(1);
     Application.ProcessMessages;
     if (FMode = 'ESCAN') then
@@ -2336,7 +2611,7 @@
         _DelTree(ImageSavePath+NowCaseno+'\'+iDocDir);
         SetUseCase('D',ImageSavePath+NowCaseno+'\',iDocDir,'','');
         SetDocNoList('D',-1,NowCaseNo,iDocDir,'');
-        if (Copy(iDocNo,1,5)='ZZZZZ') then   //20140703 �R���۩w���ɭn�Rini�ɸ��
+        if (Copy(iDocNo,1,5)='ZZZZZ') then   //20140703 刪除自定文件時要刪ini檔資料
           DeleteCustomDocDir(ImageSavePath+NowCaseno+'\',iDocDir);
 
       end
@@ -2346,7 +2621,7 @@
       _DelTree(DisplayPath);
       SetCaseList('D',NewTreeNode.IndexOf(MyTreeNode1),'');
     end;
-    ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
 
     if (FMode = 'ESCAN') then
     begin
@@ -2358,81 +2633,78 @@
     end;
     LoadImgFile;
   end
-  Else if TreeView1.Selected = MyTreeNode2 then       //���h
+  Else if TreeView1.Selected = MyTreeNode2 then       //文件層
   begin
-    If Messagedlg(Format(_Msg('���(%s)�O�_�R��?'),[DocNo2DocName(NowCaseno,NowDocNo)]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+    If Messagedlg(Format(_Msg('文件(%s)是否刪除?'),[DocNo2DocName(NowCaseno,NowDocNo)]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
     ClearView(1);
     Application.ProcessMessages;
-    _DelTree(ImageSavePath+NowCaseno+'\'+NowDocDir);
+//ShowMessage(NowDocDir);
+LogFile1.LogToFile(logTimeString+'Tree 文件層號刪除 NowDocDir='+NowDocDir);
+    if (Length(NowDocDir)=8) or (NowDocDir=AttName) then
+    begin
+//ShowMessage('DeleteDocNoFileForESCAN');
+      DeleteDocNoFileForESCAN(ImageSavePath+NowCaseno+'\'+NowDocDir,NowDocDir);
+    end
+    else
+    begin
+      _DelTree(ImageSavePath+NowCaseno+'\'+NowDocDir);
+      SetDocNoList('D',-1,NowCaseNo,NowDocDir,'');
+    end;
     SetUseCase('D',ImageSavePath+NowCaseno+'\',NowDocDir,'','');
-    SetDocNoList('D',-1,NowCaseNo,NowDocDir,'');
-    if (Copy(NowDocNo,1,5)='ZZZZZ') then   //20140703 �R���۩w���ɭn�Rini�ɸ��
+
+    if (Copy(NowDocNo,1,5)='ZZZZZ') then   //20140703 刪除自定文件時要刪ini檔資料
       DeleteCustomDocDir(ImageSavePath+NowCaseno+'\',NowDocDir);
 
     DrawDocItem2(MytreeNode1,NowCaseno);
-    MytreeNode1.Text := Format(_Msg('%s-%d��'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
-    ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+    MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
     NewTreeNodeRefresh;
 
-    {if (FMode <>'ESCAN') and (ContextList.Count = NowShowFileList.Count) then
-    begin
-      if Messagedlg(_Msg('�R����N�L�v��,�ץ�N�R��,�O�_�T�w?'),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);  //�M���ˮְO��
-      NewTreeNodeRefresh;
-    end;
-    Showmessage(_Msg('�R������')); }
-
-    //Showmessage(_Msg('�R������'));  //20101102 User�n�D����
   end
-  Else if TreeView1.Selected = MyTreeNode3 then       //FormID�h
+  Else if TreeView1.Selected = MyTreeNode3 then       //FormID層
   begin
-    If Messagedlg(Format(_Msg('���(%s)�O�_�R��?'),[NowFormName]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+    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);
-    MytreeNode1.Text := Format(_Msg('%s-%d��'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
-    ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+    MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
     NewTreeNodeRefresh;
 
-    {if (FMode <>'ESCAN') and (ContextList.Count = NowShowFileList.Count) then
-    begin
-      if Messagedlg(_Msg('�R����N�L�v��,�ץ�N�R��,�O�_�T�w?'),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);  //�M���ˮְO��
-      NewTreeNodeRefresh;
-    end;
-    Showmessage(_Msg('�R������'));
-    //Showmessage(_Msg('�R������'));   //20101102 User�n�D���� }
   end;
+end;
+
+function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean;
+var
+  i:integer;
+  ST:TStringList;
+begin
+  Result:=False;
+  ST:=TStringList.Create;
+  if FileExists(DocNopath+'\Context.dat') then   /////20190319 Hong 當有空的Docno目錄時會掛掉,增加這行
+    ST.loadFromfile(DocNopath+'\Context.dat');
+  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);
@@ -2445,7 +2717,7 @@
   GoViewMode;
   ISB1.ZoomMode := zmFitWidth;
 
-  NewCaseID := InputBox(_Msg('�ק�ץ�s��'),_Msg('�s�ץ�s��'),'');
+  NewCaseID := InputBox(_Msg('修改案件編號'),_Msg('新案件編號'),'');
   ShowNewCaseID := NewCaseID;
   ShowNowCaseID := NowCaseno;
 
@@ -2453,186 +2725,464 @@
 
   IF Length(NewCaseID)<>CaseIDLength Then
   begin
-    Showmessage(_Msg('��J�榡���~'));
+    Showmessage(_Msg('輸入格式錯誤'));
     Exit;
   end;
 
   if DirectoryExists(ImageSavePath+NewCaseID) then
   begin
-    Showmessage(NewCaseID+_Msg('�v�s�b,�L�k�ק�'));
+    Showmessage(NewCaseID+_Msg('己存在,無法修改'));
     Exit;
   end;
 
-  if Messagedlg(Format(_Msg('�O�_�N%s�אּ%s'),[ShowNowCaseID,ShowNewCaseID]),Mtconfirmation,[mbyes,mbcancel],0) = mrcancel then
+  if Messagedlg(Format(_Msg('是否將%s改為%s'),[ShowNowCaseID,ShowNewCaseID]),Mtconfirmation,[mbyes,mbcancel],0) = mrcancel then
     Exit;
   ClearView(1);
   RenameFile(ImageSavePath+NowCaseno,ImageSavePath+NewCaseID);
   SetCaseList('E',NewTreeNode.IndexOf(MyTreeNode1),NewCaseID);
 
   //P := ContextList.Count;
-  MytreeNode1.Text := Format(_Msg('%s-%d��'),[NewCaseID,GetCasePage(ImageSavePath,NewCaseID)]);
+  MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NewCaseID,GetCasePage(ImageSavePath,NewCaseID)]);
   //DrawDocItem(MyTreeNode1,FORM_INF_List,NewCaseID);
   DrawDocItem2(MytreeNode1,NewCaseID);
-  Showmessage(_Msg('�ק粒��'));
+  Showmessage(_Msg('修改完成'));
 end;
 
 procedure TCB_IMGPSScanX.PM103Click(Sender: TObject);
 begin
   if TreeView1.Selected = nil then Exit;
+
+  {if Treeview1.Selected = NewTreeNode then
+  begin
+    ShowMessage('AAAAA');
+  end;
+  if Treeview1.Selected = MyTreeNode1 then
+  begin
+    ShowMessage('BBBBB');
+  end;
+
+  if Treeview1.Selected = MyTreeNode2 then
+  begin
+    ShowMessage('CCCCC');
+  end;
+
+  if Treeview1.Selected = MyTreeNode3 then
+  begin
+    ShowMessage('DDDDD');
+  end;
+  }
   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;
 
-procedure TCB_IMGPSScanX.PM104Click(Sender: TObject);
-var
-  i,n,m,ii,P,v,v1,page,imageCount : Integer;
-  FName : String;
-  CaseID,DocNo,FormID :String;
-  DocDir :String;
-  SavePath,SaveFilename:String;
-  ISB : TImageScrollBox;
-begin
-  OpenDialog1.Filter := 'Image files|*.TIF;*.JPG';
-  if OpenDialog1.Execute then
-  begin
+
+Procedure TCB_IMGPSScanX.PM104Click(Sender: TObject);
+Var
+  i, n, m, ii, P, v, v1, page, imageCount: Integer;
+  FName: String;
+  CaseID, DocNo, FormID: String;
+  DocDir: String;
+  SavePath, SaveFilename: String;
+  ISB: TImageScrollBox;
+  FileRec: TSearchrec;
+
+  iGraphic, iGraphic_First, iGraphic_sec: TTiffGraphic;
+  iRect : TRect;
+  JpgGr : TJpegGraphic;
+  SaveStream     : TFileStream;
+  SaveStreamA:TFileStream;
+  SaveStreamB:TFileStream;
+  cooom:integer;
+Begin
+  OpenDialog1.Filter := 'Image files|*.TIF;*.JPG;*.PNG';
+  If OpenDialog1.Execute Then
+  Begin
     ISB := TImageScrollBox.Create(self);
-    try
-      ShowText :=_Msg('�ɮץ[�J��,�еy��');
-      DataLoading(True,True);
-      if TreeView1.Selected = nil then Exit;
-      FName := OpenDialog1.FileName;
-      CaseID := NowCaseno ;
-      imageCount := 0;
-      P := ISB.ImageCountFromFile(OpenDialog1.FileName);
-      for I := 1 to P do
+try
+    ShowText := _Msg('檔案加入中,請稍候');
+LogFile1.LogToFile(logTimeString+'檔案加入中開始');
+    DataLoading(True, True);
+    If TreeView1.Selected = Nil Then
+      Exit;
+    FName := OpenDialog1.FileName;
+
+    FindFirst(FName, faAnyfile, FileRec);
+
+    If FFileSizeLimit = 0 Then
+    Begin
+      FFileSizeLimit := 5 * 1024;
+    End;
+//FFileSizeLimit:=20*5*1024;
+//ShowMessage(IntToStr(FileRec.Size)+','+IntToStr(FFileSizeLimit * 1024));
+    If FileRec.Size > FFileSizeLimit * 1024 Then // 檢查檔案大小
+    Begin
+      ShowMessage(Format(_Msg('目前檔案大小為 %.3f MB,已超過單一檔案匯入限制%1.f MB'),[FileRec.Size / (1024*1024),FFileSizeLimit/1024]));
+      {ShowMessage(Format('目前檔案大小為 %.3f MB', [FileRec.Size / (1024*1024)]) +
+        ',已超過單一檔案匯入限制'+Format('%.1f',[FFileSizeLimit/1024])+'MB');}
+      FindClose(FileRec);
+      DataLoading(false, false);
+      Exit;
+    End;
+    //MessageDlg()
+    //cooom:=StrToInt(InputBox('輸入百分比','輸入百分比',''));
+    cooom:=FJpgCompression;//20171211彩色tif採jpg壓縮的比例
+
+    FindClose(FileRec);
+    CaseID := NowCaseno;
+    imageCount := 0;
+    P := ISB.ImageCountFromFile(OpenDialog1.FileName);
+    For i := 1 To P Do
+    Begin
+      ShowText := Format(_Msg('檔案加入中,請稍候(%d/%d)'),[i,p]);
+      //ShowText := _Msg('檔案加入中,請稍候')+'(' + inttostr(i) + '/' + inttostr(P) + ')';
+      DataLoading(True, True);
+      ISB.LoadFromFile(FName, i);
+      DeskewImg(ISB.Graphic);
+
+
+      ISB_BW.Graphic.Assign(ISB.Graphic); //20180104
+      If ISB.Graphic.ImageFormat <> ifBlackWhite Then   //20180104
       begin
-        ShowText :=_Msg('�ɮץ[�J��,�еy��('+inttostr(i)+'/'+inttostr(P)+')');
-        DataLoading(True,True);
-        ISB.LoadFromFile(FName,i);
-        DeskewImg(ISB.Graphic);
-        if (TreeView1.Selected = NewTreeNode) or (TreeView1.Selected = MyTreeNode1) then
-        begin
+        ConvertToBW(ISB_BW.Graphic);
+      end;
+      ///ISB_BW.SaveToFile('KKKKKKKK.tif');
+
+      iGraphic_First := TTiffGraphic.Create;
+      iGraphic_sec := TTiffGraphic.Create;
+
+
+      //ShowMessage(IntToStr(iGraphic_First.Palette.palNumEntries)); //彩色 會為0  黑白 為2
+
+      MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf); //判斷A3 有用FormID 所以要先辨條碼
+      For n := 1 To MpsBarcodeinf.Count Do
+      Begin
+        If (MpsBarcodeinf.r180[n] <> 0) and (Length(MpsBarcodeinf.Text[n])=FormIDLength) 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
+        // 先取右邊的影像
+        iRect.Left := ISB.Graphic.Width Div 2;
+        iRect.Right := ISB.Graphic.Width;
+        iRect.Top := 0;
+        iRect.Bottom := ISB.Graphic.Height;
+        CropImg(iGraphic_First, iRect);
+
+        iGraphic_sec.Assign(ISB.Graphic);
+        // 再取左邊的影像
+        iRect.Left := 0;
+        iRect.Right := ISB.Graphic.Width Div 2;
+        iRect.Top := 0;
+        iRect.Bottom := ISB.Graphic.Height;
+        CropImg(iGraphic_sec, iRect);
+      End;
+      ISB.Graphic.Clear;  //20220711  Hong 覺得ISB後面沒有到了,先清掉減少記憶體使用
+      iGraphic := iGraphic_First;
+
+      While Not iGraphic.IsEmpty Do
+      Begin
+        If (TreeView1.Selected = NewTreeNode) Or
+          (TreeView1.Selected = MyTreeNode1) Then
+        Begin
           SaveFilename := '';
-          MpsGetBarcode(ISB.Graphic,MpsBarcodeinf);
-          for n := 1 to MpsBarcodeinf.Count-1  do
+          ISB_BW.Graphic.Assign(iGraphic); //20180104
+          If iGraphic.ImageFormat <> ifBlackWhite Then   //20180104
           begin
-            if MpsBarcodeinf.r180[n] <> 0 then  //�̱��X������v��
-            begin
-              Rotate(ISB.Graphic,MpsBarcodeinf.r180[n]);
-              MpsGetBarcode(ISB.Graphic,MpsBarcodeinf);
-              Break;
-            end;
+            ConvertToBW(ISB_BW.Graphic);
           end;
-          FormID := BarCode2FormID; //���XFormID
+          MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
+//ShowMessage(IntToStr(MpsBarcodeinf.Count));
+          For n := 1 To MpsBarcodeinf.Count Do
+          Begin
+            If (MpsBarcodeinf.r180[n] <> 0) and (Length(MpsBarcodeinf.Text[n])=FormIDLength) Then // 依條碼角度轉影像
+            Begin
+              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
+              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
-          begin
-            if FindDivFormCode(FormID) Then  //�u����׭��W���ץ���X
-            begin
+          If (TreeView1.Selected = NewTreeNode) Then
+          Begin
+            If FindDivFormCode(FormID) Then // 只找分案頁上的案件條碼
+            Begin
               imageCount := 0;
               ClearView(1);
               ContextList.Clear;
               CaseID := BarCode2CaseID;
-              if DirectoryExists(ImageSavePath + CaseID+'\') then
-              begin
-                _DelTree(ImageSavePath + CaseID+'\');
-                SetCaseList('D',-1,CaseID);
-              end;
-            end;
-            if CaseID = '' then
-            begin
+              If DirectoryExists(ImageSavePath + CaseID + '\') Then
+              Begin
+                _DelTree(ImageSavePath + CaseID + '\');
+                SetCaseList('D', -1, CaseID);
+              End;
+            End;
+            If CaseID = '' Then
+            Begin
               CaseID := GetNoNameCase(ImageSavePath);
               ContextList.Clear;
-            end;
-          end;
-          SavePath := ImageSavePath + CaseID+'\';
+            End;
+          End;
+          SavePath := ImageSavePath + CaseID + '\';
           Str2Dir(SavePath);
 
           DocNo := FormCode2DocNo(FormID);
-          DocDir := FindLastestDocDir(CaseID,DocNo);
-          if DocNoNeedDiv(DocNo) then   //�n������
+          DocDir := FindLastestDocDir(CaseID, DocNo);
+          if (FMode='ESCAN') and (FModeName=_Msg('補件掃描')) then
           begin
-            if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(CaseID,DocDir)>0)) or (DocDir = '') then
-              DocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',DocNo);
-          end
-          Else        //��������
-          begin
-            if DocNo <> '' then
-              DocDir := DocNo
-            else      //Attach ����
-              DocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',DocNo);
+            DocDir := FindLastestDocDirForPage(CaseID, DocNo,FormID);
+//ShowMessage('DocDir='+DocDir);
           end;
-          {if ((FormCode2Page(FormID) = '01') and DocNoNeedDiv(DocNo)) or (FormID='') then   //�O���Ĥ@���B�n����
-            DocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',DocNo)
-          Else if not DocNoNeedDiv(DocNo) then
-            DocDir := DocNo; }
-          if (not DirectoryExists(ImageSavePath + CaseID+'\'+DocDir+'\')) and (DocDir <> AttName) then
-            SetDocNoList('A',-1,CaseID,DocDir,'1');
-          SavePath := ImageSavePath + CaseID+'\'+DocDir+'\';
+
+          If DocNoNeedDiv(DocNo) Then // 要分份數
+          Begin
+            If ((FormCode2Page(FormID) = '01') And
+              (GetDocDir_Page(CaseID, DocDir) > 0)) Or (DocDir = '') Then
+              begin
+                DocDir := DocNo2DocNoDir(ImageSavePath + CaseID + '\', DocNo);
+              end;
+          End
+          Else // 不分份數
+          Begin
+            If DocNo <> '' Then
+              DocDir := DocNo
+            Else // Attach 附件
+              DocDir := DocNo2DocNoDir(ImageSavePath + CaseID + '\', DocNo);
+          End;
+
+          If (Not DirectoryExists(ImageSavePath + CaseID + '\' + DocDir + '\'))
+            And (DocDir <> AttName) Then
+            SetDocNoList('A', -1, CaseID, DocDir, '1');
+          SavePath := ImageSavePath + CaseID + '\' + DocDir + '\';
           Str2Dir(SavePath);
           ContextList.Clear;
-          if FileExists(SavePath+'Context.dat') then
-            ContextList.LoadFromFile(SavePath+'Context.dat');
+          If FileExists(SavePath + 'Context.dat') Then
+            ContextList.LoadFromFile(SavePath + 'Context.dat');
 
-          WriteCaseIndex(ImageSavePath + CaseID+'\');  //�g�J�ץ����
-          if SaveFilename = '' then //����
-            SaveFilename:= Add_Zoo(ContextList.Count+1,3)+ext
+          WriteCaseIndex(ImageSavePath + CaseID + '\');
+          // 寫入案件索引
+          If SaveFilename = '' Then // 附件
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + ext
           Else
-            SaveFilename := Add_Zoo(ContextList.Count+1,3)+'_'+SaveFilename+ext;
-          ISB.SaveToFile(SavePath+SaveFilename);
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + '_' +
+              SaveFilename + ext;
 
-          SetContextList('A',-1,CaseID,DocDir,SaveFilename);
-          if (TreeView1.Selected = NewTreeNode) Then
+          For n := 1 To MpsBarcodeinf.Count Do
+          Begin
+            If (MpsBarcodeinf.r180[n] <> 0) and (Length(MpsBarcodeinf.Text[n])=FormIDLength) Then // 依條碼角度轉影像
+            Begin
+              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
+              MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
+              Break;
+            End;
+          End;
+//ShowMessage(IntToStr(iGraphic.Palette.palNumEntries));
+          if iGraphic.ImageFormat = ifBlackWhite then   //20200806 出現無法匯入,是因color256無法壓JPEG,待報會後再開啟
           begin
-            if imageCount = 0 then
-            begin
-              SetCaseList('A',-1,CaseID);
-              MyTreeNode1 := TreeView1.Items.AddChild(NewTreeNode,CaseID);
+            SaveFilename := changefileext(SaveFilename,'.tif');    //20240320 Hong 調整黑白存tif
+            iGraphic.Compression:=tcGroup4;
+          end
+          else if iGraphic.ImageFormat= ifColor256 then
+          begin
+            SaveFilename := changefileext(SaveFilename,'.jpg');    //20240320 Hong 調整Color256存jpg
+            ConverttoGray(iGraphic);
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end
+          else if (iGraphic.ImageFormat = ifTrueColor) or (iGraphic.ImageFormat = ifGray256) then
+          begin
+            SaveFilename := changefileext(SaveFilename,'.jpg');    //20240320 Hong 調整彩色灰階存jpg
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end
+          else
+          begin
+            iGraphic.Compression:=tcLZW;
+          end;
+
+          {if (iGraphic.Palette.palNumEntries = 0) or (iGraphic.Palette.palNumEntries = 256) then  //20171130 彩色 會為0  黑白 為2  灰階256     //20200806拿掉
+          begin
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end;}
+
+          If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.tif' Then
+          Begin
+            If FileExists(SavePath + SaveFilename) Then
+              SaveStream := TFileStream.Create(SavePath + SaveFilename, fmOpenReadWrite)
+            Else
+              SaveStream := TFileStream.Create(SavePath + SaveFilename, fmCreate);
+            Try
+              SaveStream.Seek(0, soFromBeginning);
+              iGraphic.AppendToStream(SaveStream);
+            Finally
+              SaveStream.Free;
+            End;
+          End
+          Else If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.jpg' Then
+          Begin
+            If FileExists(SavePath + SaveFilename) Then
+              DeleteFile(SavePath + SaveFilename);
+            // SaveStream := TFileStream.Create( PEFileName ,fmCreate );
+            JpgGr := TJpegGraphic.Create;
+            Try
+              JpgGr.Assign(iGraphic);
+              JpgGr.SaveQuality := 30;
+              // JpgGr.AppendToStream(SaveStream);
+              JpgGr.SaveToFile(SavePath + SaveFilename);
+            Finally
+              JpgGr.Free;
+              // SaveStream.Free;
+            End;
+          End;
+
+          SetContextList('A', -1, CaseID, DocDir, SaveFilename);
+          If (TreeView1.Selected = NewTreeNode) Then
+          Begin
+            If imageCount = 0 Then
+            Begin
+              SetCaseList('A', -1, CaseID);
+              MyTreeNode1 := TreeView1.Items.AddChild(NewTreeNode, CaseID);
               MyTreeNode1.ImageIndex := 2;
               MyTreeNode1.SelectedIndex := 2;
               Application.ProcessMessages;
-            end;
-          end;
+            End;
+          End;
           inc(imageCount);
-          //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID);
-          //DrawDocItem(MyTreeNode1,FORM_INF_List,CaseID);
-        end
-        Else if TreeView1.Selected = MyTreeNode3 then
-        begin
-          SavePath := ImageSavePath + CaseID+'\'+NowDocDir+'\';
+          // DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID);
+          // DrawDocItem(MyTreeNode1,FORM_INF_List,CaseID);
+        End
+        Else If TreeView1.Selected = MyTreeNode3 Then
+        Begin
+          SavePath := ImageSavePath + CaseID + '\' + NowDocDir + '\';
           ContextList.Clear;
-          if FileExists(ImageSavePath + CaseID+'\'+NowDocDir+'\Context.dat') then
-            ContextList.LoadFromFile(ImageSavePath + CaseID+'\'+NowDocDir+'\Context.dat');
-          if NowFormCode <> '' then
-            SaveFilename := Add_Zoo(ContextList.Count+1,3)+'_'+NowFormCode+ext
-          else
-            SaveFilename := Add_Zoo(ContextList.Count+1,3)+ext;
-          ISB.SaveToFile(SavePath+SaveFilename);
+          If FileExists(ImageSavePath + CaseID + '\' + NowDocDir +
+            '\Context.dat') Then
+            ContextList.LoadFromFile(ImageSavePath + CaseID + '\' + NowDocDir +
+              '\Context.dat');
+          If NowFormCode <> '' Then
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + '_' +
+              NowFormCode + ext
+          Else
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + ext;
+
+          For n := 1 To MpsBarcodeinf.Count Do
+          Begin
+            If MpsBarcodeinf.r180[n] <> 0 Then // 依條碼角度轉影像
+            Begin
+              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
+              MpsGetBarcode(iGraphic, MpsBarcodeinf);
+              Break;
+            End;
+          End;
+
+          if (iGraphic.Palette.palNumEntries = 0) or (iGraphic.Palette.palNumEntries = 256) then  //20171130 彩色 會為0  黑白 為2
+          begin
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end;
+
+          If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.tif' Then
+          Begin
+            If FileExists(SavePath + SaveFilename) Then
+              SaveStream := TFileStream.Create(SavePath + SaveFilename,
+                fmOpenReadWrite)
+            Else
+              SaveStream := TFileStream.Create(SavePath + SaveFilename,
+                fmCreate);
+            Try
+              SaveStream.Seek(0, soFromBeginning);
+              iGraphic.AppendToStream(SaveStream);
+            Finally
+              SaveStream.Free;
+            End;
+          End
+
+          Else
+          Begin
+            If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.jpg' Then
+            Begin
+              If FileExists(SavePath + SaveFilename) Then
+                DeleteFile(SavePath + SaveFilename);
+              // SaveStream := TFileStream.Create( PEFileName ,fmCreate );
+              JpgGr := TJpegGraphic.Create;
+              Try
+                JpgGr.Assign(iGraphic);
+                JpgGr.SaveQuality := cooom;
+                // JpgGr.AppendToStream(SaveStream);
+                JpgGr.SaveToFile(SavePath + SaveFilename);
+              Finally
+                JpgGr.Free;
+                // SaveStream.Free;
+              End;
+            End;
+
+          End;
+          // ISB.SaveToFile(SavePath+SaveFilename);
           ContextList.Add(SaveFilename);
-          ContextList.SaveToFile(SavePath+'Context.dat');
-        end;
-      end;
-      ClearErrini(CaseID,MyTreeNode1);  //�M���ˮְO��
-      if (TreeView1.Selected = MyTreeNode1) or (TreeView1.Selected = NewTreeNode) then
-      begin
-        LoadImgFile;
-      end
-      Else
-      begin
-        DrawDocItem2(MytreeNode1,CaseID); //���X���W�٪���öǦ^�O�_���ӽЮѪ��v��
-        page := GetCasePage(ImageSavePath,CaseID);
-        MytreeNode1.Text := Format(_Msg('%s-%d��'),[CaseID,page]);
-      end;
-      NewTreeNodeRefresh;
-      Application.ProcessMessages;
-      DataLoading(False,False);
-    finally
-    ISB.Free;
-    end;
-  end;
+          ContextList.SaveToFile(SavePath + 'Context.dat');
+        End;
+
+        if iGraphic = iGraphic_First then
+          iGraphic := iGraphic_Sec
+        else
+          iGraphic.Assign(nil);
+
+      End //While 結束
+
+    End;
+    ClearErrini(CaseID, MyTreeNode1);
+    // 清掉檢核記錄
+    If (TreeView1.Selected = MyTreeNode1) Or
+      (TreeView1.Selected = NewTreeNode) Then
+    Begin
+      LoadImgFile;
+    End
+    Else
+    Begin
+      DrawDocItem2(MyTreeNode1, CaseID);
+      // 長出文件名稱的樹並傳回是否有申請書的影像
+      page := GetCasePage(ImageSavePath, CaseID);
+      // ShowMessage('page='+IntToStr(page));
+      MyTreeNode1.Text := Format(_Msg('%s-%d頁'), [CaseID, page]);
+    End;
+    // ShowMessage('AAAA');
+    NewTreeNodeRefresh;
+    Application.ProcessMessages;
+    DataLoading(false, false);
+
+
+finally
+ISB.Free;
+iGraphic_First.Free;
+iGraphic_sec.Free;
 end;
+
+
+  End;
+End;
+
+
 
 procedure TCB_IMGPSScanX.PM106Click(Sender: TObject);
 var
@@ -2640,16 +3190,16 @@
   CopyFormID,Copy2Caseno,CopyFileName : String;
   S : TStringlist;
 begin
-  ShowText := _Msg('�ƻs���,�еy��');
+  ShowText := _Msg('複製文件中,請稍候');
   DataLoading(True,True);
   DocCopyForm := TDocCopyForm.Create(Self);
   S := TStringlist.Create;
   try
-    InitialLanguage(DocCopyForm); //���J�h��y��
+    InitialLanguage(DocCopyForm); //載入多國語言
     DocCopyForm.CopyFromGB.Caption := NowCaseno+DocCopyForm.CopyFromGB.Caption;
     IF NewTreenode.Count = 1 Then
     begin
-      Showmessage(_Msg('�S����L�i�ƻs�����'));
+      Showmessage(_Msg('沒有其他可複製的文件'));
       Exit;
     end;
     For i := 0 to MyTreeNode1.Count -1 do
@@ -2674,9 +3224,9 @@
 
     if DocCopyForm.ShowModal = mrok then
     begin
-      If MessageDlg(_Msg('�O�_�T�w�n�N�Ŀ諸���ƻs��Ŀ諸�s����?'),MtConfirmation,[Mbyes,mbcancel],0) = mrCancel Then
+      If MessageDlg(_Msg('是否確定要將勾選的文件複製到勾選的編號裡?'),MtConfirmation,[Mbyes,mbcancel],0) = mrCancel Then
         Exit;
-      ShowText := _Msg('�ƻs��,�еy��');
+      ShowText := _Msg('複製中,請稍候');
       DataLoading(True,True);
       For i := 0 to DocCopyForm.CheckListBox2.Count -1 do
       begin
@@ -2684,9 +3234,9 @@
         begin
           S.Clear;
           Copy2Caseno := DocCopyForm.CheckListBox2.Items.Strings[i];
-          ClearErrini(Copy2Caseno,MyTreeNode1);  //�M���ˮְO��
+          ClearErrini(Copy2Caseno,MyTreeNode1);  //清掉檢核記錄
           S.LoadFromFile(ImageSavePath + Copy2Caseno +'\Context.dat');
-          For n := 0 to DocCopyForm.CheckListBox1.Count -1 do  //���
+          For n := 0 to DocCopyForm.CheckListBox1.Count -1 do  //文件
           begin
             If DocCopyForm.CheckListBox1.Checked[n] Then
             begin
@@ -2699,7 +3249,7 @@
               For x := 0 to ContextList.Count -1 do
               begin
                 //Showmessage(CopyFormCode);
-                //IF CopyFormID <> '' then   //�����N��
+                //IF CopyFormID <> '' then   //有文件代號
                // begin
                   if FileName2FormCode(ContextList.Strings[x])=CopyFormID  then
                   begin
@@ -2718,7 +3268,7 @@
         end;
       end;
       DataLoading(False,False);
-      Showmessage(_Msg('�ƻs����!!'));
+      Showmessage(_Msg('複製完成!!'));
       LoadImgFile;
     end;
   finally
@@ -2738,16 +3288,18 @@
   i : Integer;
   DocListForm : TDocListForm;
   OldName,NewName,Ext : String;
-  NewFormID,NewFormName : String;
+  NewFormID,NewFormName,CustomDocNo : String;
 begin
   DocListForm := TDocListForm.Create(self);
   try
-    InitialLanguage(PatchDlg); //���J�h��y��
+LogFile1.LogToFile(logTimeString+'Tree 歸類開始');
+    InitialLanguage(DocListForm); //載入多國語言
+    DocListForm.CheckBox1.Visible:=True;
     for i := 1 to FORM_INF_List.Count - 1 do
     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);
@@ -2760,30 +3312,67 @@
     end;
     if DocListForm.ShowModal = mrOk then
     begin
-      NewFormID := DocListForm.DocLV.Selected.Caption;
-      if NowFormCode <> AttName then
+      if not (DocListForm.DocLV.Selected=nil) then
+         NewFormID := DocListForm.DocLV.Selected.Caption;
+      if DocListForm.CheckBox1.Checked then
       begin
-        If Messagedlg(Format(_Msg('�O�_�N"%s"���Ҧ��v���k����"%s"'),[FormCode2FormName(NowCaseNo,NowFormCode),FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
-          Exit;
-      end
-      Else
-      begin
-        If Messagedlg(Format(_Msg('�O�_�N"%s"���Ҧ��v���k����"%s"'),[_Msg('����')+MyTreeNode3.Text,FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
-          Exit;
-      end;
-      ShowText := _Msg('�k����,�еy�J');
-      DataLoading(True,True);
-      //FormIDReplace(DisplayPath,NowFormCode,FormID);
-      //ShowFileReplace(DisplayPath,FormID);
-      FormIDReplace(NowCaseNo,NowDocDir,NowFormCode,NewFormID);
-      ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
-      DrawDocItem2(MytreeNode1,NowCaseno);
-      //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
+        //歸類到自訂文件
+        NewFormID:=DocListForm.Edit1.Text;
 
+        if Trim(DocListForm.Edit1.Text)='' then
+        begin
+          Showmessage(_Msg('未輸入文件名稱'));
+          Exit;
+        end;
+        if FindCustomDocName(DisplayPath,NewFormID) then
+        begin
+          Showmessage(Format(_Msg('文件名稱:"%s"己存在'),[NewFormID]));
+          Exit;
+        end;
+        if NowFormCode <> AttName then
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[FormCode2FormName(NowCaseNo,NowFormCode),NewFormID]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end
+        Else
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[_Msg('附件')+MyTreeNode3.Text,FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        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');
+      end
+      else
+      begin
+        //歸類到既有文件
+        if NowFormCode <> AttName then
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[FormCode2FormName(NowCaseNo,NowFormCode),FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end
+        Else
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[_Msg('附件')+MyTreeNode3.Text,FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end;
+        ShowText := _Msg('歸類中,請稍侯');
+        DataLoading(True,True);
+//ShowMessage('NowDocDir='+NowDocDir);
+LogFile1.LogToFile(logTimeString+'Tree 歸類到既有文件 NewFormID='+NewFormID);
+        FormIDReplace(NowCaseNo,NowDocDir,NowFormCode,NewFormID);
+
+      end;
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+      DrawDocItem2(MytreeNode1,NowCaseno);
       DataLoading(False,False);
       TreeView1.Selected := MyTreeNode1;
       TreeView1Click(self);
     end;
+
   finally
   DocListForm.Free;
   end;
@@ -2801,11 +3390,11 @@
   S := TStringlist.Create;
   try
     ClearView(1);
-    ShowText := CaseID+_Msg('�ˮ֤�,�еy��');
+    ShowText := CaseID+_Msg('檢核中,請稍候');
     DataLoading(True,True);
-    ShowText := CaseID+_Msg('�ˮ֤�,�еy��');
+    ShowText := CaseID+_Msg('檢核中,請稍候');
     DataLoading(True,True);
-    If OMRCheckCase(CaseID) then  //�����\
+    If OMRCheckCase(CaseID) then  //有成功
     begin
       S.Add('Y');
       S.SaveToFile(ImageSavePath+CaseID+'\OMRCheckOk.dat');
@@ -2817,7 +3406,7 @@
   finally
   S.Free;
   end;
-  Showmessage(_Msg('�ˮ֧���'));
+  Showmessage(_Msg('檢核完成'));
 end;
 
 procedure TCB_IMGPSScanX.PM110Click(Sender: TObject);
@@ -2826,17 +3415,18 @@
   CustomDocNo : String;
   DocDir : String;
   SavePath : String;
+  ST1:TStringList;
 begin
-  if InputQuery('��J��L���W��','���W��',CustomDocName) then
+  if InputQuery(_Msg('輸入其他文件名稱'),_Msg('文件名稱'),CustomDocName) then
   begin
     if CustomDocName <> '' then
     begin
       if FindCustomDocName(DisplayPath,CustomDocName) then
       begin
-        Showmessage(Format('���W��:"%s"�v�s�b',[CustomDocName]));
+        Showmessage(Format('文件名稱:"%s"己存在',[CustomDocName]));
         Exit;
       end;
-
+      ST1:=TStringList.Create;
       CustomDocNo := GetNewCustomDocNo(DisplayPath,CustomDocName);
       DocDir := CustomDocNo;
       SavePath := ImageSavePath+NowCaseNo+'\'+DocDir+'\';
@@ -2856,26 +3446,26 @@
 begin
   oldCopies := GetDocDirCopies(NowCaseno,NowDocDir);
   try
-    NewCopies := Strtoint(inputBox('�ק����','�п�J�ק�᪺����',inttostr(oldCopies)));
+    NewCopies := Strtoint(inputBox(_Msg('修改份數'),_Msg('請輸入修改後的份數'),inttostr(oldCopies)));
   except
-    Showmessage('��J���~');
+    Showmessage(_Msg('輸入錯誤'));
     Exit;
   end;
   if (NewCopies <= 0) and (NewCopies >= 10000) then
   begin
-    Showmessage('��J�d����~');
+    Showmessage(_Msg('輸入範圍錯誤'));
     Exit;
   end;
 
   if (oldCopies <> NewCopies) and (NewCopies > 0) and (NewCopies < 10000) then
   begin
-    if DocNoNeedDiv(NowDocNo) and (NewCopies = 1) and (MessageDlg('�ק��1���ᦹ���N�L�k�A�i����ƭק�,�O�_�T�w??',mtConfirmation,[mbyes,mbcancel],0)= mrcancel) then
+    if DocNoNeedDiv(NowDocNo) and (NewCopies = 1) and (MessageDlg(_Msg('修改至1份後此文件將無法再進行份數修改,是否確定??'),mtConfirmation,[mbyes,mbcancel],0)= mrcancel) then
       Exit;
 
     SetDocDirCopies(NowCaseno,NowDocDir,NewCopies);
     SetRecordEditedDocDir('A',NowCaseNo,NowDocDir);
     DrawDocItem2(MytreeNode1,NowCaseno);
-    Showmessage('�ק粒��');
+    Showmessage(_Msg('修改完成'));
   end;
 
 end;
@@ -2900,7 +3490,7 @@
 procedure TCB_IMGPSScanX.PM303Click(Sender: TObject);
 begin
   ScanColor := ifTrueColor;
-  Ext := '.jpg';     //20130326 yuu���z�ߧ�sjpg
+  Ext := '.jpg';     //20130326 yuu說理賠改存jpg
   ScanDpi := 200;
   //Ext := '.tif';
   PM303.Checked := True;
@@ -2952,7 +3542,7 @@
   end;
   Panel1.Enabled := True;
   Panel2.Enabled := True;
-  ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
 end;
 
 procedure TCB_IMGPSScanX.PM507Click(Sender: TObject);
@@ -2967,11 +3557,11 @@
   PreNode2Name := '';
   if TreeView1.Selected.Parent = MyTreeNode1 then
     PreNode2Name:= GetNode2Name(MyTreeNode2);
-  ShowText := _Msg('����k����,�еy��');
+  ShowText := _Msg('文件歸類中,請稍候');
   DataLoading(True,True);
   DocListForm := TDocListForm.Create(self);
   try
-    InitialLanguage(PatchDlg); //���J�h��y��
+    InitialLanguage(PatchDlg); //載入多國語言
     for i := 1 to FORM_INF_List.Count - 1 do
     begin
       FormID :=  GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
@@ -2997,11 +3587,11 @@
       NewName := Add_Zoo(FileName2ScanPage(OldName),3)+'_'+DocListForm.DocLV.Selected.Caption+Ext;
       RenameFile(DisplayPath+OldName,DisplayPath+NewName);
       ReNameContext(DisplayPath,OldName,NewName);
-      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280��
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280改
       DrawDocItem2(MytreeNode1,NowCaseno);
       //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
-      ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
-      if PreNode2Name <> '' then  // �^��쥻�I�諸���`�I�W
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+      if PreNode2Name <> '' then  // 回到原本點選的文件節點上
       begin
         for i := 0 to MyTreeNode1.Count - 1 do
         begin
@@ -3013,7 +3603,7 @@
         end;
       end;
       TreeView1click(self);
-      //Showmessage(_Msg('�k������')); //20101103 User�n�D����
+      //Showmessage(_Msg('歸類完成')); //20101103 User要求拿掉
     end;
   finally
   DataLoading(False,False);
@@ -3031,14 +3621,14 @@
   if DisplayISB.FileName = '' then Exit;
   if (ContextList.Count = 1) and ((FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'ISCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN')) then
   begin
-    if Messagedlg(_Msg('�R����(%s)�ץ�L�v��,�N�R�����ץ�,�O�_�T�w�R��?'),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
+    if Messagedlg(Format(_Msg('刪除後(%s)案件無影像,將刪除此案件,是否確定刪除?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
     _DelTree(DisplayPath);
     SetCaseList('D',NewTreeNode.IndexOf(MyTreeNode1),'');
     LoadImgFile;
   end
   Else
   begin
-    if Messagedlg(_Msg('�O�_�T�w�R��?'),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
+    if Messagedlg(_Msg('是否確定刪除?'),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
     inx := ContextList.IndexOf(ExtractFileName(DisplayISB.FileName));
     ContextList.Delete(inx);
     ContextList.SaveToFile(ImageSavePath + NowCaseno+'\Context.dat');
@@ -3050,18 +3640,18 @@
     Context_DocnoList.LoadFromFile(ImageSavePath + NowCaseno+'\Context_DocNo.dat');
     if FileExists(ImageSavePath + NowCaseno+'\CustomDocNo.dat') then
       Cust_DocNoList.LoadFromFile(ImageSavePath + NowCaseno+'\CustomDocNo.dat');
-    //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280��
+    //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280改
     DrawDocItem2(MytreeNode1,NowCaseno);
 
     //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
     P := ContextList.Count;
-    MytreeNode1.Text := Format(_Msg('%s-%d��'),[NowCaseno,p]);
-    ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+    MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,p]);
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
     NewTreeNodeRefresh;
     TreeView1Click(self);
 
   end;
-  //Showmessage(_Msg('�R������'));  //20101101 User�n�D����
+  //Showmessage(_Msg('刪除完成'));  //20101101 User要求拿掉
 end;
 
 procedure TCB_IMGPSScanX.PM509Click(Sender: TObject);
@@ -3073,98 +3663,165 @@
 begin
   DeskewImg(DisplayISB.Graphic);
   DisplayISB.SaveToFile(DisplayISB.FileName);
-  ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
 end;
 
 procedure TCB_IMGPSScanX.PopupMenu1Popup(Sender: TObject);
 begin
-  PM101.Visible := False;   //�R��
-  PM102.Visible := False;   //�ק�ץ�s��
-  PM103.Visible := False;   //���˾��[�J�v��
-  PM104.Visible := False;   //�ɮץ[�J�v��
-  PM106.Visible := False;   //�ƻs���ܨ�L�s��
-  PM107.Visible := False;   //�g�Ƶ�
-  PM108.Visible := False;   //�k��
-  PM109.Visible := False;   //�ˮ֦���
-  PM110.Visible := False;   //�s�W�ۭq���
-  PM111.Visible := False;   //�ק����
+  PM101.Visible := False;   //刪除
+  PM102.Visible := False;   //修改案件編號
+  PM103.Visible := False;   //掃瞄器加入影像
+  PM104.Visible := False;   //檔案加入影像
+  PM106.Visible := False;   //複製文件至其他編號
+  PM107.Visible := False;   //寫備註
+  PM108.Visible := False;   //歸類
+  PM109.Visible := False;   //檢核此筆
+  PM110.Visible := False;   //新增自訂文件
+  PM111.Visible := False;   //修改份數
 
   if (FMode = 'SAMPLESCAN') then Exit;
 
   if TreeView1.Selected = nil then Exit;
-  if TreeView1.Selected = NewTreeNode  then     //�s���˥�
+  if TreeView1.Selected = NewTreeNode  then     //新掃瞄件
   begin
     if (FMode = 'NSCAN') then
     begin
-      PM101.Visible := True;   //�R��
-      PM103.Visible := True;   //���˾��[�J�v��
-      PM104.Visible := True;   //�ɮץ[�J�v��
+//ShowMessage('AAAA');
+      PM101.Visible := True;   //刪除
+      PM103.Visible := True;   //掃瞄器加入影像
+      PM104.Visible := True;   //檔案加入影像
     end;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+//    if FMode='ESCAN' then
+//    begin
+//      PM101.Visible := True;
+//    end;
   end
-  Else if TreeView1.Selected = MyTreeNode1 then    //�ץ�h
+  Else if TreeView1.Selected = MyTreeNode1 then    //案件層
   begin
-    PM101.Visible := True;   //�R��
+    PM101.Visible := True;   //刪除
+
+    if FImgDelete='Y' then
+    begin
+      PM101.Visible:=True;
+    end;
+    if FImgDelete='N' then
+    begin
+      PM101.Visible:=false;
+    end;
+
+    if FMode='ESCAN' then
+      PM101.Visible:=false;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+
     if not CaseDelete_Enable(NowCaseno) then //
       PM101.Enabled := False
     else
       PM101.Enabled := True;
-    PM103.Visible := True;   //���˾��[�J�v��
-    //PM107.Visible := True;   //�g�Ƶ�
-    //PM109.Visible := True;   //�ˮ֦���
-    if FCustDocYN <> 'N' Then
-      PM110.Visible := True;   //�s�W�ۭq���
-    PM104.Visible := True;   //�ɮץ[�J�v��
+    PM103.Visible := True;   //掃瞄器加入影像
+    //PM107.Visible := True;   //寫備註
+    //PM109.Visible := True;   //檢核此筆
+//    if FCustDocYN <> 'N' Then
+//      PM110.Visible := True;   //新增自訂文件  20170914 先不在tree 中做自訂文件  讓user在縮圖做
+    PM104.Visible := True;   //檔案加入影像
     if (FMode = 'NSCAN') then
     begin
-      PM102.Visible := True;   //�ק�ץ�s��
+      PM102.Visible := True;   //修改案件編號
     end;
+//    if FMode='ESCAN' then
+//    begin
+//      PM101.Visible := True;
+//    end;
   end
-  Else if TreeView1.Selected = MyTreeNode2 then    //���h
+  Else if TreeView1.Selected = MyTreeNode2 then    //文件層
   begin
-    PM101.Visible := True;   //�R��
-    //PM107.Visible := True;   //�g�Ƶ�
-    //PM109.Visible := True;   //�ˮ֦���
-    if FCustDocYN <> 'N' Then
-      PM110.Visible := True;   //�s�W�ۭq���
-    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //�S���Q�ޥΨ���
-      PM101.Enabled := False    //�R��
-    Else
-      PM101.Enabled := True;   //�R��
-    if ((GetDocDirCopies(NowCaseno,NowDocDir) > 1) or (not DocNoNeedDiv(NowDocNo)) or (Copy(NowDocNo,1,5)='ZZZZZ')) and (NowDocNo<> 'Attach') and (NowDocNo<> 'S_Attach') then
-      PM111.Visible := True;   //�ק����
-    if (FMode = 'NSCAN') then
-      PM102.Visible := True;   //�ק�ץ�s��
-  end
-  Else if TreeView1.Selected = MyTreeNode3 then    //���h
-  begin
-    PM101.Visible := True;   //�R��
-    PM104.Visible := True;   //�ɮץ[�J�v��
-    PM108.Visible := True;   //�k��
-    PM103.Visible := True;   //���˾��[�J�v��
-    if FCustDocYN <> 'N' Then
-      PM110.Visible := True;   //�s�W�ۭq���
-    if GetFormIDPage(ContextList,NowFormCode) < 1 Then
-      PM108.Visible := False;   //�k��
-    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //�Q�ޥΨ���
+    PM101.Visible := True;   //刪除
+    //PM107.Visible := True;   //寫備註
+    //PM109.Visible := True;   //檢核此筆
+//    if FCustDocYN <> 'N' Then
+//      PM110.Visible := True;   //新增自訂文件
+    if FImgDelete='Y' then
     begin
-      PM101.Enabled := False;   //�R��
-      PM104.Enabled := False;   //�ɮץ[�J�v��
-      PM108.Enabled := False;   //�k��
+      PM101.Visible:=True;
+    end;
+    if FImgDelete='N' then
+    begin
+      PM101.Visible:=false;
+    end;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+
+    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //沒有被引用走的
+      PM101.Enabled := False    //刪除
+    Else
+      PM101.Enabled := True;   //刪除
+    if ((GetDocDirCopies(NowCaseno,NowDocDir) > 1) or (not DocNoNeedDiv(NowDocNo)) or (Copy(NowDocNo,1,5)='ZZZZZ')) and (NowDocNo<> 'Attach') and (NowDocNo<> 'S_Attach') then
+      PM111.Visible := True;   //修改份數
+    if (FMode = 'NSCAN') then
+      PM102.Visible := True;   //修改案件編號
+//    if FMode='ESCAN' then
+//    begin
+//      PM101.Visible := True;
+//    end;
+  end
+  Else if TreeView1.Selected = MyTreeNode3 then    //表單層
+  begin
+    PM101.Visible := True;   //刪除
+    PM104.Visible := True;   //檔案加入影像
+    PM108.Visible := True;   //歸類
+    PM103.Visible := True;   //掃瞄器加入影像
+//    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=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+
+    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //被引用走的
+    begin
+      PM101.Enabled := False;   //刪除
+      PM104.Enabled := False;   //檔案加入影像
+      PM108.Enabled := False;   //歸類
     end
     Else
     begin
-      PM101.Enabled := True;   //�R��
-      PM104.Enabled := True;   //�ɮץ[�J�v��
-      PM108.Enabled := True;   //�k��
+      PM101.Enabled := True;   //刪除
+      PM104.Enabled := True;   //檔案加入影像
+      PM108.Enabled := True;   //歸類
     end;
 
     if (FMode = 'NSCAN') then
-      PM102.Visible := True;   //�ק�ץ�s��
-    //PM103.Visible := True;   //���˾��[�J�v��
-    //PM104.Visible := True;   //�ɮץ[�J�v��
-    //PM107.Visible := True;   //�g�Ƶ�
-    //PM109.Visible := True;   //�ˮ֦���
+    begin
+      PM102.Visible := True;   //修改案件編號
+    end;
   end;
+
+
+
 end;
 
 procedure TCB_IMGPSScanX.PopupMenu4Popup(Sender: TObject);
@@ -3217,28 +3874,52 @@
 
 procedure TCB_IMGPSScanX.PopupMenu6Popup(Sender: TObject);
 begin
-  PM601.Visible := False;  //�k��
-  PM602.Visible := False;  //�ۦ�w�q���W��
-  PM603.Visible := False;  //���y��������
-  PM604.Visible := False;  //�n���B��
-  PM605.Visible := False;  //�R��
-  if ((NowDocNo = 'Attach') or (NowDocNo = 'S_Attach')) and (FCustDocYN <> 'N') then
-    PM602.Visible := True;  //�ۦ�w�q���W��
-  //PM603.Visible := True;  //���y��������
-  PM604.Visible := True;  //�n���B��
-  PM601.Visible := True;  //�k��
-  PM605.Visible := True;  //�R��
+  PM601.Visible := True;  //歸類
+  PM602.Visible := True;  //自行定義文件名稱
+  PM603.Visible := False;  //掃描替換此頁
+  PM604.Visible := False;  //歪斜矯正
+  PM605.Visible := True;  //刪除
 
-  if CheckSelectImg_UseCase(DisplayPath,NowCaseNo) then //��ܪ��v�����i���ޥΪ�
+//  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
-    PM601.Enabled := False;  //�k��
-    PM605.Enabled := False;  //�R��
-  end
-  Else
-  begin
-    PM601.Enabled := True;  //�k��
-    PM605.Enabled := True;  //�R��
+    PM602.Visible := True;  //自行定義文件名稱
+    //PM603.Visible := True;  //掃描替換此頁
+    PM604.Visible := True;  //歪斜矯正
+    PM601.Visible := True;  //歸類
+    PM605.Visible := True;  //刪除
   end;
+
+  if  FModeName<>_Msg('異動件') 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;
+
+
 end;
 
 procedure TCB_IMGPSScanX.PrePageBtnClick(Sender: TObject);
@@ -3273,18 +3954,32 @@
 var
   SampleFormID : String;
   SendData : String;
+  buttonSelected : Integer;
 begin
   ScanMode := smSample;
   ClearView(1);
-  Vmode := 0;  //�����歶
+  Vmode := 0;  //切成單頁
   GoViewMode;
   ScanInfo.ImageCount := 0;
   ScanPath := SamplePath;
   ScanCaseno := '';
   ContextList.Clear;
-  ShowText := _Msg('�d�����y��,�еy��');
+  ShowText := _Msg('範本掃描中,請稍候');
   DataLoading(True,True);
-  SampleFormID := UpperCase(InputBox(_Msg('�d���ɱ��˿�J�e��'),_Msg('�п�J���s��'),''));
+  SampleFormID := UpperCase(InputBox(_Msg('範本檔掃瞄輸入畫面'),_Msg('請輸入文件編號'),''));
+
+  if SampleFormIDList.IndexOf(SampleFormID)<>-1 then
+  begin
+    // Show a custom dialog
+    buttonSelected := messagedlg(SampleFormID+_Msg('已有範本,是否取代?'),mtCustom,
+                                [mbYes,mbCancel], 0);
+    if buttonSelected = mrCancel then
+    begin
+      DataLoading(false,false);
+      Exit;
+    end;
+  end;
+
   if SampleFormID <> '' then
   begin
     if FormIDExists(SampleFormID,False,0) then
@@ -3293,16 +3988,17 @@
     end
     Else
     begin
-      Showmessage(Format(_Msg('FormID:%s�|�����U'),[SampleFormID]));
+      Showmessage(Format(_Msg('FormID:%s尚未註冊'),[SampleFormID]));
       Panel1.Enabled := True;
       Panel2.Enabled := True;
+      DataLoading(false,false);
       Exit;
     end;
     SampleAnchorMode := FormID2Anchor(SampleFormID);
 
     Panel1.Enabled := False;
     Panel2.Enabled := False;
-
+//ShowMessage('AAAAA');
     Try
       StatrTwainScan;
     Except
@@ -3312,58 +4008,58 @@
 
     if (ISB1.FileName <> '') and FileExists(SamplePath+SampleFormID+'.tif') then
     begin
-      ShowText := _Msg('�d���ǰe��,�еy��');
+      ShowText := _Msg('範本傳送中,請稍候');
       DataLoading(True,True);
-      //�h�s�@��jpg
+      //多存一份jpg
       ImageScrollBox1.LoadFromFile(SamplePath+SampleFormID+'.tif',1);
       BWTif2Jpg(ImageScrollBox1.Graphic);
       ImageScrollBox1.SaveToFile(SamplePath+SampleFormID+'.jpg');
-      //�h�s�@��jpg
+      //多存一份jpg
 
       NowWork_No := FormCode2WorkNo(SampleFormID);
       SendData := 'data='+FData+'&verify='+FVerify+'&work_no='+FWork_no+'&file_name='+SampleFormID+'.tif';
       if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',SamplePath+SampleFormID+'.tif',FReWrite,Memo1,False) then
       begin
-        Showmessage(_Msg('�ǰe�d���ɮ׮�,�����o�Ϳ��~!!')+_MSg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
+        Showmessage(_Msg('傳送範本檔案時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
         DataLoading(False,False);
         Exit;
       end;
       if memo1.Lines.Strings[0] = '1' then
       begin
-        Showmessage(_Msg('�ǰe�d���ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~��]:')+memo1.Lines.Strings[1]);
+        Showmessage(_Msg('傳送範本檔案時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
         DataLoading(False,False);
         Exit;
       end
       Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
       begin
-        Showmessage(_Msg('�ǰe�d���ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J'));
+        Showmessage(_Msg('傳送範本檔案時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
         DataLoading(False,False);
         Exit;
       end;
 
-      if FileExists(SamplePath+SampleFormID+'.jpg') then   //�ǰeJPG�v��
+      if FileExists(SamplePath+SampleFormID+'.jpg') then   //傳送JPG影像
       begin
         SendData := 'data='+FData+'&verify='+FVerify+'&work_no='+FWork_no+'&file_name='+SampleFormID+'.jpg';
         if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',SamplePath+SampleFormID+'.jpg',FReWrite,Memo1,False) then
         begin
-          Showmessage(_Msg('�ǰe�d���ɮ�(JPG)��,�����o�Ϳ��~!!')+_MSg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
+          Showmessage(_Msg('傳送範本檔案(JPG)時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
           DataLoading(False,False);
           Exit;
         end;
         if memo1.Lines.Strings[0] = '1' then
         begin
-          Showmessage(_Msg('�ǰe�d���ɮ�(JPG)��,�����o�Ϳ��~!!')+_Msg('���~��]:')+memo1.Lines.Strings[1]);
+          Showmessage(_Msg('傳送範本檔案(JPG)時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
           DataLoading(False,False);
           Exit;
         end
         Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
         begin
-          Showmessage(_Msg('�ǰe�d���ɮ�(JPG)��,�����o�Ϳ��~!!')+_Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J'));
+          Showmessage(_Msg('傳送範本檔案(JPG)時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
           DataLoading(False,False);
           Exit;
         end;
       end;
-      Showmessage(_Msg('�ǰe����'));
+      Showmessage(_Msg('傳送完成'));
     end;
   end;
   DataLoading(False,False);
@@ -3388,6 +4084,11 @@
 
 end;
 
+procedure TCB_IMGPSScanX.ScrollBox1MouseEnter(Sender: TObject);
+begin
+ScrollBox1.SetFocus;
+end;
+
 procedure TCB_IMGPSScanX.SelectScanBtnClick(Sender: TObject);
 begin
   Panel1.Enabled := False;
@@ -3399,6 +4100,8 @@
 
 procedure TCB_IMGPSScanX.StatusBar1DblClick(Sender: TObject);
 begin
+  Button3.Visible := not Button3.Visible;
+  Button4.Visible := not Button4.Visible;
   if (GetKeyState(VK_CONTROL) < 0) Then
   begin
     ExportBt.Visible := not ExportBt.Visible;
@@ -3459,6 +4162,36 @@
   end;
 end;
 
+procedure TCB_IMGPSScanX.AddAttFileLBClick(Sender: TObject);
+var
+  i : Integer;
+  Addfile : String;
+begin
+  OpenDialog1.Filter := 'PDF files|*.pdf';
+  OpenDialog1.Options := [ofAllowMultiSelect];
+  if OpenDialog1.Execute then
+  begin
+    ShowText :=_Msg('檔案加入中,請稍候');
+    DataLoading(True,True);
+    for i := 0 to OpenDialog1.Files.Count - 1 do
+    begin
+      AddFile := HTTPEncode(UTF8Encode(ExtractFileName(OpenDialog1.Files.Strings[i])));
+      if FileExists(ImageSavePath+NowCaseno+'\'+AddFile) then
+      begin
+        if Messagedlg(Format(_Msg('%s己存在,是否覆蓋??'),[Addfile]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel Then
+          Continue;
+        SetAttContextList('D',-1,NowCaseno,AddFile);
+      end;
+      // AttFileGB.Visible := True; //附加電子檔窗   //20120207楊玉說不在這加電子檔先拿掉
+      //   Splitter2.Visible := True;
+      CopyFile(Pchar(OpenDialog1.Files.Strings[i]),Pchar(ImageSavePath+NowCaseno+'\'+AddFile),False);
+      SetAttContextList('A',-1,NowCaseno,AddFile);
+      LoadAttFile(NowCaseno);
+    end;
+  end;
+  DataLoading(False,False);
+end;
+
 procedure TCB_IMGPSScanX.AddCredit1RGClick(Sender: TObject);
 begin
   if DisplayPath <> '' then
@@ -3478,12 +4211,12 @@
 begin
   IF not InitialOk Then
   begin
-    Showmessage(_msg('��T�|���U������,�еy�ԩέ��s�i�J'));
+    Showmessage(_Msg('資訊尚未下載完成,請稍候或重新進入'));
     Exit;
   end;
   if MyTreeNode1 = nil then
   begin
-    Showmessage(_Msg('�Х���ܮץ�'));
+    Showmessage(_Msg('請先選擇案件'));
     Exit;
   end;
   Panel1.Enabled := False;
@@ -3506,12 +4239,32 @@
   //P := ContextList.Count;
   GetCase_PageCount(CaseCount,PageCount);
   v := Pos('-',NewTreeNode.Text);
-  NewTreeNode.Text := Format(_Msg('%s-�@%d���@%d��'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
-  MytreeNode1.Text := Format(_Msg('%s-%d��'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseno)]);
+  NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
+  MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseno)]);
 
-  ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
   SetDocDirtoSelected(MyTreeNode1,FirstDocDir);
   TreeView1Click(self);
+end;
+
+procedure TCB_IMGPSScanX.AttListBoxClick(Sender: TObject);
+begin
+  DelAttFileLB.Enabled := False;
+  if AttListBox.ItemIndex >= 0 then
+    DelAttFileLB.Enabled := True;
+end;
+
+procedure TCB_IMGPSScanX.AttListBoxDblClick(Sender: TObject);
+var
+  AttFile : String;
+begin
+  if AttListBox.ItemIndex < 0 then Exit;
+
+  AttFile := HTTPEncode(UTF8Encode(AttListBox.Items.Strings[AttListBox.ItemIndex]));
+  if FileExists(DisplayPath+AttFile) then
+    ShellExecute(Application.Handle,'open',PChar(DisplayPath+AttFile),nil,nil,SW_SHOW)
+  else
+    Showmessage(Format(_Msg('找不到檔案:%s'),[AttFile]));
 end;
 
 procedure TCB_IMGPSScanX.BtnMouseEnter(Sender: TObject);
@@ -3530,42 +4283,108 @@
   //Case2upload(NowCaseNo);
   //mkdir(DisplayPath+'Test\');
   //Download2Case(DisplayPath+'Upload\',DisplayPath+'Test\');
-  //CreateFormID_FormName(DisplayPath);  //����FormID_FormName.dat
-  //CreateDocNo_DocName(DisplayPath); //����DocNo_Name.dat
-  //Showmessage(CreateDocNo_Info(DisplayPath));  //���� Docno,����,����;Docno,����,���� ���^�Ǧr��
-
+  //CreateFormID_FormName(DisplayPath);  //產生FormID_FormName.dat
+  //CreateDocNo_DocName(DisplayPath); //產生DocNo_Name.dat
+  //Showmessage(CreateDocNo_Info(DisplayPath));  //產生 Docno,份數,頁數;Docno,份數,頁數 的回傳字串
+  //lb1.Caption:='AAAAAAAAAAA';
   //Showmessage(CreateDocnoFrom_Info(NowCaseno));
   //Showmessage(self.CreateCustDocNoFrom_Info(NowCaseno));
-
-
-	showmessage('FUrl='+FUrl);
-	showmessage('FCaseID='+FCaseID);
-	showmessage('FMode='+FMode);
-	showmessage('FModeName='+FModeName);
-	showmessage('FWork_no='+FWork_no);
-	showmessage('FUserID='+FUserID);
-	showmessage('FUserName='+FUserName);
-	showmessage('FUserUnit='+FUserUnit);
-	showmessage('FData='+FData);
-	showmessage('FVerify='+FVerify);
-	showmessage('FReWrite='+FReWrite);
-	showmessage('FLanguage='+FLanguage);
-	showmessage('FLoanDoc_Value='+FLoanDoc_Value);
-	showmessage('FLoanDoc_Enable='+FLoanDoc_Enable);
-	showmessage('FUseProxy='+FUseProxy);
-	showmessage('FC_DocNoList='+FC_DocNoList);
-	showmessage('FC_DocNameList='+FC_DocNameList);
-	showmessage('FFixFileList='+FFixFileList);
-	showmessage('FIs_In_Wh='+FIs_In_Wh);
-	showmessage('FOldCaseInfo='+FOldCaseInfo);
-	showmessage('FPrintyn='+FPrintyn);
-	showmessage('FIs_OldCase='+FIs_OldCase);
-	showmessage('FCustDocYN='+FCustDocYN);
+  //ShowMessage('FMaxUploadSize='+FMaxUploadSize);
+        //initkscan;
+	showmessage('FUrl='+FUrl+#10#13+
+	'FCaseID='+FCaseID+#10#13+
+	'FMode='+FMode+#10#13+
+	'FModeName='+FModeName+#10#13+
+	'FWork_no='+FWork_no+#10#13+
+	'FUserID='+FUserID+#10#13+
+	'FUserName='+FUserName+#10#13+
+	'FUserUnit='+FUserUnit+#10#13+
+	'FData='+FData+#10#13+
+	'FVerify='+FVerify+#10#13+
+	'FReWrite='+FReWrite+#10#13+
+	'FLanguage='+FLanguage+#10#13+
+	'FLoanDoc_Value='+FLoanDoc_Value+#10#13+
+	'FLoanDoc_Enable='+FLoanDoc_Enable+#10#13+
+	'FUseProxy='+FUseProxy+#10#13+
+	'FC_DocNoList='+FC_DocNoList+#10#13+
+	'FC_DocNameList='+FC_DocNameList+#10#13+
+	'FFixFileList='+FFixFileList+#10#13+
+	'FIs_In_Wh='+FIs_In_Wh+#10#13+
+	'FOldCaseInfo='+FOldCaseInfo+#10#13+
+	'FPrintyn='+FPrintyn+#10#13+
+	'FIs_OldCase='+FIs_OldCase+#10#13+
+	'FCustDocYN='+FCustDocYN);
+  ShowMessage('FImgDPI='+IntToStr(FImgDPI)+#10#13+
+    'FScanColor='+    IntToStr(FScanColor)+#10#13+
+    'FFileSizeLimit='+  IntToStr(FFileSizeLimit)  +#10#13+
+    'FCaseNoLength='+ IntToStr(FCaseNoLength)   +#10#13+
+    'FImgDelete='+    FImgDelete+#10#13+
+    'FIsExternal='+    FIsExternal+#10#13+
+    'FWH_category='+FWH_category+
+    'FCheck_main_form='+    FCheck_main_form+#10#13+
+    'FMaxUploadSize='+FMaxUploadSize);
+    //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+
+    'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y));
+  }
 end;
 
 procedure TCB_IMGPSScanX.Button4Click(Sender: TObject);
+var
+  i:integer;
+  str:String;
 begin
-  Showmessage(self.Doc_Inf_List.Text);
+  //Showmessage(self.Doc_Inf_List.Text);
+  //LoadImgFile;
+  //LoadImgFile1;
+  //ISB1.MouseMode:=mmAmplifier;
+
+  str:='';
+  for I := 1 to 11 do // 看 OMRErrInfo 的內容
+  begin
+  str:=str+BoolToStr(OMRErrInfo[i].Display,true)+','
+          +BoolToStr(OMRErrInfo[i].Ignore,true)+','+OMRErrInfo[i].Info+','
+          +OMRErrInfo[i].Mode+#10#13;
+  end;
+  ShowMessage('OMRErrInfo='+str);
+  ShowMessage('Doc_Inf_List='+Doc_Inf_List.Text);
+  ShowMessage('DM_FORM_INF_List='+DM_FORM_INF_List.Text) ;
+  ShowMessage('FORM_INF_List='+FORM_INF_List.Text)       ;
+  ShowMessage('CHECK_RULE_INF_List='+CHECK_RULE_INF_List.Text)  ;
+  ShowMessage('MEMO_INF_List='+MEMO_INF_List.Text)         ;
+  ShowMessage('WORK_INF_List='+WORK_INF_List.Text)          ;
+  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');
+//  SampleFormIDList.Add('31A00101031706A');
+end;
+
+procedure TCB_IMGPSScanX.Button5Click(Sender: TObject);
+begin
+  GetftpInfo(NowCaseno,'upload');
+  SetFtpInfo;
+  IIS_Ftp.FtpsConnect;
+
+  IIS_Ftp.FtpsToMain(FFtpExtraPath,NowCaseno+'.pdf','d:\1.pdf',display1);
+end;
+
+procedure TCB_IMGPSScanX.Button6Click(Sender: TObject);
+begin
+  GetftpInfo(NowCaseno,'download');
+  SetFtpInfo;
+  IIS_Ftp.FtpsConnect;
+  IIS_Ftp.FtpsCWD(IIS_Ftp.FtpPath);
+  IIS_Ftp.FtpsReceive(NowCaseNo+'.zip','d:\'+NowCaseNo+'.zip');
+
+
 end;
 
 procedure TCB_IMGPSScanX.StatrTwainScan;
@@ -3574,7 +4393,7 @@
 begin
   if not Scanner.IsConfigured then
   begin
-    ShowMessage(_Msg('TWAIN �����X�ʩ|���w��'));
+    ShowMessage(_Msg('TWAIN 掃瞄驅動尚未安裝'));
     Exit;
   end;
   FillChar(ScanInfo, SizeOf(ScanInfo), 0);
@@ -3582,7 +4401,8 @@
   ScanInfo.ImageCount := 0;
   ScanInfo.Graphic := TTiffGraphic.Create;
   try
-    ISB := nil; //�W�s
+    ISB := nil; //規零
+//ShowMessage(IntToStr(ScanDpi));
     Scanner.RequestedXDpi := ScanDpi;
     Scanner.RequestedYDpi := ScanDpi;
     Scanner.RequestedImageFormat := ScanColor;
@@ -3590,15 +4410,19 @@
 
     Try
       Scanner.OpenSource;
-      Scanner.Duplex := ScanDuplex; //����
-      //Scanner.FEEDERENABLED  := not ScanFlatCB.Checked;     // ���������x
+      Scanner.Duplex := ScanDuplex; //雙面
+
+      if FMode='SAMPLESCAN' then
+        Scanner.Duplex:=False;
+
+      //Scanner.FEEDERENABLED  := not ScanFlatCB.Checked;     // 先拿掉平台
       If ScanImgSetUse Then
       begin
         Scanner.ScanBrightness := ScanBright;
         Scanner.ScanContrast := ScanContrast;
       end;
     except
-      Showmessage(_Msg('���˾��o�Ϳ��~!!'));
+      Showmessage(_Msg('掃瞄器發生錯誤!!'));
       Scanner.CloseSource;
       Exit;
     end;
@@ -3672,18 +4496,18 @@
         If (MpsBarcodeinf.r180[i] <> 0) and (Length(MpsBarcodeinf.Text[i])=FormIDLength) Then
         begin
           Rotate(pScanInfo^.Graphic,MpsBarcodeinf.r180[i]);
-          MpsGetBarcode(pScanInfo^.Graphic,MpsBarcodeinf);  //�����A�����@�����X��T
+          MpsGetBarcode(pScanInfo^.Graphic,MpsBarcodeinf);  //旋轉後再重取一次條碼資訊
           Break;
         end;
       end;
 
-      //�v���ϦV
+      //影像反向
       IF ScannerReverse then
         NegativeImg(pScanInfo^.Graphic);
-      //�ɱ��B��
+      //傾斜矯正
       IF ScanDeskew Then
         DeskewImg(pScanInfo^.Graphic);
-      //�M����
+      //清黑邊
       IF BoardClear then
         CleanupBorder(pScanInfo^.Graphic);
     end
@@ -3698,19 +4522,19 @@
           If (MpsBarcodeinf.r180[i] <> 0) and (Length(MpsBarcodeinf.Text[i])=FormIDLength) Then
           begin
             Rotate(ISB_BW.Graphic,MpsBarcodeinf.r180[i]);
-            MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);  //�����A�����@�����X��T
+            MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);  //旋轉後再重取一次條碼資訊
             Break;
           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
@@ -3723,12 +4547,18 @@
         If (MpsBarcodeinf.r180[i] <> 0) and (Length(MpsBarcodeinf.Text[i])=FormIDLength) Then
         begin
           Rotate(ISB_BW.Graphic,MpsBarcodeinf.r180[i]);
-          MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);  //�����A�����@�����X��T
+          MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);  //旋轉後再重取一次條碼資訊
           Break;
         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
@@ -3746,13 +4576,13 @@
     //Application.ProcessMessages;
     if CheckNeedCrop(iGraphic_First) Then
     begin
-      iRect.Left := pScanInfo^.Graphic.Width div 2;    //�������䪺�v��
+      iRect.Left := pScanInfo^.Graphic.Width div 2;    //先取左邊的影像
       iRect.Top := 0;
       iRect.Right := pScanInfo^.Graphic.Width;
       iRect.Bottom := pScanInfo^.Graphic.Height;
       CropImg(iGraphic_First,iRect);
 
-      iGraphic_Sec.Assign(pScanInfo^.Graphic);         //�A���k�䪺�v��
+      iGraphic_Sec.Assign(pScanInfo^.Graphic);         //再取右邊的影像
       iRect.Left := 0;
       iRect.Top := 0;
       iRect.Right := pScanInfo^.Graphic.Width div 2;
@@ -3761,6 +4591,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;
@@ -3770,6 +4613,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
@@ -3794,7 +4656,7 @@
             JpgGr := TJpegGraphic.Create;
             try
               JpgGr.Assign(iGraphic);
-              JpgGr.SaveQuality := 30;
+              JpgGr.SaveQuality := FJpgCompression;
               //JpgGr.AppendToStream(SaveStream);
               JpgGr.SaveToFile(PEFileName);
             finally
@@ -3827,21 +4689,21 @@
   case ScanMode of
     smNew:
       begin
-        if ScanImgShowMode = 0 then  //�M�����
+        if ScanImgShowMode = 0 then  //清楚顯示
         begin
           ISB := FindISB2View(VMode);
           ISB.AntiAliased := True;
           ISB.ZoomMode := zmFittopage;
           ISB.LoadFromFile(PEFileName,1);
         end
-        Else if ScanImgShowMode = 1 then  //�ҽk���
+        Else if ScanImgShowMode = 1 then  //模糊顯示
         begin
           ISB := FindISB2View(VMode);
           ISB.AntiAliased := False;
           ISB.ZoomMode := zmFittopage;
           ISB.LoadFromFile(PEFileName,1);
         end
-        Else if ScanImgShowMode = 1 then  //�����
+        Else if ScanImgShowMode = 1 then  //不顯示
         begin
 
         end
@@ -3884,31 +4746,44 @@
         FormID:='';
         FormVersion:='';
         PEFileName := '';
-        //if not FindNoSaveBarCode then   //�S�����x�s�v�������X
+        //if not FindNoSaveBarCode then   //沒有不儲存影像的條碼
         //begin
           if FormID = '' then
           begin
-            FormID := BarCode2FormID; //���XFormID
-
+            FormID := BarCode2FormID; //取出FormID
           end;
-          if (FormID <> '') and ISGuideFormID(FormID) then
-            NowGuideFormID := FormID;
 
+          if (FormID <> '') and ISDivPageFormID(FormID) then
+          begin
+            NowDivPageFormID := FormID;
+          end;
+
+          if (FormID <> '') and ISGuideFormID(FormID) then
+          begin
+            NowGuideFormID := FormID;
+          end;
+//ShowMessage('NowGuideFormID='+NowGuideFormID);
           if (not (FindDivFormCode(FormID))) and (NowGuideFormID <> '') {and (FormID = '')} then
             FormID := NowGuideFormID;
           DocNo := FormCode2DocNo(FormID);
-
-          if (FormID <>'') and FindDivFormCode(FormID) Then  //�u����׭��W���ץ���X
+//ShowMessage('FormID='+FormID);
+//ShowMessage('ISDivPageFormID(FormID)='+BoolToStr(ISDivPageFormID(FormID),true));
+//ShowMessage('FindDivFormCode(FormID)='+BoolToStr(FindDivFormCode(FormID),true));
+//ShowMessage('A NowDivPageFormID='+NowDivPageFormID+#10#13+'FormID='+FormID+#10#13+'ScanCaseno='+ScanCaseno);
+          if (FormID <>'') and FindDivFormCode(FormID) and (NowDivPageFormID <> '')  Then  //只找分案頁上的案件條碼
           begin
+
             ScanInfo.ImageCount := 0;
             ClearView(1);
             ContextList.Clear;
             Context_DocnoList.Clear;
-            ClearCaseIndex;                //�M���ץ����
-            ScanCaseno := BarCode2CaseID; //���X�ץ�s��
+            ClearCaseIndex;                //清掉案件索引
+            ScanCaseno := BarCode2CaseID; //取出案件編號
             NowGuideFormID := '';
+            NowDivPageFormID :='';
+//ShowMessage('B NowGuideFormID='+NowGuideFormID+#10#13+'FormID='+FormID+#10#13+'ScanCaseno='+ScanCaseno);
           end;
-          if ScanCaseno = '' then //�@�}�l���S���
+          if ScanCaseno = '' then //一開始都沒找到
           begin
             ScanCaseno := GetNoNameCase(ImageSavePath);
           end;
@@ -3926,7 +4801,10 @@
           Str2Dir(ScanPath);
 
           ScanDocDir := FindLastestDocDir(ScanCaseno,DocNo);
-          if DocNoNeedDiv(DocNo) then   //�n������
+//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);
             if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(ScanCaseno,ScanDocDir)>0))  or (ScanDocDir = '') then
@@ -3935,11 +4813,11 @@
               ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
             end;
           end
-          Else        //��������
+          Else        //不分份數
           begin
             if DocNo <> '' then
               ScanDocDir := DocNo
-            else      //Attach ����
+            else      //Attach 附件
               ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
           end;
           //ScanDocDir := GetDocNoDir(ImageSavePath+ScanCaseno+'\',DocNo);
@@ -3959,17 +4837,17 @@
           ScanSaveFilename := FormID;
 
           Str2Dir(ScanPath);
-          if ScanSaveFilename = '' then //����
+          if ScanSaveFilename = '' then //附件
             ScanSaveFilename:= Add_Zoo(GetDocDir_Page(ScanCaseNo,ScanDocDir)+1,3)+ext
             //ScanSaveFilename:= Add_Zoo(ScanInfo.ImageCount+1,3)+ext
           Else
             ScanSaveFilename := Add_Zoo(GetDocDir_Page(ScanCaseNo,ScanDocDir)+1,3)+'_'+ScanSaveFilename+ext;
-          if not FindNoSaveBarCode then   //�S�����x�s�v�������X
+          if not FindNoSaveBarCode then   //沒有不儲存影像的條碼
           begin
             if ScanInfo.ImageCount = 0 then
             begin
               SetCaseList('A',-1,ScanCaseno);
-              WriteCaseIndex(ImageSavePath + ScanCaseno+'\');  //�g�J�ץ����
+              WriteCaseIndex(ImageSavePath + ScanCaseno+'\');  //寫入案件索引
               MyTreeNode1 := TreeView1.Items.AddChild(NewTreenode,ScanCaseno);
               MyTreenode1.ImageIndex := 2;
               MyTreenode1.SelectedIndex := 2;
@@ -3994,27 +4872,35 @@
     smInsert:
       begin
         ScanSaveFilename := '';
-        FormID := BarCode2FormID; //���XFormID
-        if (FormID <> '') and ISGuideFormID(FormID) then
+        FormID := BarCode2FormID; //取出FormID
+        if (FormID <> '') and ISGuideFormID(FormID) then   //20170510 註解 因為DSCAN 會全擠在導引頁下
           NowGuideFormID := FormID;
-        //Showmessage('A:'+FormID+#13+'B:'+NowGuideFormID);
-        if (NowGuideFormID <> '') {and (FormID = '')} then
+        if (NowGuideFormID <> '') {and (FormID = '')} then  //20170510 註解  因為DSCAN 會全擠在導引頁下
           FormID := NowGuideFormID;
         DocNo := FormCode2DocNo(FormID);
         ScanDocDir := FindLastestDocDir(ScanCaseno,DocNo);
-        if DocNoNeedDiv(DocNo) then   //�n������
+
+        if (FMode='ESCAN') and (FModeName=_Msg('補件掃描')) then    //20180207 加入的特殊邏輯
         begin
-          if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(ScanCaseno,ScanDocDir)>0)) or (ScanDocDir = '') then
+          ScanDocDir := FindLastestDocDirForPage(ScanCaseno, DocNo,FormID);
+        end;
+
+        if (DocNoNeedDiv(DocNo)) then   //要分份數
+        begin
+          if TreeView1.Selected = MyTreeNode1 then   //20170421 掃瞄插頁時選則在案號上才要分份數 選在FormID上就不分份數
           begin
-            ScanInfo.ImageCount := 0;
-            ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
+            if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(ScanCaseno,ScanDocDir)>0)) or (ScanDocDir = '') then
+            begin
+              ScanInfo.ImageCount := 0;
+              ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
+            end;
           end;
         end
-        Else        //��������
+        Else        //不分份數
         begin
           if DocNo <> '' then
             ScanDocDir := DocNo
-          else      //Attach ����
+          else      //Attach 附件
             ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
         end;
         if FirstDocDir = '' Then
@@ -4027,7 +4913,7 @@
 
         ScanSaveFilename := FormID;
         Str2Dir(ScanPath);
-        if ScanSaveFilename = '' then //����
+        if ScanSaveFilename = '' then //附件
           ScanSaveFilename:= Add_Zoo(GetDocDir_Page(ScanCaseno,ScanDocdir)+1,3)+ext
         Else
           ScanSaveFilename := Add_Zoo(GetDocDir_Page(ScanCaseno,ScanDocdir)+1,3)+'_'+ScanSaveFilename+ext;
@@ -4049,7 +4935,7 @@
           begin
             BarStr := BarStr + MpsBarCodeinf.Text[i];
           end;
-          Showmessage(_Msg('���Ѩ쪺BarCode:')+#13+BarStr);
+          Showmessage(_Msg('辨識到的BarCode:')+#13+BarStr);
         end;
       end;
     smRTS:
@@ -4074,7 +4960,7 @@
   IIS_File2Web.S_LicEnName := SFileName;
   IIS_File2Web.V_LicEnName := VFileName;
 
-  /////�U��MPSLIC_SCAN.lic //////
+  /////下載MPSLIC_SCAN.lic //////
   EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
 
 
@@ -4083,24 +4969,24 @@
   SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_SCAN.lic';
   if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+SFileName,FReWrite,Memo1,False,DownImgStatus) then
   begin
-    Showmessage(_Msg('�ˬd���U�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
+    Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
     Exit;
   end;
-  /////�U��MPSLIC_SCAN.lic /////
+  /////下載MPSLIC_SCAN.lic /////
 
-  /////�U��MPSLIC_VIEW.lic //////
+  /////下載MPSLIC_VIEW.lic //////
   EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
-  //SendData := 'checktime='+EnCodeDateTime+'&workno=CW&formid=MPSLIC_VIEW.lic'+'&mode=sample';  //�o�̧令����CW 20121212
+  //SendData := 'checktime='+EnCodeDateTime+'&workno=CW&formid=MPSLIC_VIEW.lic'+'&mode=sample';  //這裡改成必傳CW 20121212
   //if not dnFile(HTTPSClient,Furl,'service/slic/SLIC04/sample',SendData,LngPath+VFileName,FReWrite,Memo1,False,DownImgStatus) then
   SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_VIEW.lic';
   if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+VFileName,FReWrite,Memo1,False,DownImgStatus) then
   begin
-    Showmessage(_Msg('�ˬd���U�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
+    Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
     Exit;
   end;
-  /////�U��MPSLIC_VIEW.lic /////
+  /////下載MPSLIC_VIEW.lic /////
 
-  ////��zip/////
+  ////壓zip/////
   S := TStringlist.Create;
   try
     S.Add(En_DecryptionStr_Base64('E',GetDate,'9338430'));
@@ -4121,8 +5007,8 @@
   DeleteFile(LngPath+VFileName);
   DeleteFile(LngPath+'mps.dat');
   end;
-  ////��zip//////
-  Showmessage('�ץX����,�ץX�ɮ�:'+LngPath+'mps.zip');
+  ////壓zip//////
+  Showmessage(_Msg('匯出完成,匯出檔案:')+LngPath+'mps.zip');
 end;
 
 procedure TCB_IMGPSScanX.ImportBtClick(Sender: TObject);
@@ -4149,16 +5035,16 @@
 
       str2dir(ZipPath);
       if not ExecuteUnZip_Pwd(OpenDialog1.FileName,ZipPath,False,'9338430') then
-        Showmessage('�L�k�����Y');
+        Showmessage(_Msg('無法解壓縮'));
       if not FileExists(ZipPath+'mps.dat') then
       begin
-        Showmessage('�榡����,�L�k�פJ');
+        Showmessage(_Msg('格式不符,無法匯入'));
         Exit;
       end;
       S.LoadFromFile(ZipPath+'mps.dat');
       if (En_DecryptionStr_Base64('D',S.Strings[0],'9338430')<> ServerDate) then
       begin
-        Showmessage('�ɮ׹L��,�L�k�פJ');
+        Showmessage(_Msg('檔案過期,無法匯入'));
         Exit;
       end;
 
@@ -4168,29 +5054,29 @@
         RenameFile(ZipPath+S.Strings[i],ZipPath+LicName);
         if (LicName = 'MPSLIC_SCAN.lic') or (LicName = 'MPSLIC_VIEW.lic') then
 
-        /////�W��MPSLICXXXX.lic ////
+        /////上傳MPSLICXXXX.lic ////
         //if not upFile(HTTPSClient,FUrl,'servlet/CWC04','formid='+LicName+'@workno=CW@mode=sample','file',ZipPath+LicName,FReWrite,Memo1,False) then
         //begin
         SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file_name='+LicName;
         if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',ZipPath+LicName,FReWrite,Memo1,False) then
         begin
-          Showmessage(_Msg('�ˬd���U��,�����o�Ϳ��~!!')+_MSg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
+          Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
           DataLoading(False,False);
           Exit;
         end;
         if memo1.Lines.Strings[0] = '1' then
         begin
-          Showmessage(_Msg('�ˬd���U��,�����o�Ϳ��~!!')+_Msg('���~��]:')+memo1.Lines.Strings[1]);
+          Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
           DataLoading(False,False);
           Exit;
         end
         Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
         begin
-          Showmessage(_Msg('�ˬd���U��,�����o�Ϳ��~!!')+_Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J'));
+          Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
           DataLoading(False,False);
           Exit;
         end;
-        /////�W��MPSLICXXXX.lic /////
+        /////上傳MPSLICXXXX.lic /////
       end;
     end;
   Finally
@@ -4198,7 +5084,7 @@
   S.Free;
   _DelTree(ZipPath);
   end;
-  Showmessage('�פJ����');
+  Showmessage(_Msg('匯入完成'));
 end;
 
 procedure TCB_IMGPSScanX.HotKeyDown (var Msg : TMessage);
@@ -4219,7 +5105,7 @@
     NowForm := TForm(Sender);
 
   FormName := NowForm.Name;
-  IISUnit.IIS_LngfileName := LngPath+'Language.Lng';  //��IISUnit ��h��y���r���
+  IISUnit.IIS_LngfileName := LngPath+'Language.Lng';  //給IISUnit 轉多國語言字串用
   if FLanguage = '' then
     FLanguage := 'zh_tw';
   IISUnit.IIS_NowLng := FLanguage;
@@ -4229,6 +5115,7 @@
       TForm(NowForm).Caption := ini.ReadString(FLanguage,FormName+'.FormTitle','');
     for i := 0 to NowForm.ComponentCount - 1 do
     begin
+//ShowMessage(NowForm.Components[i].Name);
       if NowForm.Components[i] is TButton then
       begin
         TButton(NowForm.Components[i]).Caption := ini.ReadString(FLanguage,FormName+'.'+TButton(NowForm.Components[i]).Name,'');
@@ -4290,21 +5177,39 @@
   W,H : Integer;
 begin
   Result := 0;
+//ShowMessage('GetSiteOMR');
+
   IF (ImageScrollBox1.FileName <> FileName) and (FileName <> '') then
   begin
+//ShowMessage('11111'+ImageScrollBox1.FileName+#10#13+FileName);
     ImageScrollBox1.LoadFromFile(FileName,1);
+{
+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+
+'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y));
     FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,'');
+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+
+'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y));
+}
     ClearLine(ISB_BW.Graphic,bt);
     ISB_BW.Redraw(True);
     Application.ProcessMessages;
   end;
   If ImageScrollBox1.FileName <> '' Then
   begin
+
+//ShowMessage('22222'+ImageScrollBox1.FileName);
     Xdpi := ImagescrollBox1.Graphic.XDotsPerInch;
     Ydpi := ImagescrollBox1.Graphic.YDotsPerInch;
     H := ImageScrollBox1.Graphic.Height;
     W := ImageScrollBox1.Graphic.Width;
+//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);
+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
@@ -4315,10 +5220,12 @@
       OMRRect.Bottom := ImageScrollBox1.Graphic.Height;
 
     result := Get_OMR(ISB_BW.Graphic,OMRRect);
+//ShowMessage('result='+IntToStr(result));
+
   end;
 end;
 
-Function TCB_IMGPSScanX.FindISB2View(Vmode:Integer):TImageScrollBox; //���ISB�����
+Function TCB_IMGPSScanX.FindISB2View(Vmode:Integer):TImageScrollBox; //找空的ISB來顯示
 var
   i,n : Integer;
   ISB : TImageScrollBox;
@@ -4344,7 +5251,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'��;'W'�g�J
+Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'讀取;'W'寫入
 var
   ini : Tinifile;
 begin
@@ -4356,28 +5263,28 @@
           DeviceDeleteSize := ini.ReadInteger('DeviceDelete','Size_New',Def_DeviceDeleteSize);
           ScannerReverse := ini.ReadBool('Scanner','Reverse',Def_ScannerReverse);
           BoardClear := ini.ReadBool('Scanner','BoardClear',Def_BoardClear);
-          ScanDpi := ini.ReadInteger('Scanner','Dpi',Def_ScanDpi);
+          //ScanDpi := ini.ReadInteger('Scanner','Dpi',Def_ScanDpi);
           //ScanDuplex := ini.ReadBool('Scanner','Duplex',Def_ScanDuplex);
           ScanRotate := ini.ReadInteger('Scanner','ScanRotate',Def_ScanRotate);
           ScanDeskew := ini.ReadBool('Scanner','ScanDeskew',Def_ScanDeskew);
           ScanBright := ini.ReadInteger('Scanner','ScanBright',Def_ScanBright);
           ScanContrast := ini.ReadInteger('Scanner','ScanContrast',Def_ScanContrast);
           ScanImgShowMode := ini.ReadInteger('Scanner','ScanImgShowMode',Def_ScanImgShowMode);
-          ScanImgSetUse := ini.ReadBool('Scanner','ScanImgSetUse',Def_ScanImgSetUse);  //20101110 BA�����˾��t�Ӧ��ճ]�w�n�s�W���ﶵ�O�_�Ұ�
+          ScanImgSetUse := ini.ReadBool('Scanner','ScanImgSetUse',Def_ScanImgSetUse);  //20101110 BA說掃瞄器廠商有調設定要新增此選項是否啟動
         end;
     'W':begin
           ini.WriteBool('DeviceDelete','Mode',DeviceDelete);
           ini.WriteInteger('DeviceDelete','Size_New',DeviceDeleteSize);
           ini.WriteBool('Scanner','Reverse',ScannerReverse);
           ini.WriteBool('Scanner','BoardClear',BoardClear);
-          ini.ReadInteger('Scanner','Dpi',ScanDpi);
+          //ini.ReadInteger('Scanner','Dpi',ScanDpi);
           //ini.WriteBool('Scanner','Duplex',ScanDuplex);
           ini.WriteInteger('Scanner','ScanRotate',ScanRotate);
           ini.WriteBool('Scanner','ScanDeskew',ScanDeskew);
           ini.WriteInteger('Scanner','ScanBright',ScanBright);
           ini.WriteInteger('Scanner','ScanContrast',ScanContrast);
           ini.WriteInteger('Scanner','ScanImgShowMode',ScanImgShowMode);
-          ini.WriteBool('Scanner','ScanImgSetUse',ScanImgSetUse);  //20101110 BA�����˾��t�Ӧ��ճ]�w�n�s�W���ﶵ�O�_�Ұ�
+          ini.WriteBool('Scanner','ScanImgSetUse',ScanImgSetUse);  //20101110 BA說掃瞄器廠商有調設定要新增此選項是否啟動
         end;
     end;
 
@@ -4386,17 +5293,17 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.GetDefScanIni; //���o���˪��w�]��
+Procedure TCB_IMGPSScanX.GetDefScanIni; //取得掃瞄的預設值
 var
   i : Integer;
   PARA_NO,PARA_CONTENT: String;
 begin
   Def_DeviceDelete := True;
-  Def_DeviceDeleteSize := 3072;  //20120821 �令3000(�X�{)
+  Def_DeviceDeleteSize := 3072;  //20120821 改成3000(出現)
   Def_ScannerReverse := False;
   Def_BoardClear := False;
   Def_ScanDpi := 300;
-  Def_ScanDuplex := False;
+  Def_ScanDuplex := True;
   Def_ScanRotate := 0;
   Def_ScanDeskew := False;
   Def_ScanImgSetUse := False;
@@ -4406,7 +5313,7 @@
 
   for i := 0 to WORK_INF_List.Count - 1 do
   begin
-    IF GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BLANKDEL_USE' Then   //�ťխ��Ұ�
+    IF GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BLANKDEL_USE' Then   //空白頁啟動
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if UpperCase(PARA_CONTENT) ='Y'  then
@@ -4414,7 +5321,7 @@
       Else
         Def_DeviceDelete := False;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BLANKDEL_SIZE' Then  //�ťխ�Size
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BLANKDEL_SIZE' Then  //空白頁Size
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if PARA_CONTENT = ''  then
@@ -4423,7 +5330,7 @@
         Def_DeviceDeleteSize := Strtoint(PARA_CONTENT);
 
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_REVERSE' Then  //�O�_�ݤϬ�
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_REVERSE' Then  //是否需反相
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if UpperCase(PARA_CONTENT) ='Y'  then
@@ -4431,7 +5338,7 @@
       Else
         Def_ScannerReverse := False;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BOARDCLEAR' Then  //�O�_�M����
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BOARDCLEAR' Then  //是否清黑邊
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if UpperCase(PARA_CONTENT) ='Y'  then
@@ -4439,7 +5346,7 @@
       Else
         Def_BoardClear := False;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_DPI' Then  //����DPI
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_DPI' Then  //掃瞄DPI
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if PARA_CONTENT = ''  then
@@ -4447,7 +5354,7 @@
       else
         Def_ScanDpi := Strtoint(PARA_CONTENT);
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_DUPLEX' Then  //�O�_��������
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_DUPLEX' Then  //是否雙面掃瞄
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if UpperCase(PARA_CONTENT) ='Y'  then
@@ -4456,7 +5363,7 @@
         Def_ScanDuplex := False;
 
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_ROTATE_MODE' Then //���ˮɱ��ਤ��
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_ROTATE_MODE' Then //掃瞄時旋轉角度
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if PARA_CONTENT = '0' then
@@ -4470,7 +5377,7 @@
       Else
         Def_ScanRotate := 0;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_DESKEW' Then //�O�_�ɱ��B��
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_DESKEW' Then //是否傾斜矯正
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if UpperCase(PARA_CONTENT) ='Y'  then
@@ -4478,7 +5385,7 @@
       Else
         Def_ScanDeskew := False;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_IMGSET_USE' Then  //�O�_�ϥΫG�׹��]�w
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_IMGSET_USE' Then  //是否使用亮度對比設定
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if UpperCase(PARA_CONTENT) ='Y'  then
@@ -4486,7 +5393,7 @@
       else
         Def_ScanImgSetUse := False;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BRIGHT' Then //�G��
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_BRIGHT' Then //亮度
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if PARA_CONTENT =''  then
@@ -4497,7 +5404,7 @@
         Def_ScanBright := 0;
 
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_CONTRAST' Then //���
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_CONTRAST' Then //對比
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       if PARA_CONTENT =''  then
@@ -4519,30 +5426,45 @@
       Else
         Def_ScanImgShowMode := 0;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'CASE_IN_TIME' Then     //���i��I��ɶ�
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'CASE_IN_TIME' Then     //取進件截止時間
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       ScanDenialTime := PARA_CONTENT;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_HINT' Then     //���y���ܦr��
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_HINT' Then     //掃描提示字串
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       ScanDenialHint := PARA_CONTENT;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'NO_SAVE_FORM_ID' Then     //���y���s�ɤ����N��
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'NO_SAVE_FORM_ID' Then     //掃描不存檔之表單代號
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       NoSaveBarCodeList.CommaText := PARA_CONTENT;
     end
-    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'LOCAL_PATH' Then     //�����ݸ��|
+    Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'LOCAL_PATH' Then     //本機端路徑
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       ImagePath:= PARA_CONTENT;
     end
-    Else if UpperCase(GetSQLData(WORK_INF_List,'PARA_NO',i)) = 'GUIDEFORMID' Then     //��ɤޭ������
+    Else if UpperCase(GetSQLData(WORK_INF_List,'PARA_NO',i)) = 'GUIDEFORMID' Then     //當導引頁的表單
     begin
       PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
       GuideFormIDList.CommaText := PARA_CONTENT;
+    end
+    Else if UpperCase(GetSQLData(WORK_INF_List,'PARA_NO',i)) = 'DIVPAGEFORMID' Then     //當分案頁的表單
+    begin
+      PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
+      DivPageFormIDList.CommaText := PARA_CONTENT;
+    end
+    Else if UpperCase(GetSQLData(WORK_INF_List,'PARA_NO',i)) = 'FILE_COMPRESSION' Then     //20171211 jpg to tif 壓縮比
+    begin
+      PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
+      FJpgCompression := StrToInt(PARA_CONTENT);
+    end
+    Else if UpperCase(GetSQLData(WORK_INF_List,'PARA_NO',i)) = 'MAX_UPLOAD_SIZE' Then     //取得 上傳大小的限制(MB)
+    begin
+      PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
+      FMaxUploadSize := PARA_CONTENT;
     end;
   end;
   ScanDuplex := Def_ScanDuplex;
@@ -4552,6 +5474,12 @@
   X509Certificate: TElX509Certificate; var Validate: Boolean);
 begin
   Validate := True;
+end;
+
+procedure TCB_IMGPSScanX.HTTPSClientRedirection(Sender: TObject;
+  const OldURL: string; var NewURL: string; var AllowRedirection: Boolean);
+begin
+  AllowRedirection := True;
 end;
 
 procedure TCB_IMGPSScanX.EnableImage(v:integer;Sender : TObject);
@@ -4594,6 +5522,7 @@
   Md : TMouseMode;
   ISB : TImageScrollBox;
 begin
+//ShowMessage(IntToStr(v));
   case v of
    -1 : Md := TMouseMode(mmUser);
     0 : Md := TMouseMode(mmAmplifier);
@@ -4608,6 +5537,7 @@
   begin
     ISB := TImageScrollBox(FindComponent('ISB'+inttostr(i)));
     ISB.MouseMode := TMouseMode(Md);
+    //Label3.Caption:='v='+IntToStr(v)+'  time'+FormatDateTime('yyyy/mm/dd HH:MM:SS', now);
   end;
 end;
 
@@ -4672,13 +5602,13 @@
   Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/servertimeforocx','',FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4687,19 +5617,52 @@
     ServerDate := memo1.Lines.Strings[1];
     ServerTime := Copy(ServerDate,9,6);
     ServerDate := Copy(ServerDate,1,8);
-    Balance := GetBalance(ServerTime); //Server ��Local���ɶ��t
+    Balance := GetBalance(ServerTime); //Server 跟Local的時間差
     Result := True;
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 
 end;
 
-Function TCB_IMGPSScanX.GetSetInf1 : Boolean; //���t�γ]�w��TMode1 DOC_INF
+Function TCB_IMGPSScanX.GetSampleInf : Boolean;
+var
+  str:String;
+begin
+  Result := False;
+  If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/serversampleforocx','work_no='+FWork_no,FReWrite,Memo1,False) Then
+  begin
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    Result := False;
+    Exit;
+  end;
+  IF memo1.Lines.Strings[0] = '1' Then
+  begin
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
+    Result := False;
+    Exit;
+  end
+  Else IF memo1.Lines.Strings[0] = '0' Then
+  begin
+    str := memo1.Lines.Strings[1];
+    SampleFormIDList.CommaText:=str;
+    
+    Result := True;
+  end
+  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
+  begin
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
+    Result := False;
+    Exit;
+  end;
+
+end;
+
+Function TCB_IMGPSScanX.GetSetInf1 : Boolean; //取系統設定資訊Mode1 DOC_INF
 Var
   ColumeStr : String;
   S : TStringlist;
@@ -4709,19 +5672,20 @@
 
   Result := False;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
   EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
+
   ColumeStr := 'WORK_NO,DOC_NO,DOC_U_DESC,DOC_TYPE,DOC_VERSION,FORM_PAGES,START_DATE,STOP_DATE,IS_DOC_DIV,IS_IN_WH';
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=1&col='+Doc_Inf_Colume+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
 
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=1&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
 
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4735,13 +5699,13 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Function TCB_IMGPSScanX.GetSetInf2 : Boolean; //���t�γ]�w��TMode2  DM_FORM_INF
+Function TCB_IMGPSScanX.GetSetInf2 : Boolean; //取系統設定資訊Mode2  DM_FORM_INF
 var
   ColumeStr : String;
   S : TStringlist;
@@ -4754,13 +5718,13 @@
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=2&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
    If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=2&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4774,13 +5738,13 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Function TCB_IMGPSScanX.GetSetInf3 : Boolean; //���t�γ]�w��Tmode3  FORM_INF
+Function TCB_IMGPSScanX.GetSetInf3 : Boolean; //取系統設定資訊mode3  FORM_INF
 var
   ColumeStr : String;
   S : TStringlist;
@@ -4794,13 +5758,13 @@
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=3&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=3&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4814,13 +5778,13 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Function TCB_IMGPSScanX.GetSetInf4 : Boolean; //���t�γ]�w��Tmode4  CHECK_RULE_INF
+Function TCB_IMGPSScanX.GetSetInf4 : Boolean; //取系統設定資訊mode4  CHECK_RULE_INF
 var
   ColumeStr : String;
   S : TStringlist;
@@ -4834,13 +5798,13 @@
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=4&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=4&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4854,14 +5818,14 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
   CheckRule2OMRErrInfo;
 end;
 
-Function TCB_IMGPSScanX.GetSetInf5 : Boolean; //���t�γ]�w��Tmode5  MEMO_INF
+Function TCB_IMGPSScanX.GetSetInf5 : Boolean; //取系統設定資訊mode5  MEMO_INF
   var
   ColumeStr : String;
   S : TStringlist;
@@ -4874,13 +5838,13 @@
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=5&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=5&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4894,13 +5858,13 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Function TCB_IMGPSScanX.GetSetInf6 : Boolean; //���t�γ]�w��Tmode5  WORK_INF
+Function TCB_IMGPSScanX.GetSetInf6 : Boolean; //取系統設定資訊mode5  WORK_INF
 var
   ColumeStr : String;
   S : TStringlist;
@@ -4914,13 +5878,13 @@
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=5&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=6&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4934,13 +5898,13 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Function TCB_IMGPSScanX.GetSetInf7 : Boolean; //���t�γ]�w��Tmode5  LASTEST_FORM_INF
+Function TCB_IMGPSScanX.GetSetInf7 : Boolean; //取系統設定資訊mode5  LASTEST_FORM_INF
 var
   ColumeStr : String;
   S : TStringlist;
@@ -4954,13 +5918,13 @@
   //If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC02 ','checktime='+EnCodeDateTime+'&mode=5&col='+ColumeStr+'&workno='+FWork_No,FReWrite.Text,Memo1) Then
   If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC01/tables','checktime='+EnCodeDateTime+'&mode=7&col='+En_DecryptionStr_Base64('E',ColumeStr,Mpskey)+'&work_no='+FWork_No,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
@@ -4974,13 +5938,13 @@
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SetFormID_DocNo; //�NFormID��Docno��X�ӥt�s�Jlist��    20130403�W�[
+Procedure TCB_IMGPSScanX.SetFormID_DocNo; //將FormID及Docno抽出來另存入list裡    20130403增加
 var
   i : Integer;
 begin
@@ -4992,7 +5956,7 @@
 
 end;
 
-Procedure TCB_IMGPSScanX.SetIn_WH_DocNo; //�N�n�J�w��DocNo��X�ӥt�s�Jlist��
+Procedure TCB_IMGPSScanX.SetIn_WH_DocNo; //將要入庫的DocNo抽出來另存入list裡
 var
   i : Integer;
 begin
@@ -5006,7 +5970,17 @@
   StringtoFile(IN_WH_DocNoList.Text,'D:\121.txt');}
 end;
 
-Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo;   //�ˮֳW�h��JOMRErrINFo Record
+function TCB_IMGPSScanX.CheckRequiredColumnValues(workno, caseno:String): Boolean;
+begin
+//
+  Result:=False;
+  if (workno='HLN') and (caseno[9]='3') then
+    Result:=True;
+  if (workno='HLN') and (caseno[9]='4') then
+    Result:=True;
+end;
+
+Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo;   //檢核規則填入OMRErrINFo Record
 var i : Integer;
     CheckNo : String;
 begin
@@ -5017,14 +5991,14 @@
     if FindSQLData(CHECK_RULE_INF_List,'MESG_SHOW_TYPE,MESG_DISP_TYPE,CHECK_MESG,SCAN_MODE','CHECK_NO',CheckNo,0,FindResult) then
     begin
       if GetFindResult('MESG_SHOW_TYPE') = '1' then
-        OMRErrInfo[i].Display := True  //���
+        OMRErrInfo[i].Display := True  //顯示
       Else if GetFindResult('MESG_SHOW_TYPE') = '2' then
-        OMRErrInfo[i].Display := False; //�����
+        OMRErrInfo[i].Display := False; //不顯示
 
       if GetFindResult('MESG_DISP_TYPE') = '1' then
-        OMRErrInfo[i].Ignore := True    //�i����
+        OMRErrInfo[i].Ignore := True    //可忽略
       Else if GetFindResult('MESG_DISP_TYPE') = '2' then
-        OMRErrInfo[i].Ignore := False;  //���i����
+        OMRErrInfo[i].Ignore := False;  //不可忽略
 
       OMRErrInfo[i].Info := GetFindResult('CHECK_MESG');
       OMRErrInfo[i].Mode := GetFindResult('SCAN_MODE');
@@ -5051,14 +6025,17 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.DeleteImageFile(Path,FileName,CaseID:String); // �R���ɮ�  (�L�k�o��DocDir��)
+Procedure TCB_IMGPSScanX.DeleteImageFile(Path,FileName,CaseID:String); // 刪除檔案  (無法得到DocDir用)
 var
   i : Integer;
   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
@@ -5080,7 +6057,7 @@
   end;}
 end;
 
-Procedure TCB_IMGPSScanX.DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //�R�����wFormID���
+Procedure TCB_IMGPSScanX.DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //刪除指定FormID文件
 var
   i: Integer;
   FileList : TStringlist;
@@ -5095,6 +6072,15 @@
     begin
       if FileName2FormCode(FileList.Strings[i]) = FormID then
       begin
+        if (FMode = 'ESCAN') and (FModeName<>_Msg('異動件')) then
+        begin
+          if ISExistImg(ImageSavePath+CaseID+'\'+DocDir+'\'+FileList.Strings[i]) then
+          begin
+            //ShowMessage('有圖為非當次掃瞄,不可刪除');
+            Break;
+          end;
+        end;
+//ShowMessage(FileList.Strings[i]);
         DeleteImageFile(ImageSavePath+CaseID+'\'+DocDir+'\',FileList.Strings[i],CaseID);
       end;
     end;
@@ -5105,7 +6091,7 @@
   {for i := ContextList.Count - 1 downto 0 do
   begin
     FName := ContextList.Strings[i];
-    if FormID = 'Err' then  //�R�����U���
+    if FormID = 'Err' then  //刪未註冊文件
     begin
       If not FormIDExists(FileName2FormCode(FName),False,0) Then
       begin
@@ -5126,7 +6112,7 @@
   ReSortFileName(Path); }
 end;
 
-Function TCB_IMGPSScanX.DeleteDocNoFile(Path,DocNo:String):Boolean;  //�R�����wDocNo���
+Function TCB_IMGPSScanX.DeleteDocNoFile(Path,DocNo:String):Boolean;  //刪除指定DocNo文件
 var
   i: Integer;
   FName : String;
@@ -5140,7 +6126,7 @@
       DeleteFile(Path+FName);
       ContextList.Delete(i);
       Context_DocnoList.Delete(i);
-      Result := True; //���R����w���
+      Result := True; //有刪到指定文件
     end;
   end;
   ContextList.SaveToFile(Path+'Context.dat');
@@ -5152,7 +6138,41 @@
     Cust_DocNoList.LoadFromFile(Path+'CustomDocNo.dat');
 end;
 
-Procedure TCB_IMGPSScanX.DeleteShowFile(Path:String); //�R����ܤ����v��
+Function TCB_IMGPSScanX.DeleteDocNoFileForESCAN(Path,DocNo:String):Boolean;  //刪除指定DocNo文件
+var
+  i,j,k: Integer;
+  FName : String;
+  ST1,ST2,ST3:TStringList;
+
+begin
+
+  Result := False;
+//ShowMessage(DocNo);
+  for i := ContextList.Count - 1 downto 0 do
+  begin
+    FName := ContextList.Strings[i];
+    If (DocNo = FormCode2DocNo(FileName2FormCode(FName))) or (DocNo=AttName) then
+    begin
+      if not ISExistImg(Path+'\'+FName) then
+      begin
+        DeleteFile(Path+'\'+FName);
+        ContextList.Delete(i);
+      end;
+      Result := True; //有刪到指定文件
+    end;
+  end;
+  ContextList.SaveToFile(Path+'\Context.dat');
+  ContextList.LoadFromFile(Path+'\Context.dat');
+
+  if ContextList.Count=0 then
+  begin
+    _DelTree(Path);
+    SetDocNoList('D',-1,NowCaseNo,NowDocDir,'');
+  end;
+
+end;
+
+Procedure TCB_IMGPSScanX.DeleteShowFile(Path:String); //刪除顯示中的影像
 var
   i : Integer;
   DelFile : String;
@@ -5166,7 +6186,7 @@
 
 end;
 
-Function TCB_IMGPSScanX.GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //���O�������_��������
+Function TCB_IMGPSScanX.GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //取記錄的文件_版本頁數
 var
   P : String;
 begin
@@ -5181,38 +6201,81 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //���ץ�̪����_��������
+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 := 1;
+  Count := 0;
+  docInt:=0;
+  tempInt:=0;
   S := TStringlist.Create;
+  S2 := TStringlist.Create;
+//ShowMessage('page='+IntToStr(Pages));
   try
     S.LoadFromFile(ImageSavePath+CaseID+'\upload\Context.dat');
-    for I := 0 to pages-1 do
+    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
+          begin
+            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]);
-        //Showmessage('1:'+version+','+FormCode2Version(FormCode)+','+DocNo+','+FormCode2DocNo(FormCode)+','+iPage+','+FormCode2Page(FormCode));
+//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
-          //Showmessage(inttostr(Count+1));
+LogFile1.LogToFile(logTimeString+'CheckCaseDocNoPage caseno='+CaseID+','+version+','+FormCode2Version(FormCode)+','+DocNo+','+FormCode2DocNo(FormCode)+','+iPage+','+FormCode2Page(FormCode));
+//Showmessage(version+','+DocNo+',iPage='+iPage);
+//Showmessage(inttostr(Count+1));
           Inc(Count);
-          Break;   //���F...���}
+          Break;   //找到了...離開
         end;
       end;
     end;
   finally
   S.Free;
+  S2.free;
   end;
   Result := Count;
 end;
 
-Function TCB_IMGPSScanX.FindFormCodePages(CaseID,FormCode:String):Integer;  //�p��ץ��FormID������
+Function TCB_IMGPSScanX.FindFormCodePages(CaseID,FormCode:String):Integer;  //計算案件裡FormID的頁數
 var
   i,Count : integer;
   S : TStringlist;
@@ -5224,6 +6287,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
@@ -5236,7 +6306,7 @@
   Result := Count;
 end;
 
-Function TCB_IMGPSScanX.GetDataFormCodePages(FormCode:String):Integer;   //���O����FormcID������
+Function TCB_IMGPSScanX.GetDataFormCodePages(FormCode:String):Integer;   //取記錄的FormcID的頁數
 begin
   If FindSQLData(FORM_INF_List,'T1.MAX_PAGE','T1.FORM_ID',FormCode,0,FindResult) Then
   begin
@@ -5247,7 +6317,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //�ץ󪺼v���Y��
+Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //案件的影像縮放
 var
   S : TStringlist;
   FileName : String;
@@ -5263,23 +6333,25 @@
     For i := 0 to S.Count -1 do
     begin
       FileName := S.Strings[i];
-      ImageReSize(CaseID,FileName);  //�̤Q�r�w���I���Y��
+      ImageReSize_FormID(CaseID,FileName);  //依十字定位點做縮放
     end;
   finally
   S.Free;
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ImageReSize(CaseID,FileName:String);  //�̤Q�r�w���I���Y��
+Procedure TCB_IMGPSScanX.ImageReSize_FormID(CaseID,FileName:String);  //依十字定位點做縮放
 var
   FormID : String;
   DH,DW : String;
   NowW,NowH : Integer;
-  ANCHOR : String; //�O�_���Q�r�u
+  ANCHOR : String; //是否有十字線
   SizeStr : String;
   S : TStringlist;
   v,v1:Integer;
+  IsRecordMD5:Boolean;
 begin
+  IsRecordMD5:=False;
   FormID := FileName2FormCode(FileName);
   if FormID = '' then Exit;
 
@@ -5289,18 +6361,41 @@
     DW := GetFindResult('T1.FORM_WIDTH');
     ANCHOR := UpperCase(GetFindResult('T1.ANCHOR'));
     ANCHOR := Index2Anchor(ANCHOR);
-    if ((ANCHOR = 'ANCHOR') or (ANCHOR = 'FRAME')) and (DH <> '') and (DW <> '') then  //���Q�r�w���I
+Display1.Lines.Add(FormID+','+DH+','+DW);
+//ShowMessage('AAAAAAAAA');
+    if ((ANCHOR = 'ANCHOR') or (ANCHOR = 'FRAME')) and (DH <> '') and (DW <> '') then  //有十字定位點
     begin
+//ShowMessage('BBBBBBB');
       ImageScrollBox1.LoadFromFile(ImageSavePath+CaseID+'\Upload\'+FileName,1);
+
+      if (FWH_category='N') and  ISExistImg(ImageSavePath+CaseID+'\Upload\'+FileName) then
+      begin
+        Exit;//20171103  補件  原有的圖不作resize
+      end;
+
       //FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,NowW,NowH);
       FindPoint(ISB_BW.Graphic,UpLPoint,UpRPoint,DownLPoint,NowW,NowH,ANCHOR);
+
       SizeStr := CheckSize(ISB_BW,UpLPoint,UpRPoint,DownLPoint,DW,DH);
+      ImageResize(ImageScrollBox1.Graphic,ISB_BW.Graphic.Width,ISB_BW.Graphic.Height);
+
+      FindPoint(ISB_BW.Graphic,UpLPoint,UpRPoint,DownLPoint,NowW,NowH,ANCHOR);
       v := 5;
       v1 := length(SizeStr);
       IF (SizeStr <> '') and (Copy(SizeStr,1,v) <> 'ERROR') then
       begin
+//ShowMessage('CCCCC');
+        if (ISExistImg(ImageSavePath+CaseID+'\Upload\'+FileName)) and (reSizeExistImgList.IndexOf(LoadFileGetMD5(ImageSavePath+CaseID+'\Upload\'+FileName))=-1) then
+        begin
+          IsRecordMD5:=True;
+        end;
         ImageScrollBox1.SaveToFile(ImageSavePath+CaseID+'\Upload\'+FileName);
-        S := TStringlist.Create;                     ///20110422���� �����W�Ǥ~��
+        if IsRecordMD5 then
+        begin
+          reSizeExistImgList.add(LoadFileGetMD5(ImageSavePath+CaseID+'\Upload\'+FileName));
+        end;
+//showmessage(ImageSavePath+CaseID+'\Upload\'+FileName);
+        S := TStringlist.Create;                     ///20110422拿掉 換成上傳才做
         if FileExists(ImageSavePath+CaseID+'\Upload\ReSize.dat') then
           S.LoadFromFile(ImageSavePath+CaseID+'\Upload\ReSize.dat');
         //S.Add(FormCode2FormName(FormID)+' '+SizeStr);
@@ -5308,7 +6403,7 @@
         S.SaveToFile(ImageSavePath+CaseID+'\Upload\ReSize.dat');
         S.Free;
       end;
-      if (Copy(SizeStr,1,v) = 'ERROR') then   //�����T�өw���I
+      if (Copy(SizeStr,1,v) = 'ERROR') then   //未找到三個定位點
       begin
         S := TStringlist.Create;
         if FileExists(ImageSavePath+CaseID+'\Upload\AnchorError.dat') then
@@ -5323,10 +6418,10 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ImageReSize_tmp(FormID,FileName:String);  //�̤Q�r�w���I���Y��(�Ȧs��)
+Procedure TCB_IMGPSScanX.ImageReSize_tmp(FormID,FileName:String);  //依十字定位點做縮放(暫存檔)
 var
   DH,DW : String;
-  ANCHOR : String; //�O�_���Q�r�u
+  ANCHOR : String; //是否有十字線
   SizeStr : String;
   S : TStringlist;
 begin
@@ -5336,7 +6431,7 @@
     DW := GetFindResult('T1.FORM_WIDTH');
     ANCHOR := UpperCase(GetFindResult('T1.ANCHOR'));
     ANCHOR := Index2Anchor(ANCHOR);
-    if ((ANCHOR = 'ANCHOR') or (ANCHOR = 'FRAME')) and (DH <> '') and (DW <> '') then  //���Q�r�w���I
+    if ((ANCHOR = 'ANCHOR') or (ANCHOR = 'FRAME')) and (DH <> '') and (DW <> '') then  //有十字定位點
     begin
       ImageScrollBox1.LoadFromFile(FileName,1);
       SizeStr := CheckSize(ImageScrollBox1,UpLPoint,UpRPoint,DownLPoint,DW,DH);
@@ -5359,7 +6454,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //�ǰe�ץ�
+Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件
 Var
   i,n,v: Integer;
   ZipFileList : TStringlist;
@@ -5372,7 +6467,18 @@
   SendData:String;
   Doc_Data,Doc_Data1 : String;
   In_Doc1,In_Doc2 : String;
-  AttachYN : String; //�O�_������ Y:�� N:�S��
+  AttachYN : String; //是否有附件 Y:有 N:沒有
+
+  ST1,ST2,ST3:TStringList;
+  str1,str2:String;
+  must_formidStr :string;
+  last_add_formidstr :string;
+  ScanListStr:String;
+  casepath:String;
+  filesizeInt:integer;
+  case_page:string;
+  Fname:String;
+  FileRec:TSearchrec;
 begin
   Result := True;
   TransName := CaseID;
@@ -5382,70 +6488,225 @@
     ContextList.LoadFromFile(Path+'Context.dat');
     Context_DocnoList.LoadFromFile(Path+'Context_DocNo.dat');
   end;
+
   if FileExists(Path+'CustomDocNo.dat') then
     Cust_DocNoList.LoadFromFile(Path+'CustomDocNo.dat');
-  Pages := ContextList.Count;
 
-  if (FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'RSCAN') or (FMode = 'ESCAN') then
+  Pages := ContextList.Count;
+  case_page:=IntToStr(pages);
+  if (FMode = 'NSCAN') or (FMode = 'ESCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'RSCAN')  then
   begin
     //Showmessage('1');
     UpformID := GetCaseFormID(Path);
-    {if UpformID = '' then             //20131213  yuu�����ޥDform
+    {if UpformID = '' then             //20131213  yuu說不管主form
     begin
-      Showmessage(_msg('������DFormID!!'));
+      Showmessage(_msg('取不到主FormID!!'));
       Result := False;
       DataLoading(False,False);
       Exit;
     end;}
   end;
-  CaseResort2Scanlist(Path); //�ɦW�ӳ]�w�ƧDz���scanlist.dat
-  //CaseResort(Path);  //�ɦW�ӳ]�w�Ƨ�
-  CreateFormID_FormName(Path,CaseID);  //����FormID_FormName.dat
-  CreateDocNo_DocName(Path,CaseID); //����DocNo_Name.dat
-  Doc_Data := CreateDocNo_Info(CaseID);  //���ͫO�޳U��� Docno,����,����;Docno,����,���� ���^�Ǧr��
-  Doc_Data1 := CreateCustDocNo_Info(CaseID);  //���ͦ۩w��� Docname,����,����;Docno,����,���� ���^�Ǧr��
-  In_Doc1 := CreateDocnoFrom_Info(CaseID); //���ͳQ�޶i���O�޳U����T  Docno[tab]����[tab]�ץ�s��#13#10Docno[tab]����[tab]�ץ�s��
-  In_Doc2 := CreateCustDocNoFrom_Info(CaseID);   //���ͳQ�޶i���۩w����T  Docno[tab]����[tab]�ץ�s��#13#10Docno[tab]����[tab]�ץ�s��
-  AttachYN := CreateAttach_Info(CaseID); //�O�_�٦����� Y:�� N:�S��
-  //self.ReadCaseIndex()
+
+  CaseResort2Scanlist(Path); //檔名照設定排序產生scanlist.dat
+  //CaseResort(Path);  //檔名照設定排序
+  CreateFormID_FormName(Path,CaseID);  //產生FormID_FormName.dat
+  CreateDocNo_DocName(Path,CaseID); //產生DocNo_Name.dat
+  Doc_Data := CreateDocNo_Info(CaseID);  //產生保管袋文件 Docno,份數,頁數;Docno,份數,頁數 的回傳字串
+  Doc_Data1 := CreateCustDocNo_Info(CaseID);  //產生自定文件 Docname,份數,頁數;Docno,份數,頁數 的回傳字串
+  In_Doc1 := CreateDocnoFrom_Info(CaseID); //產生被引進的保管袋文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
+  In_Doc2 := CreateCustDocNoFrom_Info(CaseID);   //產生被引進的自定文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
+  AttachYN := CreateAttach_Info(CaseID); //是否還有附件 Y:有 N:沒有
   ReadCaseIndex(Path);
   //LoanDoc := 'Y';
-  //���;B�n�v��
-  if FWork_No = 'CW' then
-    HaveMask := Case2Mask(Path,MaskPath);
-  //���;B�n�v��
+  //產生遮罩影像
+//  if FWork_No = 'CW' then
+//    HaveMask := Case2Mask(Path,MaskPath);
+  //產生遮罩影像
  // S := S +#13+'5-->'+ Timetostr(now);
 
+  ///////必要formid 20170315 start  //////////////////////////////
+  must_formidStr:='';
+  last_add_formidstr:='';
+  ST1:=TStringList.Create;
+  ST1.LoadFromFile(path+'FormCode_Name.dat');
+//ShowMessage(ST1.Text);
+//ShowMessage(LastInitFormidList.Text);
+  ST2:=TStringList.Create;
+  ST3:=TStringlist.Create;
+
+  for I := 0 to ST1.Count - 1 do
+  begin
+    if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-1) then
+    begin
+      str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1);
+      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
+    begin
+      ST2.Delete(ST2.IndexOf(LastInitFormidList.Strings[i]));
+    end;
+  end;
+//ShowMessage('BST2='+ST2.Text);
+  for I := 0 to ST2.Count - 1 do
+  begin
+      last_add_formidstr:=last_add_formidstr+ST2.Strings[i]+'@#,';
+  end;
+  last_add_formidstr:=Copy(last_add_formidstr,1,Length(last_add_formidstr)-3) ;
+
+  ST3.LoadFromFile(path+'scanlist.dat');
+  for I := 0 to ST3.Count - 1 do
+  begin
+    if ScanListStr = '' then
+      ScanListStr := FileName2FormCode(ST3.Strings[i])
+    else
+      ScanListStr := Format('%s,%s',[ScanListStr,FileName2FormCode(ST3.Strings[i])]);
+  end;
+
+  ST1.Free;
+  ST2.Free;
+  ST3.Free;
+//ShowMessage('last_add_formidstr='+last_add_formidstr);
+  ///////必要formid 20170315 end //////////////////////////
+
+  ///保留外部影像  start///////////////////////////////
+  casepath:= Copy(Path,1,pos('Upload',path)-1);
+//ShowMessage('casepath='+casepath);
+//FIsExternal:='Y';
+  if (FMode='ESCAN') and (FIsExternal='Y') then
+  begin
+    if FileExists(casepath+'Download\FirstImg.zip') then
+    begin
+      CopyFile(PWChar(casepath+'Download\FirstImg.zip'),PWChar(path+'FirstImg.zip'),false);
+    end
+    else
+    begin
+      CopyFile(PWChar(casepath+'Download\'+CaseID+'.zip'),PWChar(path+'FirstImg.zip'),false);
+    end;
+  end;
+  ///保留外部影像  end///////////////////////////////
+
+  //file_size 計算  就先不做 20170316
+  filesizeInt:=0;
+
+
+  //////壓檔/////
   ZipMainFile(Path,Path,'Img.zip');
   if HaveMask then
-    ZipMaskFile(Path,MaskPath,Path,'MaskImg.zip');  //���B�n�]�w���~����
-  /////����////
-  ////�W��/////
-  SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&form_id='+UpformID+'&loan_doc='+Case_loandoc+'&case_no='+TransName+'&doc_data='+HTTPEncode(UTF8Encode(Doc_Data))+'&doc_data1='+HTTPEncode(UTF8Encode(Doc_Data1))+'&attach='+AttachYN+'&in_doc1='+HTTPEncode(UTF8Encode(In_Doc1))+'&in_doc2='+HTTPEncode(UTF8Encode(In_Doc2));
-  if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/caseupload',SendData,'file',Path+'Img.zip',FReWrite,Memo1,False) then
-  begin
-    Showmessage(Format(_Msg('�ǰe�ץ�s��(%s)�ɮ׮�,�����o�Ϳ��~!!'+_Msg('���~�N�X:')),[CaseID])+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
-    Result := False;
-    Exit;
-  end;
-  if memo1.Lines.Strings[0] = '1' then
-  begin
-    Showmessage(Format(_Msg('�ǰe�ץ�s��(%s)�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~��]:'),[CaseID])+memo1.Lines.Strings[1]);
-    Result := False;
-    Exit;
-  end
-  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
-  begin
-    Showmessage(Format(_Msg('�ǰe�ץ�s��(%s)�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J'),[CaseID]));
-    Result := False;
-    Exit;
-  end;
-  ////�W��////
+    ZipMaskFile(Path,MaskPath,Path,'MaskImg.zip');  //有遮罩設定的才產生
+  /////壓檔////
+  ///檢查上傳的zip大小////
+   FName :=Path+ 'Img.zip';
 
-  if FMode = 'ESCAN' then    //�W���¥�ޤJ�ɮ�      //20140616 �쥻���h�¥�A�h�s��,�אּ���h�s��A�h�¥�
+    FindFirst(FName, faAnyfile, FileRec);
+
+    //FMaxUploadSize
+//ShowMessage(IntToStr(FileRec.Size));
+//Result:=False;
+//exit;           //目前上傳檔案大小為xxMB,已超過50MB,無法上傳    %.3f  ,[FileRec.Size / 1048576]
+    If FileRec.Size > StrtoInt(FMaxUploadSize) * 1048576 Then // 檢查檔案大小
+    Begin
+      ShowMessage(Format(_Msg('%s目前上傳檔案大小為%.3fMB,已超過%sMB,無法上傳'),[caseid,FileRec.Size / 1048576,FMaxUploadSize]));
+      //ShowMessage(Format('%s目前上傳檔案大小為%.3fMB,已超過'+FMaxUploadSize+'MB,無法上傳',[caseid,FileRec.Size / 1048576]) );
+      FindClose(FileRec);
+      Result := False;
+      Exit;
+    End;
+    FindClose(FileRec);
+  ///檢查上傳的zip大小////
+//ShowMessage('last_add_formidstr='+last_add_formidstr);
+  if not GetftpInfo(CaseID,'upload') then   //取案件上傳方式
+  begin
+    //Showmessage(_Msg()Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+'.');
+    DownFileErrStr := _Msg('取案件上傳資訊失敗!!')+HttpErrStr;
+    Result := False;
+    Exit;
+  end;
+  SendData:='data='+HTTPEncode(UTF8Encode(FData))
+      +'&verify='+FVerify
+      +'&form_id='+UpformID
+      +'&loan_doc='+Case_loandoc
+      +'&case_no='+TransName
+      +'&doc_data='+HTTPEncode(UTF8Encode(Doc_Data))
+      +'&doc_data1='+HTTPEncode(UTF8Encode(Doc_Data1))
+      +'&attach='+AttachYN
+      +'&case_page='+case_page
+      +'&file_size='+IntToStr(filesizeInt)
+      +'&must_formid='+must_formidStr  //擁有的 formid
+      +'&last_add_formid='+last_add_formidstr   //當次新加的 formid
+      +'&form_code='+ScanListStr      //scanlist.dat 表單代號
+      +'&ftp_image_path='+FFtpExtraPath   //加傳FTP目錄  HTTP上傳時會是空白
+      +'&in_doc1='+HTTPEncode(UTF8Encode(In_Doc1))
+      +'&in_doc2='+HTTPEncode(UTF8Encode(In_Doc2));
+
+  case TransMode of
+    tsHttp :
+    begin
+      ////上傳/////
+      ShowText := CaseID+_Msg('資料上傳中(Http),請稍候');
+      DataLoading(True,True);
+      if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/caseupload',SendData,'file',Path+'Img.zip',FReWrite,Memo1,False) then
+      begin
+        Showmessage(Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+'.');
+        Result := False;
+        Exit;
+      end;
+      if memo1.Lines.Strings[0] = '1' then
+      begin
+        Showmessage(Format(_Msg('')+_Msg(''),[CaseID])+memo1.Lines.Strings[1]+'。');
+        Result := False;
+        Exit;
+      end
+      Else if Pos('<script type="text/javascript" src="scripts/IMGPS00/login.js"></script>',Memo1.Lines.Text) > 0 then
+      begin
+        Showmessage(Format(_Msg('')+_Msg('')+_Msg('閒置過久或被登出,請重新登入'),[CaseID]));
+        Result := False;
+        Exit;
+      end;
+      ////上傳////
+    end;
+    tsFtp :
+    begin
+       ShowText := CaseID+_Msg('資料上傳中(Ftp),請稍候');
+       DataLoading(True,True);
+       SetFtpInfo;
+       try
+         if not IIS_Ftp.FtpsConnect then
+         begin
+           Showmessage(Format('無法連上Ftp主機,錯誤原因:%s',[FtpErrReason]));
+           Result := False;
+           Exit;
+         end;
+         if not IIS_Ftp.FtpsToMain(FFtpExtraPath,CaseID+'.zip',Path+'Img.zip',display1) then
+         begin
+           Showmessage(Format(_msg('上傳案件(%s)時,發生錯誤,錯誤原因:%s'),[CaseID,FtpErrStr]));
+           Result := False;
+           Exit;
+         end;
+
+         if not FtpCaseComplete(SendData) then    //Ftp上傳後通知完成
+         begin
+           Showmessage(Format(_Msg('通知案件(%s)Ftp上傳完成時,發生錯誤!!'),[CaseID])+HttpErrStr);
+           Result := False;
+           Exit;
+         end;
+       finally
+       IIS_Ftp.FtpsClose;
+       end;
+    end;
+
+  end;
+
+
+  if FMode = 'ESCAN' then    //上傳舊件引入檔案      //20140616 原本先搬舊件再搬新件,改為先搬新件再搬舊件
   begin
     if not TransOldCaseFile(ImageSavePath+CaseID+'\') then
     begin
@@ -5453,24 +6714,22 @@
       Exit;
     end;
   end;
-
-
-
-  // �I�sServer���� /////
+  // 呼叫Server完成 /////
   {If not CaseComplete(Path,CaseID,MainCase) Then
   begin
-    Showmessage(_Msg('�q���ץ�ǰe������,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('通知案件傳送完成時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Result := False;
     Exit;
   end;  }
-  /// �I�sServer����////
+  /// 呼叫Server完成////
 
-  ////�R��////
-  //_DelTree(Path);  //�|�u�RTransPath
+  ////刪檔////
+  //_DelTree(Path);  //會只刪TransPath
+//ShowMessage('STOP');
   _DelTree(ImageSavePath+CaseID);
   SetCaseList('D',-1,CaseID);
-  ////�R��////
+  ////刪檔////
 end;
 
 Procedure TCB_IMGPSScanX.NewTreeNodeRefresh;
@@ -5478,10 +6737,10 @@
   v : Integer;
 begin
   //v := Pos('-',NewTreeNode.Text);
-  //NewTreeNode.Text := Copy(NewTreeNode.Text,1,v-1)+'-�@'+inttostr(NewTreeNode.Count)+'��';
+  //NewTreeNode.Text := Copy(NewTreeNode.Text,1,v-1)+'-共'+inttostr(NewTreeNode.Count)+'筆';
   GetCase_PageCount(CaseCount,PageCount);
   v := Pos('-',NewTreeNode.Text);
-  NewTreeNode.Text := Format(_Msg('%s-�@%d���@%d��'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
+  NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
 end;
 
 Procedure TCB_IMGPSScanX.MyTreeNode1Refresh;
@@ -5489,7 +6748,7 @@
   v : Integer;
 begin
   v := Pos('-',MyTreeNode1.Text);
-  MyTreeNode1.Text := Format(_Msg('%s-%d��'),[Copy(MyTreeNode1.Text,1,v-1),MyTreeNode1.Count]);
+  MyTreeNode1.Text := Format(_Msg('%s-%d筆'),[Copy(MyTreeNode1.Text,1,v-1),MyTreeNode1.Count]);
 end;
 
 Procedure TCB_IMGPSScanX.MyTreeNode2ReFresh(CaseID:String);
@@ -5497,7 +6756,7 @@
   P : Integer;
 begin
   //p:= ContextList.Count;
-  //MytreeNode1.Text := Format(_Msg('%s-%d��'),[CaseID,p]);
+  //MytreeNode1.Text := Format(_Msg('%s-%d頁'),[CaseID,p]);
   DrawDocItem2(MytreeNode1,CaseID);
   //DrawDocItem(MytreeNode1,FORM_INF_List,CaseID);
 end;
@@ -5505,12 +6764,12 @@
 Procedure TCB_IMGPSScanX.MyTreeNode3ReFresh(CaseID:String);
 begin
 
-  //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID);  //201408280��
+  //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID);  //201408280改
   DrawDocItem2(MytreeNode1,CaseID);
   //DrawDocItem(MytreeNode1,FORM_INF_List,CaseID);
 end;
 
-Function TCB_IMGPSScanX.Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2��DocNo�X��
+Function TCB_IMGPSScanX.Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2取DocNo出來
 var
   v,v1,v2 : Integer;
 begin
@@ -5524,7 +6783,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3��DocNo�X��
+Function TCB_IMGPSScanX.Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3取DocNo出來
 var
   v,v1,v2 : Integer;
 begin
@@ -5538,7 +6797,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3��FormCode�X��
+Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3取FormCode出來
 var
   v,v1,v2 : Integer;
 begin
@@ -5553,7 +6812,7 @@
 end;
 
 
-Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String;  //��MyTreeNode2���ѧO�r�X��(�O���e�I���)
+Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String;  //取MyTreeNode2的識別字出來(記之前點選用)
 var
   v : Integer;
 begin
@@ -5580,19 +6839,19 @@
     DownUrl := FUrl+CaseID+'&checktime='+EnCodeDateTime;
     if not dnFile(HTTPSClient,DownUrl,'','',DPath+CaseID+'.zip',FReWrite,Memo1,False,DownImgStatus) then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
     if Memo1.Lines.Strings[0] = '1' then
     begin
-      HttpErrStr :=_Msg('���~��]:')+memo1.Lines.Strings[1];
+      HttpErrStr :=_Msg('錯誤原因:')+memo1.Lines.Strings[1];
       Result := False;
       Exit;
     end
     Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
     begin
-      HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+      HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
       Result := False;
       Exit;
     end;
@@ -5612,14 +6871,14 @@
     end
     Else
     begin
-      if ((FMode = 'FSCAN') or (FMode = 'ISCAN')) and (Memo1.Lines.Strings[0] ='NO_FILE') then  //FGIS�e�x�פJ��S���v���O�諸
+      if ((FMode = 'FSCAN') or (FMode = 'ISCAN')) and (Memo1.Lines.Strings[0] ='NO_FILE') then  //FGIS前台匯入件沒有影像是對的
       begin
         SC.Clear;
         SC.SaveToFile(DPath+'Context.dat');
       end
       Else
       begin
-        HttpErrStr := _Msg('�䤣��v��');
+        HttpErrStr := _Msg('找不到影像');
         Result := False;
         Exit;
       end;
@@ -5635,7 +6894,7 @@
       Version := FormCode2Version(FormID);
       If FindSQLData(Doc_Inf_List,'ADD_SCAN_RULE','DOC_NO,DOC_VERSION',DocNo+','+Version,0,FindResult) Then
       begin
-        if GetFindResult('ADD_SCAN_RULE') = 'R' then  //���������R�A�[  20101026 User�ѧRFormCode��RDocNo
+        if GetFindResult('ADD_SCAN_RULE') = 'R' then  //替換的先刪再加  20101026 User由刪FormCode改刪DocNo
         begin
           //DeleteFormCodeFile(DPath,FormID);
           ContextList.LoadFromFile(DPath+'Context.dat');
@@ -5643,7 +6902,7 @@
         end;
       end;
     end;
-    for I := 0 to SC.Count - 1 do   //�ƻs�ɥR�i�Ӫ��v��
+    for I := 0 to SC.Count - 1 do   //複製補充進來的影像
     begin
       OldFName := SC.Strings[i];
       Main_C.LoadFromFile(DPath+'Context.dat');
@@ -5656,7 +6915,7 @@
       begin
         CopyFile(PWideChar(SPath+OldFName),PWideChar(DPath+NewMainFName),False);
       end;
-      if FormID = '' then //����
+      if FormID = '' then //附件
       begin
         CopyFile(PWideChar(SPath+OldFName),PWideChar(DPath+NewMainFName),False);
       end;
@@ -5667,10 +6926,56 @@
   SC.Free;
   Main_C.Free;
   end;
-  ///�[�J���q�l�ɶפJ�ץ��
+  ///加入的電子檔匯入案件裡
   if DirectoryExists(SPath+'AttFile\') then
     AttFile_Arrange(SPath+'AttFile\',DPath+'AttFile\');
 end;}
+
+Function TCB_IMGPSScanX.DownLoadImage(Path,CaseID:String):Boolean;
+begin
+  Result := True;
+  if not GetftpInfo(CaseID,'download') then   //取案件下載方式
+  begin
+    DownFileErrStr := _Msg('取案件下載資訊失敗,')+HttpErrStr;
+    Result := False;
+    Exit;
+  end;
+  case TransMode of
+    tsHttp:
+    begin
+      ShowText := _Msg('案件下載中(Http),請稍候');
+      DataLoading(True,True);
+      If not Down_Img(ImageSavePath+FCaseID+'\Download\',FCaseID) then
+      begin
+        Showmessage(FCaseID+_msg('載入異動影像時,網路發生錯誤')+HttpErrStr);
+        DataLoading(False,False);
+        Exit;
+      end;
+    end;
+    tsFtp:
+    begin
+      ShowText := _Msg('案件下載中(Ftp),請稍候');
+      DataLoading(True,True);
+      SetFtpInfo;
+
+      if not IIS_Ftp.FtpsConnect then
+      begin
+        DownFileErrStr := Format(_Msg('無法連上Ftp主機,錯誤原因:%s')+#13+'%s',[FtpErrReason,FTPSClient1.LastReceivedReply]);
+        Result := False;
+        Exit;
+      end;
+      if not IIS_Ftp.FtpsDownloadFile(FFtpExtraPath,CaseID+'.zip',Path+CaseID+'.zip',display1) then
+      begin
+        DownFileErrStr := Format(_Msg('錯誤原因:%s'),[FtpErrStr]);
+        Result := False;
+        Exit;
+      end;
+      ExecuteUnZip(Path+CaseID+'.zip',Path,False);
+      DeleteFile(Path+CaseID+'.zip');
+    end;
+  end;
+end;
+
 
 Function TCB_IMGPSScanX.Down_Img(Path,CaseID:String):Boolean;
 var
@@ -5682,24 +6987,26 @@
   EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
   ///service/slic/SLIC04/case?data=&verify=&case_no=&file=
   SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID+'&file=';
+//ShowMessage(SendData);
   if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/case',SendData,Path+CaseID+'.zip',FReWrite,Memo1,False,DownImgStatus) then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   if Memo1.Lines.Strings[0] = '1' then
   begin
-    HttpErrStr :=_Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr :=_Msg('錯誤原因:')+memo1.Lines.Strings[1]+'。';
     Result := False;
     Exit;
   end
-  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
+  Else if Pos('<script type="text/javascript" src="scripts/IMGPS00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
+//ShowMessage('替換zip');
   AttPath := Path + 'AttFile\';
   if FileExists(Path+CaseID+'.zip') then
   begin
@@ -5716,28 +7023,28 @@
   end
   Else
   begin
-    HttpErrStr := _Msg('�䤣��v��');
+    HttpErrStr := _Msg('找不到影像');
     Result := True;
     Exit;
   end;
 
 end;
 
-Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //�����t��XXXX
+Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //取未配號XXXX
 var
   i : Integer;
 begin
   for i := 1 to 9999 do
   begin
-    if Not DirectoryExists(Path+_Msg('���t��')+Add_Zoo(i,4)) then
+    if Not DirectoryExists(Path+_Msg('未配號')+Add_Zoo(i,4)) then
     begin
-      Result := _Msg('���t��')+Add_Zoo(i,4);
+      Result := _Msg('未配號')+Add_Zoo(i,4);
       Break;
     end;
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CaseResort(Path:String); //�ץ��ɮ׭��s�Ƨ�(������Docno��)
+Procedure TCB_IMGPSScanX.CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno排)
 var
   i,n,v,v1 : Integer;
   S,S1 : TStringlist;
@@ -5749,7 +7056,7 @@
   try
   S.LoadFromFile(Path+'Context.dat');
   X := 0;
-  {for I := 1 to FORM_INF_List.Count - 1 do    //�bFormID���]�w��   //�D��� ��SQL��   20101028��
+  {for I := 1 to FORM_INF_List.Count - 1 do    //在FormID有設定的   //主文件 照SQL排   20101028改
   begin
     FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
     if FormCode2FileName(FormID,S) = '' then
@@ -5761,15 +7068,15 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
-        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //�q�즳�ƶq�[1�}�l�s
+        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
+        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;}
 
-  {for I := 0 to FORM_INF_List.Count - 1 do  //����� ��FormID 1~8�X+���˶��DZ�   20110512���F�Y�Ӥ��n��������]�n�D��
+  {for I := 0 to FORM_INF_List.Count - 1 do  //次文件 照FormID 1~8碼+掃瞄順序排   20110512為了某個文件要先打的原因要求改
   begin
     for n := 0 to S.Count - 1 do
     begin
@@ -5779,13 +7086,13 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
+        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;}
-  for I := 0 to Doc_Inf_List.Count - 1 do  //�D��� �Ӥ��N�X+���˶��DZ�   20101101��   20110512�ߤW�S����^��
+  for I := 0 to Doc_Inf_List.Count - 1 do  //主文件 照文件代碼+掃瞄順序排   20101101改   20110512晚上又說改回來
   begin
     DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i);
     if DocNo2FileName(DocNo,S) = '' then
@@ -5797,8 +7104,8 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
-        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //�q�즳�ƶq�[1�}�l�s
+        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
+        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
@@ -5806,7 +7113,7 @@
   end;
 
 
-  for I := 0 to Doc_Inf_List.Count - 1 do  //����� �Ӥ��N�X+���˶��DZ�   20101101��   20110512�ߤW�S����^��
+  for I := 0 to Doc_Inf_List.Count - 1 do  //次文件 照文件代碼+掃瞄順序排   20101101改   20110512晚上又說改回來
   begin
     DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i);
     if DocNo2FileName(DocNo,S) = '' then
@@ -5818,15 +7125,15 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
-        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //�q�즳�ƶq�[1�}�l�s
+        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
+        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;
 
-  {for n := 0 to S.Count - 1 do    //����� �ӱ��˶��DZ�   20101028��
+  {for n := 0 to S.Count - 1 do    //次文件 照掃瞄順序排   20101028改
   begin
     FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
     Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
@@ -5836,13 +7143,13 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
+        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;}
-  for i := 0 to S.Count - 1 do   //FormID�S�]�w������
+  for i := 0 to S.Count - 1 do   //FormID沒設定的或附件
   begin
     if S.Strings[i][1] <> '*' then
     begin
@@ -5855,7 +7162,7 @@
     end;
   end;
   S.Clear;
-  for i := 0 to S1.Count - 1 do  //�}�l�ഫ�ɦW
+  for i := 0 to S1.Count - 1 do  //開始轉換檔名
   begin
     v := Pos(',',S1.Strings[i]);
     v1 := length(S1.Strings[i]);
@@ -5875,7 +7182,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //�ץ��ɮ׭��s�Ƨǵ�scanlist(������FormID��)
+Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排)
 var
   i,n,v,v1 : Integer;
   S,S1 : TStringlist;
@@ -5888,7 +7195,7 @@
   if FileExists(Path+'Context.dat') then
     S.LoadFromFile(Path+'Context.dat');
   X := 0;
-  for I := 1 to FORM_INF_List.Count - 1 do    //�bFormID���]�w��   //�D��� ��SQL��   20101028��
+  for I := 1 to FORM_INF_List.Count - 1 do    //在FormID有設定的   //主文件 照SQL排   20101028改
   begin
     FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
     if FormCode2FileName(FormID,S) = '' then
@@ -5900,15 +7207,15 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
-        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //�q�즳�ƶq�[1�}�l�s
+        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
+        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;
 
-  for I := 0 to FORM_INF_List.Count - 1 do  //����� ��SQL��   20110512���F�Y�Ӥ��n��������]�n�D��
+  for I := 0 to FORM_INF_List.Count - 1 do  //次文件 照SQL排   20110512為了某個文件要先打的原因要求改
   begin
 
     FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
@@ -5921,15 +7228,15 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
-        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //�q�즳�ƶq�[1�}�l�s
+        //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
+        NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;
 
-  {for I := 0 to Doc_Inf_List.Count - 1 do  //����� �Ӥ��N�X+���˶��DZ�   20101101��   20110512�ߤW�S����^��
+  {for I := 0 to Doc_Inf_List.Count - 1 do  //次文件 照文件代碼+掃瞄順序排   20101101改   20110512晚上又說改回來
   begin
     DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i);
     Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i);
@@ -5939,14 +7246,14 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
+        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;}
 
-  {for n := 0 to S.Count - 1 do    //����� �ӱ��˶��DZ�   20101028��
+  {for n := 0 to S.Count - 1 do    //次文件 照掃瞄順序排   20101028改
   begin
     for i := 0 to FORM_INF_List.Count - 1 do
     begin
@@ -5956,13 +7263,13 @@
       begin
         Inc(X);
         OldName := S.Strings[n];
-        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //�q�즳�ƶq�[1�}�l�s
+        NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
         S.Strings[n] := '*'+S.Strings[n];
         S1.Add(OldName+','+NewName);
       end;
     end;
   end;}
-  for i := 0 to S.Count - 1 do   //FormID�S�]�w������
+  for i := 0 to S.Count - 1 do   //FormID沒設定的或附件
   begin
     if S.Strings[i][1] <> '*' then
     begin
@@ -5976,7 +7283,7 @@
   end;
 
   S.Clear;
-  for i := 0 to S1.Count - 1 do  //�}�l�ഫ�ɦW
+  for i := 0 to S1.Count - 1 do  //開始轉換檔名
   begin
     v := Pos(',',S1.Strings[i]);
     v1 := length(S1.Strings[i]);
@@ -5997,7 +7304,7 @@
 end;
 
 
-Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //�C�X�ץ�̪�Docno_����
+Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //列出案件裡的Docno_版本
 var
   i,n,v : Integer;
   S : TStringlist;
@@ -6011,6 +7318,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])) or (reSizeExistImgList.IndexOf(LoadFileGetMD5(Path+S.Strings[i]))<>-1)  then
+        begin
+          Continue;
+        end;
+      end;
       FormCode := FileName2FormCode(S.Strings[i]);
       DocNo := FormCode2DocNo(FormCode);
       Ver := FormCode2Version(FormCode);
@@ -6035,7 +7349,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //�C�X�ץ�̪�Docno
+Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //列出案件裡的Docno
 var
   i,n,v : Integer;
   S : TStringlist;
@@ -6071,7 +7385,7 @@
 
 end;
 
-Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //�M���ˮ��ɮ�
+Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案
 var
   i : Integer;
 begin
@@ -6079,7 +7393,7 @@
     DeleteFile(ImageSavePath+CaseID+'\Checkerr.ini');
   if FileExists(ImageSavePath+CaseID+'\CheckMemo.dat') then
     DeleteFile(ImageSavePath+CaseID+'\CheckMemo.dat');
-  {if FileExists(ImageSavePath+CaseID+'\ReSize.dat') then  //20110421����  �]���O���|����
+  {if FileExists(ImageSavePath+CaseID+'\ReSize.dat') then  //20110421拿掉  因為記錄會不見
     DeleteFile(ImageSavePath+CaseID+'\ReSize.dat');}
   if FileExists(ImageSavePath+CaseID+'\RemoveMemo.dat') then
     DeleteFile(ImageSavePath+CaseID+'\RemoveMemo.dat');
@@ -6090,7 +7404,7 @@
   CaseNode.SelectedIndex := 2;
 end;
 
-Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:�[�J,I:���J,D:�R��,E:�ק�'
+Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:加入,I:插入,D:刪除,E:修改'
 var
   i : Integer;
 begin
@@ -6129,7 +7443,7 @@
     CaseList.SaveToFile(ImageSavePath+'CaseList.dat');
 end;
 
-Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:�[�J,I:���J,D:�R��,E:�ק�'
+Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:加入,I:插入,D:刪除,E:修改'
 var
   i : Integer;
   CaseDocNoList : TStringlist;
@@ -6160,8 +7474,9 @@
       'D':begin
             if Index <> -1 then
             begin
-              //SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[Index]);  //20140624 �ק�R�����ɤ]�O�@������,�R���|�L�k�q���e�ݺ���������
-              SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[Index]);
+              //SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[Index]);  //20140624 修改刪除文件時也記一筆異動,刪掉會無法通知前端網頁有異動
+              SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[Index]);  //20170912 要刪除  不然我寫不下去
+
               CaseDocNoList.Delete(Index);
               CaseDocNo_CopiesList.Delete(Index);
 
@@ -6172,8 +7487,8 @@
               begin
                 if DocDir = CaseDocNoList.Strings[i] then
                 begin
-                  //SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[i]);  //20140624 �ק�R�����ɤ]�O�@������,�R���|�L�k�q���e�ݺ���������
-                  SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[i]);
+                  //SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[i]);  //20140624 修改刪除文件時也記一筆異動,刪掉會無法通知前端網頁有異動
+                  SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[i]);  //20170912 要刪除  不然我寫不下去
                   CaseDocNoList.Delete(i);
                   CaseDocNo_CopiesList.Delete(i);
                   Break;
@@ -6187,11 +7502,11 @@
           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');
-      //Showmessage('�s�F');
+      //Showmessage('存了');
     end;
   finally
   CaseDocNoList.Free;
@@ -6199,18 +7514,19 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:�[�J,I:���J,D:�R��,E:�ק�'
+Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'
 var
   i : Integer;
   //DocNo:String;
 begin
   //DocNo := FormCode2DocNo(FileName2FormCode(FileName));
+//ShowMessage('FileName='+FileName);
   if DocDir = '' then
-    DocDir := AttName ; //����
+    DocDir := AttName ; //附件
   ContextList.Clear;
   if FileExists(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat') then
     ContextList.LoadFromFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat');
-  SetRecordEditedDocDir('A',CaseNo,DocDir);  //�O����󦳲���
+  SetRecordEditedDocDir('A',CaseNo,DocDir);  //記錄文件有異動
   case Mode of
     'A':begin
           ContextList.Add(FileName);
@@ -6247,7 +7563,50 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean;  //�ˬd�ץ�O�_����OMR�ˮ�
+Procedure TCB_IMGPSScanX.SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'
+var
+  i : Integer;
+begin
+  AttContextList.Clear;
+  if FileExists(ImageSavePath+CaseNo+'\AttContext.dat') then
+    AttContextList.LoadFromFile(ImageSavePath+CaseNo+'\AttContext.dat');
+  case Mode of
+    'A':begin
+          AttContextList.Add(FileName);
+        end;
+    'I':begin
+          AttContextList.Insert(Index,FileName);
+        end;
+    'E':begin
+          AttContextList.Strings[Index] := FileName;
+        end;
+    'D':begin
+          if Index <> -1 then
+          begin
+            AttContextList.Delete(Index);
+          end
+          Else if (text <> '') then
+          begin
+            for i := 0 to AttContextList.Count - 1 do
+            begin
+              if FileName = AttContextList.Strings[i] then
+              begin
+                AttContextList.Delete(i);
+                Break;
+              end;
+            end;
+          end;
+          if AttContextList.Count = 0 then
+            DeleteFile(ImageSavePath+CaseNo+'\AttContext.dat');
+        end;
+  end;
+  if AttContextList.Count > 0 then
+  begin
+    AttContextList.SaveToFile(ImageSavePath+CaseNo+'\AttContext.dat');
+  end;
+end;
+
+Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean;  //檢查案件是否完成OMR檢核
 var
   i : Integer;
 begin
@@ -6262,14 +7621,35 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean;  //�ˬd�O�_�����t�����ץ�
+function TCB_IMGPSScanX.checkFormCodeIsCustom(path, formcode: string): boolean;
+var
+  i:integer;
+  ini : Tmeminifile;
+  str1:String;
+begin
+//ShowMessage(path);
+  ini := Tmeminifile.Create(Path+'CustomDocNo.ini');
+  str1:=ini.ReadString(Copy(formcode,1,8),'FormID','');
+//ShowMessage('str1'+str1);
+  if str1 = formcode then
+  begin
+    Result:=True;
+  end
+  else
+  begin
+    Result := False;
+  end;
+
+end;
+
+Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean;  //檢查是否有未配號的案件
 var
   i,n : Integer;
 begin
   Result := True;
   for i := 0 to NewTreeNode.Count - 1 do
   begin
-    if Pos(_msg('���t��'),NewTreeNode.Item[i].Text) > 0 then
+    if Pos(_msg('未配號'),NewTreeNode.Item[i].Text) > 0 then
     begin
       Result := False;
       Break;
@@ -6277,7 +7657,25 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String);  //���ͪťծ׸�(�������)
+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;
+
+Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String);  //產生空白案號(重掃件用)
 var
   S : TStringlist;
 begin
@@ -6321,7 +7719,7 @@
   ScrollRec[Index].Rate := iRate;
 end;
 
-Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //���wFormID�󴫦��s��FormID
+Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID
 var
   i : Integer;
   OldFileList,NewFileList : TStringlist;
@@ -6329,16 +7727,71 @@
   FormID : String;
   OldFile,NewFile:String;
   Ext : String;
+  ST1:TStringList;
 begin
+  ST1:=TStringList.Create;
   OldFileList := TStringlist.Create;
   NewFileList := TStringlist.Create;
   try
     NewDocNo := FormCode2DocNo(NewFormID);
     NewDocDir := FindLastestDocDir(CaseID,NewDocNo);
-    if NewDocDir = '' then
-      NewDocDir := NewDocNo;
+
+    /////20190319 Hong 原本的程式判斷怪怪的先Mark在下方,改用這段
+    if DocNoNeedDiv(NewDocNo) then   //要分份數
+    begin
+      if ((FormCode2Page(NewFormID) = '01') and (GetDocDir_Page(CaseID,NewDocDir)>0)) or (NewDocDir = '') then
+      begin
+        NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo);
+      end
+      else
+      begin //20171016  真對補件影響 所加的判斷
+        ST1.Clear;
+        if FileExists(ImageSavePath + CaseID+'\'+NewDocDir+'\Context.dat') then
+        begin
+          ST1.LoadFromFile(ImageSavePath + CaseID+'\'+NewDocDir+'\Context.dat');
+          if (ST1.Count > 0) and ISExistImg(ImageSavePath + CaseID+'\'+NewDocDir+'\'+ST1.Strings[0]) then   //20181210 多增加判斷ST1>0 否則會有機會出現List out of bound  Hong
+          begin
+            NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo);
+          end;
+        end;
+      end;
+    end
+    Else        //不分份數
+    begin
+      if NewDocNo <> '' then
+        NewDocDir := NewDocNo
+      else      //Attach 附件
+        NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo);
+    end;
+
+    {if NewDocDir = '' then
+    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
       NewDocDir := DocNo2DocNoDir(ImageSavePath+CaseID+'\',NewDocNo);
+    end
+    else
+    begin
+      ST1.Clear;
+      if FileExists(ImageSavePath + NowCaseno+'\'+NewDocDir+'\Context.dat') then
+      begin
+        ST1.LoadFromFile(ImageSavePath + NowCaseno+'\'+NewDocDir+'\Context.dat');
+        if ISExistImg(ImageSavePath + NowCaseno+'\'+NewDocDir+'\'+ST1.Strings[0]) then
+        begin
+          NewDocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',NewDocNo);
+        end;
+      end;
+    end; }
     if Not DirectoryExists(ImageSavePath+CaseID+'\'+NewDocDir) then
     begin
       MkDir(ImageSavePath+CaseID+'\'+NewDocDir);
@@ -6381,10 +7834,11 @@
   finally
   OldFileList.Free;
   NewFileList.Free;
+  ST1.Free;
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//��ܪ��v�������s��FormID
+Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID
 var
   i,n : Integer;
   OldFile,NewFile:String;
@@ -6400,7 +7854,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //�������FormID
+Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID
 var
   i,n : Integer;
   S,S1 : TStringlist;
@@ -6450,42 +7904,23 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //���˼Ҧ��O�_�n���ˮ�
+Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核
 begin
   Result := False;
   if Pos(ScanMode,OMRMode) > 0 then
     Result := True;
 end;
 
-Function TCB_IMGPSScanX.GetInputMask:String; //���o��J���O�渹�X
-var
-  InputMaskForm: TInputMaskForm;
-begin
-  Result := '';
-  ShowText := _msg('��J�O�渹�X��');
-  DataLoading(True,True);
-  InputMaskForm := TInputMaskForm.Create(self);
-  try
-    InputMaskForm.MaskEdit1.ClearSelection;
-    if InputMaskForm.ShowModal = mrOk then
-    begin
-      Result := Trim(InputMaskForm.MaskEdit1.Text)+Trim(InputMaskForm.MaskEdit2.Text)+Trim(InputMaskForm.MaskEdit3.Text);
-    end;
-  finally
-  InputMaskForm.Free;
-  DataLoading(False,False);
-  end;
-end;
-
 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');
@@ -6494,17 +7929,43 @@
     begin
       iDocDir := DocDirList.Strings[i];
       iDocno := DocNoDir2DocNo(iDocDir);
-      {if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(iDocNo))) or   //�J�w���y���ݫD�J�w���
+      {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     //�D�J�w���y���ݤJ�w���
+         ((iDocNo <> 'Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then     //非入庫掃描不看入庫文件
       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
+        Else
+          if not DocNoAppear(iDocNo) then Continue; //20180925 Hong覺得應該要加這段
+      end;
+
+
       Count := Count+ FileList.Count;
     end;
     if FileExists(Path+CaseID+'\'+AttName+'\Context.dat') then
@@ -6517,6 +7978,7 @@
   finally
   DocDirList.Free;
   FileList.Free;
+  ST1.free;
   end;
 end;
 
@@ -6549,7 +8011,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //����Resize.dat
+Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //產生Resize.dat
 var
   TagTxt : String;
   RecHeight,RecWidth : String;
@@ -6583,7 +8045,7 @@
       if FileExists(TxtName) then
         S.LoadFromFile(TxtName);
       if (RecHeight <> '') and (RecWidth <> '') and ((RecHeight<>ImgHeight) or (RecWidth<>ImgWidth)) then
-        S.Add(ExtractfileName(ImgName)+',���:'+RecHeight+',��e:'+RecWidth+',���ܰ�:'+ImgHeight+',�e�ܰ�:'+ImgWidth);
+        S.Add(ExtractfileName(ImgName)+',原長:'+RecHeight+',原寬:'+RecWidth+',長變動:'+ImgHeight+',寬變動:'+ImgWidth);
       S.SaveToFile(TxtName);
     finally
     S.Free;
@@ -6592,10 +8054,10 @@
 
 end;
 
-Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //���X�ץ󪺼ƶq�έ���
+Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數
 var
-  i,n: Integer;
-  CaseList,DocList,FileList : TStringlist;
+  i,n,k: Integer;
+  CaseList,DocList,FileList,ST1 : TStringlist;
 begin
   Result := False;
   CaseCount := 0;
@@ -6603,19 +8065,23 @@
   CaseList := TStringlist.Create;
   DocList := TStringlist.Create;
   FileList := TStringlist.Create;
+  ST1:= TStringlist.Create;
   try
     ImageSavePath := ImagePath;
     CaseList.Clear;
     if FileExists(ImageSavePath + 'CaseList.dat') then
       CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat');
     CaseCount :=  CaseCount+CaseList.Count;
+//ShowMessage('ImageSavePath='+ImageSavePath+#10#13+'CaseList.Count='+IntToStr(CaseList.Count));
     for i := 0 to CaseList.Count - 1 do
     begin
       DocList.Clear;
       If FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat') Then
         DocList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat');
+//ShowMessage('DocList='+DocList.Text);
       for n := 0 to DocList.Count - 1 do
       begin
+//ShowMessage(DocList.Strings[n]+','+BoolToStr(DocNoAppear(DocNoDir2DocNo(DocList.Strings[n])),true));
         if not DocNoAppear(DocNoDir2DocNo(DocList.Strings[n])) then Continue;
         FileList.Clear;
         If FileExists(ImageSavePath+CaseList.Strings[i]+'\'+DocList.Strings[n]+'\Context.dat') Then
@@ -6627,19 +8093,46 @@
       If FileExists(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat') Then
           FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat');
       //Showmessage(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat');
-      //Showmessage(FileList.Text);
+//Showmessage('FileList='+FileList.Text);
       PageCount := PageCount+FileList.Count;
-      //Showmessage(inttostr(PageCount));
+//Showmessage('PageCount='+inttostr(PageCount));
+      if (FWH_category='N') and (FIs_In_Wh='Y') then  //20170912 針對非入庫並當次掃描做頁數計算
+      begin
+        if FileExists(ImageSavePath+NowCaseno+'\EditedDocDir.dat') then
+        begin
+          ST1.LoadFromFile(ImageSavePath+NowCaseno+'\EditedDocDir.dat');
+          for n := 0 to ST1.Count - 1 do
+          begin
+            if ST1.Strings[n]=AttName then  Continue;
+//ShowMessage(ST1.Strings[n]+','+BoolToStr(DocNoIs_In_WH(DocNoDir2DocNo(ST1.Strings[n])),true));
+            if not DocNoIs_In_WH(DocNoDir2DocNo(ST1.Strings[n])) then
+            begin
+
+              FileList.Clear;
+              if FileExists(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\Context.dat') then
+              begin
+                FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\Context.dat');
+                for k := 0 to FileList.Count - 1 do
+                begin
+                  if not ISExistImg(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\'+FileList.Strings[k]) then
+                    PageCount := PageCount+1;
+                end;
+              end;
+            end;
+          end;
+        end;
+      end;
     end;
   Finally
   CaseList.Free;
   DocList.Free;
   FileList.Free;
+  ST1.Free
   end;
   Result := True;
 end;
 
-Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //��O�_�����n�x�s�v�������X
+Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼
 var
   i,n : Integer;
 begin
@@ -6659,14 +8152,14 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.BarCode2CaseID : String; //Barcode�̳W�h�নCaseID
+Function TCB_IMGPSScanX.BarCode2CaseID : String; //Barcode依規則轉成CaseID
 var
   i : Integer;
   iCaseID : String;
 begin
-  Result := ''; //�S���
+  Result := ''; //沒找到
   iCaseID := '';
-  for i := 1 to MpsBarcodeinf.Count-1  do
+  for i := 1 to MpsBarcodeinf.Count  do    //20180920 拿掉-1
   begin
     if (Length(MpsBarcodeinf.text[i]) = CaseIDLength) then
     begin
@@ -6677,12 +8170,12 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.BarCode2FormID : String; //Barcode�̳W�h�নFormID
+Function TCB_IMGPSScanX.BarCode2FormID : String; //Barcode依規則轉成FormID
 var
   i : Integer;
   FormID : String;
 begin
-  Result := ''; //�S���
+  Result := ''; //沒找到
   FormID := '';
   for i := 1 to MpsBarcodeinf.Count  do
   begin
@@ -6692,7 +8185,7 @@
       if not FormIDAppear(FormID) then
         FormID := '';
     end;
-    if (FormID <> '') and FormIDExists(FormID,False,0) then   //���i��FormID�N���}
+    if (FormID <> '') and FormIDExists(FormID,False,0) then   //有可用的FormID就離開
     begin
       Result := FormID;
       Break;
@@ -6707,8 +8200,12 @@
   if Path = '' then Exit;
   S := TStringlist.Create;
   try
-    S.Add(Case_loandoc);
-    S.SaveToFile(Path+'CaseIndex.dat');
+    try
+      S.Add(Case_loandoc);
+      S.SaveToFile(Path+'CaseIndex.dat');
+    except on E: Exception do
+    end;
+
   finally
   S.Free;
   end;
@@ -6743,6 +8240,27 @@
 end;
 
 
+procedure TCB_IMGPSScanX.ReduceLogFile; //20171011 必免log檔掌太大
+var
+  ST1:TStringlist;
+  I:integer;
+begin
+  ST1:=TStringList.Create;
+  if FileExists(LngPath+'IMGPSCheck.log') then
+  begin
+    ST1.LoadFromFile(LngPath+'IMGPSCheck.log');
+    if ST1.count>100000 then
+    begin
+      for I := 0 to 10000 do
+      begin
+        ST1.Delete(0);
+      end;
+      ST1.SaveToFile(LngPath+'IMGPSCheck.log');
+    end;
+  end;
+  ST1.Free;
+end;
+
 Procedure TCB_IMGPSScanX.ClearCaseIndex;
 begin
   AddCredit1RG.Enabled := False;
@@ -6770,7 +8288,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //���X�ثeDocNo������
+Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數
 var
   i : Integer;
   iDocNo : String;
@@ -6792,7 +8310,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //�ˬdFormID�O�_�s�b����
+Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡
 var
   i : Integer;
 begin
@@ -6807,7 +8325,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo�নDocNo(����)�ؿ�
+Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo轉成DocNo(份數)目錄
 var
   i : Integer;
   iDocNo : String;
@@ -6829,7 +8347,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(����)�ؿ��নDocNo
+Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo
 var
   v,ln : Integer;
 begin
@@ -6845,7 +8363,7 @@
     Result := DocNoDir
 end;
 
-Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(����)�ؿ��নindex
+Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index
 var
   i : Integer;
   CaseNo_List : TStringlist;
@@ -6888,6 +8406,18 @@
     end;
     if FileExists(SoPath+'Context.dat') then
       ZipFileList.Add(SoPath+'Context.dat');
+
+    AttContextList.Clear;
+    if FileExists(SoPath+'ATTContext.dat') then
+      AttContextList.LoadFromFile(SoPath+'ATTContext.dat');
+    for n := 0 to AttContextList.Count - 1 do
+    begin
+      ZipFileList.Add(SoPath+AttContextList.Strings[n]);
+    end;
+    if FileExists(SoPath+'ATTContext.dat') then
+      ZipFileList.Add(SoPath+'ATTContext.dat');
+
+
     if FileExists(SoPath+'Context_DocNo.dat') then
       ZipFileList.Add(SoPath+'Context_DocNo.dat');
     if FileExists(SoPath+'scanlist.dat') then
@@ -6915,6 +8445,12 @@
     if FileExists(SoPath+'UseCase.ini') then
       ZipfileList.Add(SoPath+'UseCase.ini');
 
+    if FileExists(SoPath+'FirstImg.zip') then//20170315 加的
+    begin
+      ZipfileList.Add(SoPath+'FirstImg.zip');
+    end;
+
+
     ExeCuteZip(DePath+ZipName,SoPath,ZipFileList,False,False);
     //Showmessage('111');
   finally
@@ -6922,7 +8458,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //���Y�B�n�v����
+Procedure TCB_IMGPSScanX.ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //壓縮遮罩影像檔
 var
   ZipFileList : TStringlist;
   n : Integer;
@@ -6956,7 +8492,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ParserPoint(S:String); //�ѪR�Q�r�I���r��
+Procedure TCB_IMGPSScanX.ParserPoint(S:String); //解析十字點的字串
 var
   PointList : TStringlist;
   Rect : TRect;
@@ -7001,7 +8537,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String;  //��FormID���X�Q�r�Ҧ�
+Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String;  //用FormID取出十字模式
 var
   Anchor : String;
 begin
@@ -7013,7 +8549,7 @@
   Result := Index2Anchor(Anchor);
 end;
 
-Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String;   //�Q�r�Ҧ� 0->NONE;1->ANCHOR;2->FRAME
+Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String;   //十字模式 0->NONE;1->ANCHOR;2->FRAME
 begin
   if Anchor = '0' then
     Result := 'NONE'
@@ -7026,7 +8562,36 @@
 procedure TCB_IMGPSScanX.ScanDuplexCBClick(Sender: TObject);
 begin
   ScanDuplex := ScanDuplexCB.Checked;
-  //R_W_ScanIni('W');       //user�n�D�令�w�]�ᤣ���
+  //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;
@@ -7040,26 +8605,26 @@
     if FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then
     begin
       S.LoadFromFile(ImageSavePath+CaseID+'\CaseIndex.dat');
-      //Format_ID := S.Strings[5];    //�D��� (�����渹or��O�渹or�O�渹�Xor�O�I�Ҹ�or��ץ���s)
+      //Format_ID := S.Strings[5];    //主鍵值 (報價單號or續保單號or保單號碼or保險證號or原案件受編)
       //Result := Format_ID;
-      //Handle_No := S.Strings[0];    //�g��N��
-      //Cen_Uid := S.Strings[1];      //�Q�O�HID
-      //Cen_Cliname := S.Strings[2];  //�Q�O�H�m�W
-      //Cen_Platno := S.Strings[3];   //����
-      //Case_Priority := S.Strings[4];//�ץ󵥯�
+      //Handle_No := S.Strings[0];    //經辦代號
+      //Cen_Uid := S.Strings[1];      //被保人ID
+      //Cen_Cliname := S.Strings[2];  //被保人姓名
+      //Cen_Platno := S.Strings[3];   //車號
+      //Case_Priority := S.Strings[4];//案件等級
     end;
   finally
   S.Free;
   end;
 end;
 
-Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //���O�N�X���O���O�ഫ  Mode 'ID':�N�X��W��;'NAME':�W����N�X
+Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //註記代碼註記類別轉換  Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼
 var
   i : Integer;
 begin
   if Mode = 'ID' then
   begin
-    Result := '�ۦ��J';
+    Result := _Msg('自行輸入');
     for i := 0 to ID_S.Count - 1 do
     begin
       if Str = ID_S.Strings[i] then
@@ -7083,7 +8648,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //��SQL�ȶ�J
+Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入
 var
   i : Integer;
 begin
@@ -7095,7 +8660,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //�����ί��ި���
+Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值
 var
   i,col,v,v1 : Integer;
   ColStr,DataStr: TStringList;
@@ -7156,7 +8721,7 @@
   DataStr.Free;
 end;
 
-Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //����w�����
+Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料
 Var i,n,Findindex : Integer;
     ColList,KeyColList,KeyList : TStringlist;
     Cols,Keycols,keys :String;
@@ -7178,7 +8743,7 @@
     KeyList.CommaText := KeyStr;
     if ColNo = 0 then
     begin
-      for i := 1 to TableList.Count -1 do  //��key�藍��
+      for i := 1 to TableList.Count -1 do  //找key對不對
       begin
         Findindex := i;
         for n := 0 to KeyColList.Count - 1 do
@@ -7188,16 +8753,16 @@
           keys := KeyList.Strings[n];
           //Showmessage(keys);
           //Showmessage(TableList.Strings[i]);
-          if GetSQLData(TableList,Keycols,i) = keys then //��.�~��
-          //if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then  //�b��ƦC�e��[!@! ��pos���覡�ӧﵽ�t��  //20130521�o�{���Ʒ|�����D
+          if GetSQLData(TableList,Keycols,i) = keys then //對.繼續
+          //if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then  //在資料列前後加!@! 用pos的方式來改善速度  //20130521發現找資料會有問題
             Continue
-          Else   //����.���}
+          Else   //不對.離開
           begin
             Find := False;
             Break;
           end;
         end;
-        if Find then Break;  // ���F���}
+        if Find then Break;  // 找到了離開
       end;
     end
     Else
@@ -7209,17 +8774,17 @@
         Find := True;
         Keycols := KeyColList.Strings[n];
         keys := KeyList.Strings[n];
-        //if GetSQLData(TableList,Keycols,i) = keys then //��.�~��
-        if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then  //�b��ƦC�e��[!@! ��pos���覡�ӧﵽ�t��
+        //if GetSQLData(TableList,Keycols,i) = keys then //對.繼續
+        if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then  //在資料列前後加!@! 用pos的方式來改善速度
             Continue
-        Else   //����.���}
+        Else   //不對.離開
         begin
           Find := False;
           Break;
         end;
       end;
     end;
-    if Find then //�����key
+    if Find then //有找到key
     begin
       for n := 0 to ColList.Count -1 do
       begin
@@ -7251,10 +8816,9 @@
     if Col =RCol then
       Result := RValue;
   end;
-
 end;
 
-Procedure TCB_IMGPSScanX.DataLoading(Loading:Boolean;UseTimer:Boolean);  //��Ƹ��J���n�����I�諸�ʧ@
+Procedure TCB_IMGPSScanX.DataLoading(Loading:Boolean;UseTimer:Boolean);  //資料載入中要停止點選的動作
 begin
   If Loading Then
   begin
@@ -7294,15 +8858,18 @@
   ErrlistForm : TErrlistForm;
   S : TStringlist;
   UpFormID : String;
+  Anchor : String;
 begin
-  ShowText := _Msg('�B�z�ˮ֥��Ѥ�,�еy��');
+  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);
@@ -7310,15 +8877,15 @@
     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('��ƤW�Ǥ�,�еy��');
+      ShowText := NowCaseNo+_Msg('資料上傳中,請稍候');
       DataLoading(True,True);
 
       if FMode = 'ISCAN' then
       begin
-        If Not TransCaseID(TransPath,NowCaseNo,True) Then  //�ǰe�ץ�
+        If Not TransCaseID(TransPath,NowCaseNo,True) Then  //傳送案件
         begin
           DataLoading(False,False);
           Exit;
@@ -7326,7 +8893,7 @@
       end
       Else
       begin
-        If Not TransCaseID(TransPath,NowCaseNo,True) Then  //�ǰe�ץ�
+        If Not TransCaseID(TransPath,NowCaseNo,True) Then  //傳送案件
         begin
           DataLoading(False,False);
           Exit;
@@ -7334,7 +8901,16 @@
       end;
       CaseHelpBtn.Visible := False;
       LoadImgFile;
-      Showmessage(NowCaseNo+_Msg('�ǰe����'));
+      if (FMode='NSCAN') or (FMode='DSCAN') then
+      begin
+        Showmessage(NowCaseNo+_Msg('影像上傳完成。此案已進入下一流程。'));
+      end;
+
+      if FMode='ESCAN' then
+      begin
+        Showmessage(NowCaseNo+_Msg('影像已補件完成。'));
+      end;
+
       DataLoading(False,False);
     end
     Else
@@ -7356,27 +8932,27 @@
 begin
   //if TreeView1.Selected = nil then Exit;
   //if TreeView1.Selected = NewTreeNode then Exit;
-  Displaypath := '';  //20130327 �ץ������渹�|���m�����D
+  Displaypath := '';  //20130327 修正報價單號會錯置的問題
   S := TStringlist.Create;
   try
     ClearView(1);
-    ShowText := CaseID+_Msg('�ˮ֤�,�еy��');
+    ShowText := CaseID+_Msg('檢核中,請稍候');
     DataLoading(True,True);
     For i := 0 to NewTreeNode.Count -1 do
     begin
       v := posend('-',NewTreenode.Item[i].Text);
       CaseID := Copy(NewTreenode.Item[i].Text,1,v-1);
-      ShowText := CaseID+_Msg('�ˮ֤�,�еy��');
+      ShowText := CaseID+_Msg('檢核中,請稍候');
       DataLoading(True,True);
-      if (NewTreenode.Item[i].ImageIndex <> 7) and (NewTreenode.Item[i].ImageIndex <> 5) then  //�ˮ֧��������A�ˮ�
+      if (NewTreenode.Item[i].ImageIndex <> 7) and (NewTreenode.Item[i].ImageIndex <> 5) then  //檢核完成的不再檢核
       begin
-        If OMRCheckCase(CaseID) then  //�����\
+        If OMRCheckCase(CaseID) then  //有成功
         begin
           S.Add('Y');
           S.SaveToFile(ImageSavePath+CaseID+'\OMRCheckOk.dat');
         end;
       end;
-      //MyTreeNode2ReFresh(CaseID);  //�쥻�OOMR��@�ץ�,��令OMR�����ץ� �ҥH�o�ӭnmark
+      //MyTreeNode2ReFresh(CaseID);  //原本是OMR單一案件,後改成OMR全部案件 所以這個要mark
     end;
     LoadImgFile;
     TreeView1Click(nil);
@@ -7384,7 +8960,7 @@
   finally
   S.Free;
   end;
-  Showmessage(_Msg('�ˮ֧���'));
+  Showmessage(_Msg('檢核完成'));
 end;
 
 procedure TCB_IMGPSScanX.ClearView(stkv:Integer);
@@ -7403,7 +8979,7 @@
   ISB1Click(ISB1);
 end;
 
-Function TCB_IMGPSScanX.DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //�e�X���W�٪�Tree
+Function TCB_IMGPSScanX.DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //畫出文件名稱的Tree
 Var
   i,n,m : Integer;
   DocNode,FormNode : TTreeNode;
@@ -7416,16 +8992,19 @@
   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;
+LogFile1.LogToFile(logTimeString+'產文件樹開始');
   try
     CaseNode.ImageIndex := 1;
     CaseNode.SelectedIndex := 1;
-    While CaseNode.Count > 0 do  //���R
+    While CaseNode.Count > 0 do  //全刪
     begin
       CaseNode.Item[0].Delete;
     end;
@@ -7440,24 +9019,55 @@
       //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;
+
+LogFile1.LogToFile(logTimeString+'FileList.Text='+FileList.CommaText);
+      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
+      Else
+        if not DocNoAppear(iDocNo) then Continue;  //20180925 Hong覺得應該加這段
+
+
+
+LogFile1.LogToFile(logTimeString+'WH_category='+FWH_category+',Is_In_Wh='+FIs_In_Wh+',FileList.Text='+FileList.CommaText);
+      if FileList.Count=0 then Continue;
+
       DocNoCopies := Strtoint(CaseDocNo_CopiesList.Strings[i]);
       DocNoPage := FileList.Count;
       iDocNo := DocNoDir2DocNo(CaseDocNoList.Strings[i]);
-      //Showmessage(iDocNo);
-      //Showmessage(DocNo2DocName(Caseno,iDocNo));
-      {if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(iDocNo))) or   //�J�w���y���ݫD�J�w���
+//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     //�D�J�w���y���ݤJ�w���
+         ((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]));
-      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('��'),[CaseDocNoList.Strings[i],DocNo2DocName(Caseno,iDocNo),DocNoCopies]));
-      DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('��'),[DocNo2DocName(Caseno,iDocNo),CaseDocNoList.Strings[i],DocNoCopies]));
+      //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(_Msg('%s{%s}-%d份'),[DocNo2DocName(Caseno,iDocNo),CaseDocNoList.Strings[i],DocNoCopies]));
 
       if GetUseCase('F',ImageSavePath+Caseno+'\',CaseDocNoList.Strings[i]) <> '' Then
       begin
@@ -7474,7 +9084,7 @@
         DocNode.ImageIndex := 2;
         DocNode.SelectedIndex := 2;
       end;
-      if ((Pos('ZZZZZ',DocNode.Text) = 0) and (Pos('YYYYY',DocNode.Text) = 0)) and (FileList.Count =0) then  //����
+      if ((Pos('ZZZZZ',DocNode.Text) = 0) and (Pos('YYYYY',DocNode.Text) = 0)) and (FileList.Count =0) then  //制式文件
       begin
         for n := 1 to LASTEST_FORM_INF_List.Count - 1 do
         begin
@@ -7486,27 +9096,28 @@
             FormID := iiFormID;
             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 := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+            FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
             FormNode.ImageIndex := 4;
             FormNode.SelectedIndex := 4;
             DocNode.AlphaSort(True);
           end;
         end;
       end
-      else if (Pos('ZZZZZ',DocNode.Text) > 0) or (Pos('YYYYY',DocNode.Text) > 0) then //�ۭq���
+      else if (Pos('ZZZZZ',DocNode.Text) > 0) or (Pos('YYYYY',DocNode.Text) > 0) then //自訂文件
       begin
         FormID := GetCustomFormID(ImageSavePath+Caseno+'\',CaseDocNoList.Strings[i]);
         //showmessage(FileList.Text);
         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 := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+        //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+        FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
         FormNode.ImageIndex := 4;
         FormNode.SelectedIndex := 4;
         DocNode.AlphaSort(True);
       end;
-      SortDocDir_FormID(Caseno,CaseDocNoList.Strings[i]);  //�ɦW��FormID�Ƨ�
+      SortDocDir_FormID(Caseno,CaseDocNoList.Strings[i]);  //檔名依FormID排序
 
       for n := 0 to FileList.Count - 1 do
       begin
@@ -7526,9 +9137,9 @@
             FormID := iiFormID;
             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 := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+            //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+            FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
             FormNode.ImageIndex := 4;
             FormNode.SelectedIndex := 4;
             DocNode.AlphaSort(True);
@@ -7541,7 +9152,7 @@
          // Application.ProcessMessages;
          // FormPage := GetFormIDPage(FileList,FormID);
          /// FormName := FormCode2FormName(Caseno,FormID);
-         /// FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('��'));
+         /// FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
          // FormNode.ImageIndex := 4;
          // FormNode.SelectedIndex := 4;
         //end;
@@ -7550,6 +9161,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')
@@ -7560,8 +9172,8 @@
       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),AttName,1]));
+      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[AttName,DocNo2DocName(Caseno,iDocNo),1]));
+      DocNode := TreeView1.Items.AddChild(CaseNode,Format(_Msg('%s{%s}-%d份'),[DocNo2DocName(Caseno,iDocNo),AttName,1]));
       DocNode.ImageIndex := 2;
       DocNode.SelectedIndex := 2;
       for n := 0 to FileList.Count - 1 do
@@ -7571,19 +9183,59 @@
         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 := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+          //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+          FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
           FormNode.ImageIndex := 4;
           FormNode.SelectedIndex := 4;
         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 := TreeView1.Items.AddChild(CaseNode,Format(_Msg('%s{%s}-%d份'),[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 := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
+
+            FormNode.ImageIndex := 4;
+            FormNode.SelectedIndex := 4;
+          end;
+        end;
+      end;
+    end;
+LogFile1.LogToFile(logTimeString+'產文件樹結束');
   Finally
   FileList.Free;
   CaseDocNoList.Free;
   CaseDocNo_CopiesList.Free;
   StrList.Free;
+  ST1.Free;
   end;
 end;
 
@@ -7608,6 +9260,48 @@
   end;
 end;
 
+procedure TCB_IMGPSScanX.initParameter;
+begin
+
+//  if FCaseNoLength=0 then
+//  begin
+//
+//  end;
+
+  if FFileSizeLimit = 0 then
+  begin
+    FFileSizeLimit := 5*1024;
+  end;
+
+
+  if FImgDPI=0 then
+  begin
+    FImgDPI := 300;
+    ScanDpi := FImgDPI;
+  end
+  else
+  begin
+    //FImgDPI := StrToInt(Value);
+    ScanDpi := FImgDPI;
+  end;
+
+  if FScanColor = 0 then
+  begin
+    ScanColor := ifBlackWhite;
+  end;
+
+  if FScanColor = 1 then
+  begin
+    ScanColor := ifGray256 ;
+    ScanGrayCB.Checked:=True;
+  end;
+
+  if FScanColor = 2 then
+  begin
+    ScanColor := ifTrueColor ;
+  end;
+end;
+
 procedure TCB_IMGPSScanX.PrtLbClick(Sender: TObject);
 var
     Width          : Double;
@@ -7618,9 +9312,9 @@
     PrtDialog : TPrintDialog;
     S : String;
 begin
-  ShowText := '�C�L��,�еy��';
+  ShowText := _Msg('列印中,請稍候');
   DataLoading(True,True);
-  Case2upload(NowCaseNo);   //���ͭ�v�����c
+  Case2upload(NowCaseNo);   //產生原影像結構
 
 
   //ontextList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\Context.dat');
@@ -7632,7 +9326,7 @@
     FileList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\Context.dat');
     DocDirList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\DocDir.dat');
 
-    InitialLanguage(PrintForm);  //���J�h��y��
+    InitialLanguage(PrintForm);  //載入多國語言
     PrintForm.CheckListBox1.Items.Clear;
     For i := 0 to FileList.Count - 1 do
     begin
@@ -7654,14 +9348,14 @@
         if PrintForm.CheckListBox1.Checked[i] then
         begin
           if S = '' then
-            S := S+FileList.Strings[i]
+            S := S+PrintForm.CheckListBox1.Items[i]
           Else
-            S := S+#13+FileList.Strings[i];
+            S := S+#13+PrintForm.CheckListBox1.Items[i];
         end;
       end;
       if S = '' then
       begin
-        Showmessage(_msg('�|����ܱ��C�L���'));
+        Showmessage(_msg('尚未選擇欲列印文件'));
         Exit;
       end
       Else
@@ -7702,6 +9396,7 @@
   OldCaseInfoForm.IN_WH_DocNoList := TStringlist.Create;
   OldCaseInfoForm.OldCopiesList := TStringlist.Create;
   try
+    InitialLanguage(OldCaseInfoForm); //載入多國語言
     OldCaseInfoForm.Notebook1.ActivePage := 'CaseInfo';
     OldCaseInfoForm.ImageSavePath := ImageSavePath;
     OldCaseInfoForm.CaseID := NowCaseNo;
@@ -7711,7 +9406,7 @@
     OldCaseInfoForm.FReWrite := FReWrite;
     OldCaseInfoForm.FOldCaseInfo := FOldCaseInfo;
 
-    //OldCaseInfoList  �ץ�s��@#,�~��@#,�~�ȧO@#,�O�_�¥�@#,���s��[����]@#,���s��[����] tab �ץ�s��@#,�~��@#,�~�ȧO@#,�O�_�¥�@#,���s��[����]@#,���s��[����]
+    //OldCaseInfoList  案件編號@#,年度@#,業務別@#,是否舊件@#,文件編號[份數]@#,文件編號[份數] tab 案件編號@#,年度@#,業務別@#,是否舊件@#,文件編號[份數]@#,文件編號[份數]
     OldCaseInfoList.StrictDelimiter := true;
     OldCaseInfoList.Delimiter := #9;
     OldCaseInfoList.DelimitedText := FOldCaseInfo;
@@ -7728,7 +9423,7 @@
       Year := Caseinfolist.Strings[1];
       BS_No := Caseinfolist.Strings[2];
       IS_Old := Caseinfolist.Strings[3];
-      With OldCaseInfoForm.ListView1.Items.Add do
+      With OldCaseInfoForm.OldCaseLV.Items.Add do
       begin
         Caption := CaseID;
         SubItems.Add(Year);
@@ -7778,7 +9473,7 @@
 
 
           iDocNoList.Add(NewDocDir);
-          Oldcopies := GetDocDirCopies(NowCaseNo+'\'+OldCaseInfoForm.UseCaseID,OldDocDir); //�®ת�CaseID ��b�s��CaseID�ؿ���
+          Oldcopies := GetDocDirCopies(NowCaseNo+'\'+OldCaseInfoForm.UseCaseID,OldDocDir); //舊案的CaseID 放在新案CaseID目錄裡
           if FileExists(ImageSavePath+NowCaseNo+'\'+OldCaseInfoForm.UseCaseID+'\CaseDocNo_Copies.dat') then
             iDocNo_CopiesList.Add(inttostr(Oldcopies))
           else
@@ -7789,9 +9484,9 @@
           end;
           MkDir(NewPath+NewDocDir);
         end;
-        SetUseCase('A',NewPath,NewDocDir,OldCaseInfoForm.UseCaseID,'');  //NewDocDir �q���Ӫ�
-        SetUseCase('A',OldPath,OldDocDir,'',NowCaseNo);      //OldDocDir �h���F
-        StringtoFile('Y',OldPath+'UseCase.dat');  //�n�W��
+        SetUseCase('A',NewPath,NewDocDir,OldCaseInfoForm.UseCaseID,'');  //NewDocDir 從哪來的
+        SetUseCase('A',OldPath,OldDocDir,'',NowCaseNo);      //OldDocDir 去哪了
+        StringtoFile('Y',OldPath+'UseCase.dat');  //要上傳
         for n := 0 to DocNoList.Count - 1 do
         begin
           if OldDocDir = DocNoList.Strings[n] then
@@ -7812,9 +9507,10 @@
       iDocNoList.SaveToFile(NewPath+'CaseDocNo.dat');
       iDocNo_CopiesList.SaveToFile(NewPath+'CaseDocNo_Copies.dat');
       DrawDocItem2(MyTreeNode1,NowCaseNo);
-      MyTreeNode1.Text := Format('%s-%d'+_Msg('��'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+      //MyTreeNode1.Text := Format('%s-%d'+_Msg('頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+      MyTreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
       NewTreeNodeRefresh;
-      ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
     end;
   finally
   OldCaseInfoForm.OldDocDirList.Free;
@@ -7831,7 +9527,52 @@
   end;
 end;
 
-procedure TCB_IMGPSScanX.LoadImgFile;  //���J�s������
+procedure TCB_IMGPSScanX.LastInitFormidListCreate(path: string);
+var
+  i:integer;
+  ST1:TStringList;
+  str1:string;
+begin
+//ShowMessage('path='+path);
+  ST1:=TStringList.Create;
+  ST1.LoadFromFile(path+'FormCode_Name.dat');
+  for I := 0 to ST1.Count - 1 do
+  begin
+    if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-1) then
+    begin
+      str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1);
+      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;  //載入新件及替換件
 Var
   i,v,v1,m : Integer;
   CasePage : integer;
@@ -7842,19 +9583,22 @@
 begin
   ClearView(1);
   PageLV.Clear;
+  AttListBox.Items.Clear;
+  AddAttFileLB.Enabled := False;
+  DelAttFileLB.Enabled := False;
   DisplayPath := '';
   ClearCaseIndex;
   CaseHelpBtn.Visible := False;
-  //Del_Sub_NothingPath(ImageSavePath);  //�M���ץ�ؿ��O�Ū�
+  //Del_Sub_NothingPath(ImageSavePath);  //清掉案件目錄是空的
   TreeView1.Items.Clear;
   NewTreeNode := nil;
   MyTreenode1 := nil;
   MyTreenode2 := nil;
   MyTreenode3 := nil;
-  NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-�@%d���@%d��'),[FModeName,0,0]));
+  NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-共%d筆共%d頁'),[FModeName,0,0]));
   NewTreenode.ImageIndex := 0;
   NewTreenode.SelectedIndex := 0;
-  Del_Sub_NothingPath(ImageSavePath);  //�M���ץ�ؿ��O�Ū�
+  Del_Sub_NothingPath(ImageSavePath);  //清掉案件目錄是空的
   GetCase_PageCount(CaseCount,PageCount);
   CaseList.Clear;
   if FileExists(ImageSavePath + 'CaseList.dat') then
@@ -7875,11 +9619,12 @@
     end;
 
     CasePage := GetCasePage(ImageSavePath,CaseList.Strings[i]);
-    MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d��'),[CaseList.Strings[i],CasePage]));
+//ShowMessage('CasePage='+IntToStr(CasePage));
+    MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[i],CasePage]));
     MytreeNode1.ImageIndex := 1;
     MytreeNode1.SelectedIndex := 1;
-    DrawDocItem2(MytreeNode1,CaseList.Strings[i]); //���X���W�٪���öǦ^�O�_���ӽЮѪ��v��
-    if Pos(_Msg('���t��'),CaseList.Strings[i]) > 0 then
+    DrawDocItem2(MytreeNode1,CaseList.Strings[i]); //長出文件名稱的樹並傳回是否有申請書的影像
+    if Pos(_Msg('未配號'),CaseList.Strings[i]) > 0 then
     begin
       MytreeNode1.ImageIndex := 5;
       MytreeNode1.SelectedIndex := 5;
@@ -7895,7 +9640,7 @@
       MyTreenode1.ImageIndex := 5;
       MyTreenode1.SelectedIndex := 5;
 
-      //AllEnforceLb.Visible := True; //�����j���e��
+      //AllEnforceLb.Visible := True; //全部強迫送件
     end;
   end;
   MyTreenode1 := nil;
@@ -7909,11 +9654,11 @@
   begin
     GetCase_PageCount(CaseCount,PageCount);
     v := Pos('-',NewTreeNode.Text);
-    NewTreeNode.Text := Format(_Msg('%s-�@%d���@%d��'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
+    NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
   end;
 end;
 
-procedure TCB_IMGPSScanX.LoadImgFile1;  //���J�s������
+procedure TCB_IMGPSScanX.LoadImgFile1;  //載入新件及替換件
 Var
   i,n,v,v1,m : Integer;
   p : integer;
@@ -7928,17 +9673,17 @@
   DisplayPath := '';
   ClearCaseIndex;
   CaseHelpBtn.Visible := False;
-  //Del_Sub_NothingPath(ImageSavePath);  //�M���ץ�ؿ��O�Ū�
+  //Del_Sub_NothingPath(ImageSavePath);  //清掉案件目錄是空的
   TreeView1.Items.Clear;
   NewTreeNode := nil;
   MyTreenode1 := nil;
   MyTreenode2 := nil;
   MyTreenode3 := nil;
-  NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-�@%d���@%d��'),[FModeName,0,0]));
+  NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-共%d筆共%d頁'),[FModeName,0,0]));
   NewTreenode.ImageIndex := 0;
   NewTreenode.SelectedIndex := 0;
 
-  Del_Sub_NothingPath(ImageSavePath);  //�M���ץ�ؿ��O�Ū�
+  Del_Sub_NothingPath(ImageSavePath);  //清掉案件目錄是空的
   GetCase_PageCount(CaseCount,PageCount);
   CaseList.Clear;
   if FileExists(ImageSavePath + 'CaseList.dat') then
@@ -7953,7 +9698,7 @@
     for m := 0 to CaseDocNoList.Count - 1 do
     begin
       iDocNo := CaseDocNoList.Strings[i];
-      MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d��'),[CaseList.Strings[n],p]));
+      MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[n],p]));
       MytreeNode1.ImageIndex := 1;
       MytreeNode1.SelectedIndex := 1;
     end;
@@ -7979,13 +9724,13 @@
         Cust_DocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\CustomDocNo.dat');
 
       P := ContextList.Count;
-      MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d��'),[CaseList.Strings[n],p]));
+      MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[n],p]));
       MytreeNode1.ImageIndex := 1;
       MytreeNode1.SelectedIndex := 1;
-      //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseList.Strings[n]); //���X���W�٪���öǦ^�O�_���ӽЮѪ��v��
-      DrawDocItem2(MytreeNode1,CaseList.Strings[n]); //���X���W�٪���öǦ^�O�_���ӽЮѪ��v��  20140820��
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseList.Strings[n]); //長出文件名稱的樹並傳回是否有申請書的影像
+      DrawDocItem2(MytreeNode1,CaseList.Strings[n]); //長出文件名稱的樹並傳回是否有申請書的影像  20140820改
 
-      if Pos(_Msg('���t��'),CaseList.Strings[n]) > 0 then
+      if Pos(_Msg('未配號'),CaseList.Strings[n]) > 0 then
       begin
         MytreeNode1.ImageIndex := 5;
         MytreeNode1.SelectedIndex := 5;
@@ -8001,7 +9746,7 @@
         MyTreenode1.ImageIndex := 5;
         MyTreenode1.SelectedIndex := 5;
 
-        //AllEnforceLb.Visible := True; //�����j���e��
+        //AllEnforceLb.Visible := True; //全部強迫送件
       end;
     end;
   end;
@@ -8019,11 +9764,37 @@
   begin
     GetCase_PageCount(CaseCount,PageCount);
     v := Pos('-',NewTreeNode.Text);
-    NewTreeNode.Text := Format(_Msg('%s-�@%d���@%d��'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
+    NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
   end;
 end;
 
-Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //�䦳�S�����ת����X
+procedure TCB_IMGPSScanX.LoadAttFile(CaseID:String); //載入附加檔案
+var
+  AttContextList : TStringlist;
+  i : Integer;
+begin
+  AttListBox.Clear;
+  AttContextList := TStringlist.Create;
+  try
+    if FileExists(ImageSavePath+CaseID+'\AttContext.dat') then
+    begin
+      AttContextList.LoadFromFile(ImageSavePath+CaseID+'\AttContext.dat');
+    end;
+    for i := 0 to AttContextList.Count - 1 do
+    begin
+      AttListBox.Items.Add(UTF8Decode(HTTPDEcode(AttContextList.Strings[i])));
+    end;
+  finally
+  AttContextList.Free;
+  end;
+end;
+
+function TCB_IMGPSScanX.logTimeString: String;
+begin
+Result:=FormatDateTime('yyyymmdd hh:mm:ss',now) +'  caseNo='+NowCaseno+'  ';
+end;
+
+Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼
 var
   i : Integer;
   DelBarCode : String;
@@ -8037,7 +9808,7 @@
     IF FindSQLData(FORM_INF_List,'T1.FORM_ID,T1.DIVISION','T1.FORM_ID',FormCode,0,FindResult) then
     begin
       S.CommaText := GetFindResult('T1.DIVISION');
-      for i := 0 to S.Count - 1 do   //�i�঳�h��
+      for i := 0 to S.Count - 1 do   //可能有多組
       begin
         if S.Strings[i] = iMode then
         begin
@@ -8051,7 +9822,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckAvailable:Boolean; //�ˬd�O�_�i�ϥΤ���
+Function TCB_IMGPSScanX.CheckAvailable:Boolean; //檢查是否可使用元件
 var
   SendData : String;
   Msg:String;
@@ -8059,20 +9830,20 @@
   MacID,IPStr,LegalDate :String;
 begin
   Result := False;
-  /////�U��MPSLIC_SCAN.lic //////
+  /////下載MPSLIC_SCAN.lic //////
   SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_SCAN.lic';
   if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+'MPSLIC_SCAN.lic',FReWrite,Memo1,False,DownImgStatus) then
   begin
-    Showmessage(_Msg('�ˬd���U�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
+    Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
     Exit;
   end;
-  /////�U��MPSLIC_SCAN.lic ///
+  /////下載MPSLIC_SCAN.lic ///
 
-  if CheckLicensebyIP_new(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,LegalDate,Msg,Nowcount,Totalcount,Lic_Idx) then  //�ˬd�O�_�v���U�L
+  if CheckLicensebyIP_new(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,LegalDate,Msg,Nowcount,Totalcount,Lic_Idx) then  //檢查是否己註冊過
   begin
     if (LegalDate <> '') and (ServerDate>LegalDate) and (Lic_Idx>(Totalcount)) then
     begin
-      Showmessage(_Msg('�w�g�W�L�i�ϥδ����ζW�X���v�ƽгs���t��'));
+      Showmessage(_Msg('已經超過可使用期限及超出授權數請連絡廠商'));
       Result := False;
       //Exit;
     end
@@ -8083,7 +9854,7 @@
   begin
     if Msg <> '' then
     begin
-      Showmessage(Format(_Msg('���U�ɦ����D,�гs���t�� ���~��]:%s'),[Msg]));
+      Showmessage(Format(_Msg('註冊檔有問題,請連絡廠商 錯誤原因:%s'),[Msg]));
       Result := false;
       Exit;
     end
@@ -8092,51 +9863,51 @@
       if (LegalDate <> '') and (ServerDate>LegalDate) and (NowCount =0 )  then
       begin
         Lic_Idx := 0;
-        Showmessage(_Msg('�w�g�W�L�i�ϥδ����гs���t��'));
+        Showmessage(_Msg('已經超過可使用期限請連絡廠商'));
         Result := False;
         //Exit;
       end
-      //else if (LegalDate = '') and (Nowcount >= Totalcount+10) then  //�W�L���U�ƶq
-      else if ((LegalDate = '') or ((LegalDate <> '') and (ServerDate>LegalDate)) ) and (Nowcount >= Totalcount) then  //�W�L���U�ƶq  20150717 yuu�������e��10��
+      //else if (LegalDate = '') and (Nowcount >= Totalcount+10) then  //超過註冊數量
+      else if ((LegalDate = '') or ((LegalDate <> '') and (ServerDate>LegalDate)) ) and (Nowcount >= Totalcount) then  //超過註冊數量  20150717 yuu說拿掉送的10個
       begin
         Lic_Idx := 0;
-        Showmessage(_Msg('�w�g�W�L���v�ƽгs���t��'));
+        Showmessage(_Msg('已經超過授權數請連絡廠商'));
         Result := False;
       end
-      Else  //���W�L���U�ƶq�n�g�J���U��
+      Else  //未超過註冊數量要寫入註冊檔
       begin
-        {if Messagedlg(_Msg('�z�|�����U���v�O�_�n�i����U??'),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then
+        {if Messagedlg(_Msg('您尚未註冊授權是否要進行註冊??'),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then
         begin
           Result := False;
           Exit;
         end;}
-        ShowText := _Msg('���v��,�еy��');
+        ShowText := _Msg('授權中,請稍候');
         AddLicense(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,Msg);
         Nowcount := Nowcount + 1;
         DataLoading(True,True);
 
-        /////�W��MPSLICSCAN.lic ////
+        /////上傳MPSLICSCAN.lic ////
         SendData:='data='+HTTPEncode(UTF8Encode(FData))+'@verify='+FVerify+'@work_no=PLN@file_name=MPSLIC_SCAN.lic';
         if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',LngPath+'MPSLIC_SCAN.lic',FReWrite,Memo1,False) then
         begin
-          Showmessage(_Msg('�ˬd���U��,�����o�Ϳ��~!!')+_MSg('���~�N�X:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
+          Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
           DataLoading(False,False);
           Exit;
         end;
         if memo1.Lines.Strings[0] = '1' then
         begin
-          Showmessage(_Msg('�ˬd���U��,�����o�Ϳ��~!!')+_Msg('���~��]:')+memo1.Lines.Strings[1]);
+          Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
           DataLoading(False,False);
           Exit;
         end
         Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
         begin
-          Showmessage(_Msg('�ˬd���U��,�����o�Ϳ��~!!')+_Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J'));
+          Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
           DataLoading(False,False);
           Exit;
         end;
-        /////�W��MPSLICSCAN.lic /////
-        //Sleep(30000);    //�Ĥ@�����U��30��  ������
+        /////上傳MPSLICSCAN.lic /////
+        //Sleep(30000);    //第一次註冊睡30秒  先不睡
         Result := True;
       end;
     end;
@@ -8144,9 +9915,9 @@
   if FileExists(LngPath+'MPSLIC_SCAN.lic') then
     DeleteFile(LngPath+'MPSLIC_SCAN.lic');
   if LegalDate = '' then
-    StatusBar1.Panels[4].Text := '���U��:'+MacID+' �Ѿl���U��:'+inttostr(Totalcount-Nowcount);
+    StatusBar1.Panels[4].Text := Format(_Msg('註冊號:%s 剩餘註冊數:%s'),[MacID,inttostr(Totalcount-Nowcount)]);
   if LegalDate <> '' then
-    StatusBar1.Panels[4].Text := '*���U��:'+MacID+'('+inttostr(Lic_Idx)+')'+' �Ѿl���U��:'+inttostr(Totalcount-Nowcount);
+    StatusBar1.Panels[4].Text := '*'+Format(_Msg('註冊號:%s 剩餘註冊數:%s'),[MacID+'('+inttostr(Lic_Idx)+')',inttostr(Totalcount-Nowcount)]);
 end;
 
 procedure TCB_IMGPSScanX.SmoothCBClick(Sender: TObject);
@@ -8158,7 +9929,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//���;B�n�v��
+Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像  20170639 發現沒用到
 var
   XT : TXMLTool;
   i : Integer;
@@ -8190,9 +9961,9 @@
       Anchor := FormID2Anchor(FormID);
       //ParserPoint(CropMpsV.FindPoint(Anchor));
       FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,Anchor);
-      if FileExists(CheckXmlPath+FormID+'.xml') then  //�S��Xml�N���ξB�n
+      if FileExists(CheckXmlPath+FWork_no+'\'+FormID+'.xml') then  //沒有Xml就不用遮罩
       begin
-        XT.LoadFromFile(CheckXmlPath+FormID+'.xml');
+        XT.LoadFromFile(CheckXmlPath+FWork_no+'\'+FormID+'.xml');
         if XT.SubNodes['/form/settype10/'].First then
         Repeat
           ColEName := XT.SubNodes['/form/settype10/'].NodeName;
@@ -8203,7 +9974,7 @@
             begin
               Site := XT.Node['/form/settype10/'+ColEName+'/'+nodename+'/'].Attributes['colxy'];
               SiteList.Add(Site);
-              Result := True;  //���]�w
+              Result := True;  //有設定
             end
             Else
             begin
@@ -8222,7 +9993,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //�O�_�OA3�n���v��
+Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像
 Var
   i,FormIDCount : Integer;
 begin
@@ -8240,13 +10011,15 @@
     end;
 
   end;
+
+//ShowMessage('FormIDCount='+IntToStr(FormIDCount)+#10#13+'MpsBarcodeinf.count='+IntToStr(MpsBarcodeinf.count));
   if FormIDCount = 2 then
   begin
     Result := True;
   end;
 end;
 
-Function TCB_IMGPSScanX.GetNewCustomDocNo(Path,DocName:String):String; //���X���ϥΪ��ۭq���N��
+Function TCB_IMGPSScanX.GetNewCustomDocNo(Path,DocName:String):String; //取出未使用的自訂文件代號
 var
   ini : Tinifile;
   Ct:Integer;
@@ -8263,8 +10036,14 @@
     Ct := ini.ReadInteger('CustomCount','Count',0);
     inc(Ct);
     DocNo := 'ZZZZZ'+Add_Zoo(Ct,3);
-    if FIs_In_Wh <> 'Y' then //���O�J�w���
+    if FIs_In_Wh <> 'Y' then //不是入庫文件
       DocNo := 'YYYYY'+Add_Zoo(Ct,3);
+
+    if (FMode='ESCAN') and (FWH_category='N')  then //20170914 補件下改成非入庫的自定文件
+    begin
+      DocNo := 'YYYYY'+Add_Zoo(Ct,3);
+    end;
+
     FormID := DocNo+'010101A';
     ini.WriteInteger('CustomCount','Count',Ct);
     ini.WriteString(DocNo,'FormID',FormID);
@@ -8279,7 +10058,7 @@
   NewDocNo :='ZZZZZ001';
   if FileExists(Path+'CustomDocNo.dat') then
   begin
-    ///   ZZZZZ001_�۩w���W��  001_�۩w���W��
+    ///   ZZZZZ001_自定文件名稱  001_自定文件名稱
     S.LoadFromFile(Path+'CustomDocNo.dat');
     for i := 0 to S.Count - 1 do
     begin
@@ -8289,7 +10068,7 @@
       C_Name := Copy(S.Strings[i],v+1,ln-v);
       if DocName = C_Name then
       begin
-        Showmessage('���W�٤w�s�b');
+        Showmessage('文件名稱已存在');
         Result := '';
         Exit;
       end;
@@ -8305,7 +10084,7 @@
   end; }
 end;
 
-Function TCB_IMGPSScanX.GetCustomDocName(Path,DocNo:String):String; //���X�۩w���W��
+Function TCB_IMGPSScanX.GetCustomDocName(Path,DocNo:String):String; //取出自定文件名稱
 var
   ini : Tinifile;
 begin
@@ -8317,7 +10096,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetCustomFormID(Path,DocNo:String):String; //���X�۩w���FormID
+Function TCB_IMGPSScanX.GetCustomFormID(Path,DocNo:String):String; //取出自定文件FormID
 var
   ini : Tinifile;
 begin
@@ -8329,7 +10108,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetCustomDocDir(Path,DocName:String):String; //���X�۩w���DocDir
+Function TCB_IMGPSScanX.GetCustomDocDir(Path,DocName:String):String; //取出自定文件DocDir
 var
   i,ct:integer;
   ini : Tinifile;
@@ -8356,7 +10135,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FindCustomDocName(Path,DocName:String):Boolean; //�M��۩w���W�٬O�_�s�b
+Function TCB_IMGPSScanX.FindCustomDocName(Path,DocName:String):Boolean; //尋找自定文件名稱是否存在
 var
   ini : Tinifile;
   Ct,i:Integer;
@@ -8380,7 +10159,42 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.DeleteCustomDocDir(Path,DocNo:String); //�R���۩w���DocNo
+procedure TCB_IMGPSScanX.DelAttFileLBClick(Sender: TObject);
+var
+  AttFile : String;
+  SelectCount : Integer;
+  i : Integer;
+begin
+  SelectCount := 0;
+  for i := 0 to AttListBox.Items.Count - 1 do
+  begin
+    if AttListBox.Selected[i] then
+      inc(SelectCount);
+  end;
+  if SelectCount = 0 then
+  begin
+    Showmessage(_Msg('請選擇要刪除的電子檔'));
+    Exit;
+  end;
+
+  if SelectCount > 0 then
+  begin
+    if Messagedlg(Format(_Msg('是否刪除這%d筆??'),[SelectCount]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+    for i := 0 to AttListBox.Items.Count - 1 do
+    begin
+      if AttListBox.Selected[i] then
+      begin
+        AttFile :=  HTTPEncode(UTF8Encode(AttListBox.Items.Strings[i]));
+        DeleteFile(ImageSavePath+NowCaseNo+'\'+AttFile);
+        SetAttContextList('D',-1,NowCaseno,AttFile);
+      end;
+    end;
+  end;
+  LoadAttFile(NowCaseNo);
+  Showmessage(_msg('刪除完成'));
+end;
+
+Procedure TCB_IMGPSScanX.DeleteCustomDocDir(Path,DocNo:String); //刪除自定文件DocNo
 var
   ini : Tinifile;
 begin
@@ -8392,7 +10206,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //�ǤJ��FormID�O�_�w�]�C�L
+Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印
 begin
   Result := False;
   If FindSQLData(FORM_INF_List,'T1.IS_PRINT','T1.FORM_ID',FormID,0,FindResult) Then
@@ -8426,7 +10240,7 @@
           Printer object. Otherwise, if UsePrintJob is True, the Title
           property of the TDibGraphicPrinter object is used to specify the
           job name. }
-        Printer.Title := '�v���C�L';
+        Printer.Title := _Msg('影像列印');
       end;
 
       IF (Page mod 2) = 1 Then
@@ -8436,7 +10250,7 @@
 
       ImageScrollBox1.DisplayedGraphic.Canvas.Font.Size := 24;
 
-      //ImageScrollBox1.DisplayedGraphic.Canvas.TextOut(20,20, _Msg('�C�L�H��:')+LoginID+' '+_Msg('�C�L����:')+FUserUnit+' '+_Msg('�C�L���:')+DateTime);
+      //ImageScrollBox1.DisplayedGraphic.Canvas.TextOut(20,20, _Msg('列印人員:')+LoginID+' '+_Msg('列印分行:')+FUserUnit+' '+_Msg('列印日期:')+DateTime);
 
       GraphicPrinter.Print(ImageScrollBox1.DisplayedGraphic);
 
@@ -8451,7 +10265,7 @@
   procedure PrintWithAutoPrintJob;
   begin
       GraphicPrinter.UsePrintJob := True;
-      GraphicPrinter.Title       := '�v���C�L';
+      GraphicPrinter.Title       := _Msg('影像列印');
       GraphicPrinter.Print(ImageScrollBox1.Graphic);
   end;
 
@@ -8459,6 +10273,7 @@
   S := TStringlist.Create;
   GraphicPrinter := TDibGraphicPrinter.Create;
   PrtDialog := TPrintDialog.Create(self);
+  //PrtDialog.Copies:=99;
   try
     IF PrtDialog.Execute Then
     begin
@@ -8480,7 +10295,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //��X�̷s��DocDir
+Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir
 var
   i : Integer;
   DocNoList,FileList : TStringlist;
@@ -8505,7 +10320,49 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.Create_Cust_DocDir(CaseID:String); //���ͥ~���ǤJ�����N���Φ۩w���
+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
   i,n : Integer;
   C_DocNoList,C_DocNameList : TStringlist;
@@ -8527,7 +10384,7 @@
       for i := 0 to C_DocNoList.Count - 1 do
       begin
         DocNo := C_DocNoList.Strings[i];
-        //�¥󤣪��X���~�����X��
+        //舊件不長出錯誤的文件出來
         if (FIs_OldCase = 'Y') and (FWork_no='HLN') and (DocNo = FormCode2DocNo('10000001011112A')) then
           Continue;
         NowDocNo_Ct := GetDocNoCount(CaseID,DocNo);
@@ -8541,9 +10398,9 @@
           end;
           if DocNo_CT <= NowDocNo_Ct then
             Continue;
-          if DirectoryExists(ImageSavePath+CaseID+'\'+DocNo+'('+inttostr(DocNo_Ct)+')') then  //�s�b�F
+          if DirectoryExists(ImageSavePath+CaseID+'\'+DocNo+'('+inttostr(DocNo_Ct)+')') then  //存在了
             Continue;
-          if (DocNo_Ct = 1) and DirectoryExists(ImageSavePath+CaseID+'\'+DocNo) then  //�s�b�F  20140327�[
+          if (DocNo_Ct = 1) and DirectoryExists(ImageSavePath+CaseID+'\'+DocNo) then  //存在了  20140327加
             Continue;
           DocDir := DocNo2DocNoDir(ImageSavePath+CaseID+'\',DocNo)
 
@@ -8557,7 +10414,7 @@
           MkDir(ImageSavePath+CaseID+'\'+DocDir);
           SetDocNoList('A',-1,CaseID,DocDir,'1');
         end;
-        if not DocNoNeedDiv(DocNo) then   //���������q��
+        if not DocNoNeedDiv(DocNo) then   //不分份的秀數
           SetDocDirCopies(CaseID,DocNo,GetCustomDocNoCount(DocNo));
 
       end;
@@ -8596,7 +10453,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.OldCasetoNewCase(CaseID:String); //�N�®ץ����ন�s�W�h
+Procedure TCB_IMGPSScanX.OldCasetoNewCase(CaseID:String); //將舊案份數轉成新規則
 var
   i,n : Integer;
   C_DocNoList,C_DocNameList : TStringlist;
@@ -8624,7 +10481,7 @@
       for i := 0 to DocNoList.Count - 1 do
       begin
         //DocNo := DocNoList.Strings[i];
-        DocNo := DocNoDir2DocNo(DocNoList.Strings[i]);  //20140812 �]���®׿��~��|�X�{DocnoDir
+        DocNo := DocNoDir2DocNo(DocNoList.Strings[i]);  //20140812 因轉舊案錯誤件會出現DocnoDir
         DocNo_Ct := 0;
         for n := 0 to C_DocNoList.Count - 1 do
         begin
@@ -8665,7 +10522,7 @@
 
 end;
 
-Procedure TCB_IMGPSScanX.ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//�N�®ת����~FormID�勵�T��FormID
+Procedure TCB_IMGPSScanX.ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//將舊案的錯誤FormID改正確的FormID
 var
   DocNoList,FileList :TStringlist;
   EDocNo,CDocNo,iDocNo,iFormID :String;
@@ -8685,7 +10542,7 @@
       EDocDir := DocNoList.Strings[i];
       iDocNo := DocNoDir2DocNo(DocNoList.Strings[i]);
       iPath := ImageSavePath+CaseID+'\'+EDocDir+'\';
-      if FileExists(iPath+'Context.dat') then  //20140909�|�[�o�ӧP�_�y���ۭq�����S�v���|�X���~�T��
+      if FileExists(iPath+'Context.dat') then  //20140909漏加這個判斷造成自訂文件但沒影像會出錯誤訊息
         FileList.LoadFromFile(iPath+'Context.dat');
       for n := 0 to FileList.Count - 1 do
       begin
@@ -8706,7 +10563,7 @@
         MoveFile(PWideChar(iPath),PWideChar(iiPath));
         DocNoList.Strings[i] := StringReplace(DocNoList.Strings[i],iDocNo,CDocNo,[rfReplaceAll]);
         DocNoList.SaveToFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
-        //SetRecordEditedDocDir('A',CaseID,CDocNo);  //20140918 yuu���令������
+        //SetRecordEditedDocDir('A',CaseID,CDocNo);  //20140918 yuu說改成不紀錄
       end;
     end;
   finally
@@ -8715,7 +10572,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //�O���Q���ʪ����ؿ�  'A:�[�JD:�R��'
+Procedure TCB_IMGPSScanX.SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //記錄被異動的文件目錄  'A:加入D:刪掉'
 var
   i : Integer;
   Exists : Boolean;
@@ -8805,7 +10662,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo�O�_���J�w���
+Function TCB_IMGPSScanX.GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo是否為入庫文件
 var
   i :Integer;
 begin
@@ -8820,7 +10677,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //�NDocDir�̪����s���Ƨ�
+Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序
 var
   i,n,v,ln : Integer;
   Exists:Boolean;
@@ -8835,13 +10692,13 @@
     if FileExists(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat') then
     begin
       FileList.LoadFromFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat');
-      ////���XFormID/////
+      ////取出FormID/////
       for i := 0 to FileList.Count - 1 do
       begin
         FormID := FileName2FormCode(FileList.Strings[i]);
-        if (FormID = 'Attach') or (FormID = 'S_Attach') then Continue;   //�������}
+        if (FormID = 'Attach') or (FormID = 'S_Attach') then Continue;   //附件離開
         Exists := False;
-        for n := 0 to FormIDList.Count - 1 do //�d�@�UFORMID�O�_�w�g�s�b�F
+        for n := 0 to FormIDList.Count - 1 do //查一下FORMID是否已經存在了
         begin
           if FormID = FormIDList.Strings[n] then
           begin
@@ -8853,7 +10710,7 @@
           FormIDList.Add(FormID);
       end;
       FormIDList.Sort;
-      //�ƧǫᲣ�n��W���M��
+      //排序後產要更名的清單
       for i := 0 to FormIDList.Count - 1 do
       begin
         iFormID := FormIDList.Strings[i];
@@ -8866,7 +10723,7 @@
         end;
       end;
       FileList.Clear;
-      //��W���s���Ǫ��ɦW
+      //更名成新順序的檔名
       for i := 0 to SortFileList.Count - 1 do
       begin
         v := Pos(',',SortFileList.Strings[i]);
@@ -8876,7 +10733,7 @@
         RenameFile(ImageSavePath+CaseID+'\'+DocDir+'\'+OldName,ImageSavePath+CaseID+'\'+DocDir+'\'+NewName);
         FileList.Add(NewName);
       end;
-      //�h��@�}�Y
+      //去掉@開頭
       for i := 0 to FileList.Count - 1 do
       begin
         OldName := FileList.Strings[i];
@@ -8915,12 +10772,12 @@
   //TreeView1click(nil);
 end;
 
-Function TCB_IMGPSScanX.DocNoIs_In_WH(DocNo:String):Boolean; //DocNo�O�_���J�w���
+Function TCB_IMGPSScanX.DocNoIs_In_WH(DocNo:String):Boolean; //DocNo是否為入庫文件
 var
   i : Integer;
 begin
   Result := False;
-  if (Copy(DocNo,1,5)='ZZZZZ') then //20140728 yuu ���ۭq���]�O�J�w���
+  if (Copy(DocNo,1,5)='ZZZZZ') then //20140728 yuu 說自訂文件也是入庫文件
   begin
     Result := True;
     Exit;
@@ -8953,6 +10810,7 @@
       for i := 0 to FileList.Count - 1 do
       begin
         Docno := FormCode2DocNo(FileName2FormCode(FileList.Strings[i]));
+//ShowMessage('Docno='+Docno);
         DocNoList.Add(DocNo);
         Exists := False;
         for n := 0 to CaseDocNoList.Count - 1 do
@@ -8966,6 +10824,7 @@
           CaseDocNo_CopiesList.Add('1');
         end;
       end;
+//ShowMessage('CreateCaseNeedData  DocNoList='+DocNoList.Text);
       DocNoList.SaveToFile(Path+'DocDir.dat');
       CaseDocNoList.SaveToFile(Path+'CaseDocNo.dat');
       CaseDocNo_CopiesList.SaveToFile(Path+'CaseDocNo_Copies.dat')
@@ -8992,7 +10851,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //�ˬd��ܪ��v���O�_���]�t�Q�ޥΪ��v��
+Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像
 var
   i : Integer;
   iISBName : String;
@@ -9042,33 +10901,33 @@
       OldCasePath := Path+OldCaseID+'\';
       if FileExists(OldCasePath+'UseCase.dat') and FileExists(OldCasePath+'UseCase.ini') then
       begin
-        //////����/////
+        //////壓檔/////
         //ZipMainFile(Path,Path,'Img.zip');
 
-        ////�W��/////
+        ////上傳/////
         SendData:='data='+HTTPEncode(UTF8Encode(Data))+'&verify='+Verify+'&other_case_no='+OldCaseID;
         //Showmessage(FUrl+'service/slic/SLIC02/useOther?'+senddata);
         if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/useOther',SendData,'file',OldCasePath+'UseCase.ini',FReWrite,Memo1,False) then
         begin
-          Showmessage(Format(_Msg('�ǰe�¥�s��(%s)�ɮ׮�,�����o�Ϳ��~!!'+_Msg('���~�N�X:')),[OldCaseID])+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
+          Showmessage(Format(_Msg('傳送舊件編號(%s)檔案時,網路發生錯誤!!'),[OldCaseID])+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
           Result := False;
           Exit;
         end;
         if memo1.Lines.Strings[0] = '1' then
         begin
-          Showmessage(Format(_Msg('�ǰe�¥�s��(%s)�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~��]:'),[OldCaseID])+memo1.Lines.Strings[1]);
+          Showmessage(Format(_Msg('傳送舊件編號(%s)檔案時,網路發生錯誤!!'),[OldCaseID])+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
           Result := False;
           Exit;
         end
         Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
         begin
-          Showmessage(Format(_Msg('�ǰe�¥�s��(%s)�ɮ׮�,�����o�Ϳ��~!!')+_Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J'),[OldCaseID]));
+          Showmessage(Format(_Msg('傳送舊件編號(%s)檔案時,網路發生錯誤!!'),[OldCaseID])+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
           Result := False;
           Exit;
         end;
       end;
 
-  ////�W��////
+  ////上傳////
     end;
   finally
   OldCaseInfoList.Free;
@@ -9084,46 +10943,199 @@
   SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID;
   If not ProcessServlet(HTTPSClient,FURL+'service/imgpsc/IMGPSC06/printlog',SendData,FReWrite,Memo1,False) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
   end;
 end;
 
-Function TCB_IMGPSScanX.FormIDAppear(FormID:String):Boolean; //FormID�O�_�i�X�{
+Function TCB_IMGPSScanX.GetFtpinfo(CaseID,Action:String):Boolean;
+var
+  SendData : String;
+
+  Procedure DecodeFtpInfo(EncryStr:String);
+  var
+    FtpStr : String;
+    ftpinfoList : TStringlist;
+  begin
+    if EncryStr = '' then Exit;
+    ftpinfoList := TStringlist.Create;
+    try
+      FtpStr := En_DecryptionStr_Base64('D',EncryStr,MpsKey);
+      SplitString('!@!',FtpStr,ftpinfoList);
+      if ftpinfoList[0] = 'ftps' then
+        FFtpProtocol := fpftps
+      else if ftpinfoList[0] = 'ftp' then
+        FFtpProtocol := fpftp;
+      FFtpIP := ftpinfoList[1];
+      FFtpPort := strtoint(ftpinfoList[2]);
+      FFtpID := ftpinfoList[3];
+      FFtpPwd := ftpinfoList[4];
+
+    finally
+    ftpinfoList.Free;
+    end;
+  end;
+begin
+  Result := True;
+  SendData:='product='+FWork_no+'&case_no='+CaseID+'&department='+FUserUnit+'&action='+Action;
+  If not ProcessServlet_FormData(HTTPSClient,FURL+'service/imgpsc/IMGPSC02/ftps',SendData,FReWrite,Memo1,False) Then
+  begin
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    Result := False;
+    Exit;
+  end;
+  IF (memo1.Lines.Strings[0] = '1') Then
+  begin
+    if memo1.Lines.Strings[1]='nodata' then   //nodata 為正常可繼續的判斷
+    begin
+      TransMode := tsNone;
+      Result := True;
+      Exit;
+    end
+    else
+    begin
+      HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
+      Result := False;
+      Exit;
+    end;
+  end
+  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
+  begin
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
+    Result := False;
+    Exit;
+  end
+  else if (memo1.Lines.Strings[0] <> '0') then//不認識的字串
+  begin
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[0];
+    Result := False;
+    Exit;
+  end;
+  TransMode := tsHttp;
+  FFtpExtraPath := '';
+
+  if memo1.Lines.Strings[0] = '0' then
+  begin
+    if memo1.Lines.Strings[2] = 'Y' then   //要使用FTP
+      TransMode := tsFtp;
+    if memo1.Lines.Count > 3 then
+    begin
+      FFtpExtraPath := memo1.Lines.Strings[3];
+      DecodeFtpInfo(memo1.Lines.Strings[4]);
+    end;
+  end;
+end;
+
+Procedure TCB_IMGPSScanX.SetFtpInfo;     //餵入FTP資訊
+begin
+  IIS_Ftp.Display1 := Display1;
+  IIS_Ftp.FTPSClient1 := FTPSClient1;
+  IIS_Ftp.ElMemoryCertStorage := ElMemoryCertStorage;
+  IIS_Ftp.Display1 := Display1;
+  IIS_Ftp.Ftpip := FFtpIP;
+  IIS_Ftp.Ftpuserid := FFtpID;
+  IIS_Ftp.FtpPwd := FFtpPwd;
+  IIS_Ftp.FtpPath := FFtpRootPath;
+  IIS_Ftp.FtpPort := FFtpPort;
+  IIS_Ftp.FtpSSL := True;
+  IIS_Ftp.FtpPassive := True;
+  if FFtpProtocol = fpftp then
+     IIS_Ftp.FtpSSL := False;
+  IIS_Ftp.FtpEncryptDataChannel := true;
+  FTPSClient1.OnControlReceiveAsString := IIS_Ftp.EventHandlers.ControlReceiveAsString;
+  FTPSClient1.OnControlSendAsString := IIS_Ftp.EventHandlers.ControlSendAsString;
+  FTPSClient1.OnSSLError := IIS_Ftp.EventHandlers.SSLError;
+  FTPSClient1.OnCertificateValidate := IIS_Ftp.EventHandlers.CertificateValidate;
+  FTPSClient1.OnTextDataLine := IIS_Ftp.EventHandlers.TextDataLine;
+
+  {Showmessage(Format('Ftpip:%s'+#13
+              +'Ftpid:%s'+#13
+              +'Ftppwd:%s'+#13
+              +'Ftppath:%s'+#13
+              +'Ftpport:%s'+#13
+              ,[FFtpIP,FFtpid,FFtpPwd,Ftppath,inttostr(Ftpport)]));}
+end;
+
+Function TCB_IMGPSScanX.FtpCaseComplete(SendData:String):Boolean;
+begin
+  Result := True;
+  If not ProcessServlet_FormData(HTTPSClient,FURL+'service/imgpsc/IMGPSC02/caseupload',SendData,FReWrite,Memo1,False) Then
+  begin
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    Result := False;
+    Exit;
+  end;
+  IF (memo1.Lines.Strings[0] = '1') or (memo1.Lines.Strings[0] <> '0') Then
+  begin
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
+    Result := False;
+    Exit;
+  end
+  Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
+  begin
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
+    Result := False;
+    Exit;
+  end;
+end;
+
+Function TCB_IMGPSScanX.FormIDAppear(FormID:String):Boolean; //FormID是否可出現
 var
   iDocNo : String;
 begin
   Result := True;
   iDocNo := FormCode2DocNo(FormID);
-  if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(iDocNo))) or   //�J�w���y���ݫD�J�w���
-     ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(iDocNo)))) and      //�D�J�w���y���ݤJ�w���
+  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;
+
+  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�O�_�i�X�{
+Function TCB_IMGPSScanX.DocNoAppear(DocNo:String):Boolean;   //DocNo是否可出現
 begin
   Result := True;
-  if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(DocNo)) or (DocNo ='S_Attach')) or   //�J�w���y���ݫD�J�w���
-     ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(DocNo)) or (DocNo ='Attach') )) {and      //�D�J�w���y���ݤJ�w���
+
+  {if (((FIs_In_Wh  = 'Y') and (not DocNoIs_In_WH(DocNo)) or (DocNo ='S_Attach')) or   //入庫掃描不看非入庫文件
+     ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(DocNo)) or (DocNo ='Attach') )) {and      //非入庫掃描不看入庫文件
+     (Copy(DocNo,1,5)<>'ZZZZZ')} {then
+       {Result := False;}
+  //20181031 應該要換成下面的判斷比較對,FIs_In_Wh傳空的話才會出全部
+  if (((FIs_In_Wh  = 'Y') and ((not DocNoIs_In_WH(DocNo)) or (DocNo ='S_Attach'))) or   //入庫掃描不看非入庫文件
+     ((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�ƶq
+Function TCB_IMGPSScanX.GetDocNoCount(CaseID,DocNo:String):Integer; //取DocNo數量
 var
   i : Integer;
   Doc_Ct:Integer;
@@ -9153,12 +11165,12 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetDocDirCopies(CaseID,DocDir:String):Integer; //��DocDir�ƶq
+Function TCB_IMGPSScanX.GetDocDirCopies(CaseID,DocDir:String):Integer; //取DocDir數量
 var
   i : Integer;
   DocNoList,DocNo_CopiesList : TStringlist;
 begin
-  Result := 1;  //�w�]�^��1  //20140521 ��0�令1
+  Result := 1;  //預設回傳1  //20140521 由0改成1
   DocNoList := TStringlist.Create;
   DocNo_CopiesList := TStringlist.Create;
   try
@@ -9183,7 +11195,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //�ק�DocDir����
+Procedure TCB_IMGPSScanX.SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //修改DocDir份數
 var
   i : Integer;
   DocNoList,DocNo_CopiesList : TStringlist;
@@ -9211,7 +11223,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //���O���̪�DocDir����
+Function TCB_IMGPSScanX.GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //取記錄裡的DocDir份數
 var
   i,n,v,v1 : Integer;
   OldCaseInfoList,Caseinfolist : TStringlist;
@@ -9221,7 +11233,7 @@
   OldCaseInfoList := TStringlist.Create;
   Caseinfolist := TStringlist.Create;
   try
-    //OldCaseInfoList �ץ�s��@#,�~��@#,�~�ȧO@#,�O�_�¥�@#,Data@#,Verify@#,���s��[����]@#,���s��[����] tab �ץ�s��@#,�~��@#,�~�ȧO@#,�O�_�¥�@#,Data@#,Verify@#,���s��[����]@#,���s��[����]
+    //OldCaseInfoList 案件編號@#,年度@#,業務別@#,是否舊件@#,Data@#,Verify@#,文件編號[份數]@#,文件編號[份數] tab 案件編號@#,年度@#,業務別@#,是否舊件@#,Data@#,Verify@#,文件編號[份數]@#,文件編號[份數]
     OldCaseInfoList.StrictDelimiter := true;
     OldCaseInfoList.Delimiter := #9;
     OldCaseInfoList.DelimitedText := FOldCaseInfo;
@@ -9263,7 +11275,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetCustomNameCount(CustomName:String):Integer;   //���~�Ǫ��W�ټƶq
+Function TCB_IMGPSScanX.GetCustomNameCount(CustomName:String):Integer;   //取外傳的名稱數量
 var
   i,ct : Integer;
   C_DocNameList : TStringlist;
@@ -9287,7 +11299,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetCustomDocNoCount(Docno:String):Integer;   //���~�Ǫ�DocNo�ƶq
+Function TCB_IMGPSScanX.GetCustomDocNoCount(Docno:String):Integer;   //取外傳的DocNo數量
 var
   i,ct : Integer;
   C_DocNoList : TStringlist;
@@ -9326,7 +11338,35 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CaseDelete_Enable(CaseID:String):Boolean;  //�ץ�i�_�Q�R��
+Function TCB_IMGPSScanX.ISDivPageFormID(FormID:String):Boolean;
+var
+  i : Integer;
+begin
+  Result := False;
+
+  for i := 0 to DivPageFormIDList.Count - 1 do
+  begin
+    if FormID = DivPageFormIDList.Strings[i] then
+    begin
+      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;
+
+Function TCB_IMGPSScanX.CaseDelete_Enable(CaseID:String):Boolean;  //案件可否被刪除
 var
   i : Integer;
   CaseDocNoList : TStringlist;
@@ -9338,7 +11378,7 @@
       CaseDocNoList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
     for i := 0 to CaseDocNoList.Count - 1 do
     begin
-      if GetUseCase('T',DisplayPath,CaseDocNoList.Strings[i]) <> '' then   //���Q�ޥΨ���
+      if GetUseCase('T',DisplayPath,CaseDocNoList.Strings[i]) <> '' then   //有被引用走的
         Result := False;
     end;
 
@@ -9347,7 +11387,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //���ʭ���
+Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //移動頁數
 var
   i,n,inx:Integer;
   FList,D_Flist:TStringlist;
@@ -9405,7 +11445,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //��Բ��ʭ���
+Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數
 var
   i,n,inx:Integer;
   FList,D_Flist:TStringlist;
@@ -9463,7 +11503,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //�O���ޥΨ�L�ץ� A:�[�J D:�R��
+Procedure TCB_IMGPSScanX.SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //記錄引用其他案件 A:加入 D:刪掉
 var
   ini : Tinifile;
 begin
@@ -9484,7 +11524,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:���Q�ޥ� To:�ޥ�
+Function TCB_IMGPSScanX.GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:取被引用 To:引用
 var
   ini : Tinifile;
 begin
@@ -9508,16 +11548,18 @@
 var
   i,n:Integer;
   OldPath,NewPath,DocDir : String;
-  OldFile,NewFile : String;
+  OldFile,NewFile,AttFile : String;
   DocNoList,FileList:TStringlist;
   iFileList,iFile_DocNoList :TStringlist;
   iDocDirList : TStringlist;
+  iAttFileList : TStringlist;
 begin
   DocNoList := TStringlist.Create;
   FileList := TStringlist.Create;
   iFileList := TStringlist.Create;
   iFile_DocNoList := TStringlist.Create;
   iDocDirList := TStringlist.Create;
+  iAttFileList := TStringlist.Create;
   try
     OldPath := ImageSavePath+CaseID+'\';
     NewPath := ImageSavePath+CaseID+'\Upload\';
@@ -9532,7 +11574,15 @@
     CopyFile(PWideChar(OldPath+'UseCase.ini'),PWideChar(NewPath+'UseCase.ini'),False);
 
     if FileExists(OldPath+'CaseDocNo.dat') then
+    begin
       DocNoList.LoadFromFile(OldPath+'CaseDocNo.dat');
+    end
+    else
+    begin
+      DocNoList.SaveToFile(OldPath+'CaseDocNo.dat');
+      CopyFile(PWideChar(OldPath+'CaseDocNo.dat'),PWideChar(NewPath+'CaseDocNo.dat'),False);
+    end;
+
     for i := 0 to DocNoList.Count-1 do
     begin
       DocDir := DocNoList.Strings[i];
@@ -9594,6 +11644,18 @@
         end;
       end;
     end;
+    OldPath := ImageSavePath+CaseID+'\';
+    if FileExists(OldPath+'AttContext.dat') then
+    begin
+      iAttFileList.LoadFromFile(OldPath+'AttContext.dat');
+      for n := 0 to iAttFileList.Count - 1 do
+      begin
+        AttFile := iAttFileList.Strings[n];
+        CopyFile(PWideChar(OldPath+AttFile),PWideChar(NewPath+AttFile),False);
+      end;
+      iAttFileList.SaveToFile(NewPath+'AttContext.dat');
+    end;
+
 
     iFileList.SaveToFile(NewPath+'Context.dat');
     iFile_DocNoList.SaveToFile(NewPath+'Context_DocNo.dat');
@@ -9601,6 +11663,7 @@
 
   finally
   iFileList.Free;
+  iAttFileList.Free;
   iFile_DocNoList.Free;
   DocNoList.Free;
   FileList.Free;
@@ -9611,20 +11674,35 @@
 var
   i,n : Integer;
   DocDir:String;
-  OldFile,NewFile:String;
+  OldFile,NewFile,AttFile:String;
   DocNoList,FileList : TStringlist;
   iFileList,iFile_DocDirList :TStringlist;
+  iAttFileList :TStringlist;
+  AA,AA2,AA3,AA4:Boolean;
 begin
-  if (not FileExists(SoDir+'CaseDocNo.dat')) or (not FileExists(SoDir+'DocDir.dat')) then   //�I�e���|�S�o����
-    CreateCaseNeedData(SoDir);   //���ͥ��n����r��
-  CopyFile(PWideChar(SoDir+'CaseDocNo.dat'),PWideChar(DeDir+'CaseDocNo.dat'),False);
-  CopyFile(PWideChar(SoDir+'CaseDocNo_Copies.dat'),PWideChar(DeDir+'CaseDocNo_Copies.dat'),False);
-  CopyFile(PWideChar(SoDir+'CustomDocNo.ini'),PWideChar(DeDir+'CustomDocNo.ini'),False);
-  CopyFile(PWideChar(SoDir+'UseCase.ini'),PWideChar(DeDir+'UseCase.ini'),False);
+
+  if (not FileExists(SoDir+'CaseDocNo.dat')) or (not FileExists(SoDir+'DocDir.dat')) then   //截畫面會沒這些檔
+  begin
+//ShowMessage('產生必要的文字檔');
+    CreateCaseNeedData(SoDir);   //產生必要的文字檔
+  end;
+
+  AA:=CopyFile(PWideChar(SoDir+'CaseDocNo.dat'),PWideChar(DeDir+'CaseDocNo.dat'),False);
+  AA2:=CopyFile(PWideChar(SoDir+'CaseDocNo_Copies.dat'),PWideChar(DeDir+'CaseDocNo_Copies.dat'),False);
+  AA3:=CopyFile(PWideChar(SoDir+'CustomDocNo.ini'),PWideChar(DeDir+'CustomDocNo.ini'),False);
+  AA4:=CopyFile(PWideChar(SoDir+'UseCase.ini'),PWideChar(DeDir+'UseCase.ini'),False);
+//ShowMessage(BoolToStr(AA)+#10#13+BoolToStr(AA2)+#10#13+BoolToStr(AA3)+#10#13+BoolToStr(AA4));
+  if FileExists(SoDir+'DocDir.dat') then     //20170222 新加
+  begin
+    CopyFile(PWideChar(SoDir+'DocDir.dat'),PWideChar(DeDir+'DocDir.dat'),False);
+  end;
+
+
   DocNoList := TStringlist.Create;
   FileList := TStringlist.Create;
   iFileList := TStringlist.Create;
   iFile_DocDirList := TStringlist.Create;
+  iAttFileList := TStringlist.Create;
   try
     //if Not FileExists(SoDir+'Context.dat') then  Exit;
     //iFileList.LoadFromFile(SoDir+'Context.dat');
@@ -9652,6 +11730,7 @@
       DocDir := DocNoList.Strings[i];
       MkDir(DeDir+DocDir);
     end;}
+//ShowMessage('DocNoList='+DocNoList.Text);
 
     for i := DocNoList.Count - 1 downto 0 do
     begin
@@ -9664,16 +11743,18 @@
       end
       else
       begin
+//ShowMessage('GGG');
         DocNoList.Delete(i);
         DocNoList.SaveToFile(DeDir+'CaseDocNo.dat');
         if i <= CaseDocNo_CopiesList.Count-1  then
         begin
+//ShowMessage('KKKK');
           CaseDocNo_CopiesList.Delete(i);
           CaseDocNo_CopiesList.SaveToFile(DeDir+'CaseDocNo_Copies.dat');
         end;
       end;
     end;
-
+  //20170221 先註解起來  因為他在補充掃瞄時好像會有顯示的問題
 
     for i := 0 to iFileList.Count - 1 do
     begin
@@ -9735,6 +11816,23 @@
         CaseDocNo_CopiesList.SaveToFile(DeDir+'CaseDocNo_Copies.dat');
       end;
     end;}
+    if FileExists(SoDir+'AttContext.dat') then
+    begin
+      iAttFileList.LoadFromFile(SoDir+'AttContext.dat');
+      for i := 0 to iAttFileList.Count - 1 do
+      begin
+        AttFile := iAttFileList.Strings[i];
+        CopyFile(PWideChar(SoDir+AttFile),PWideChar(DeDir+AttFile),False);
+      end;
+      iAttFileList.SaveToFile(DeDir+'AttContext.dat');
+    end;
+
+
+    if FMode='ESCAN' then
+    begin
+      InitExistImgList(DeDir);
+    end;
+
 
   finally
   iFileList.Free;
@@ -9744,7 +11842,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FormCode2FormName(CaseID,FormCode:String):String; //��FormCode�ন���W��
+Function TCB_IMGPSScanX.FormCode2FormName(CaseID,FormCode:String):String; //用FormCode轉成文件名稱
 var
   i,v,ln : Integer;
   DelBarCode : String;
@@ -9752,13 +11850,13 @@
 begin
   Result := '';
   if (FormCode = '') or (FormCode = 'Attach') or (FormCode = 'S_Attach') then
-    Result := _Msg('���k��')
+    Result := _Msg('未歸類')
   //showmessage('a');
   //stringtofile(FORM_INF_List.Text,'D:\121.txt');
   Else If FindSQLData(FORM_INF_List,'T1.FORM_ID,T1.FORM_DESC','T1.FORM_ID',FormCode,0,FindResult) then
     Result := GetFindResult('T1.FORM_DESC');
 
-  ////// ��ۭq����//////
+  ////// 到自訂文件找//////
   if Result = '' then
     Result := GetCustomDocName(ImageSavePath+CaseID+'\',FormCode2DocNo(FormCode));
   {for i := 0 to Cust_DocNoList.Count - 1 do
@@ -9776,7 +11874,7 @@
   {DelBarCode := '**'+FormCode;
   for I := 0 to FormCodeList.Count - 1 do
   begin
-    if FindDel then //�n��U�[��
+    if FindDel then //要找下架的
     begin
       if (FormCode = FormCodeList.Strings[i]) or (DelBarCode = FormCodeList.Strings[i]) then
       begin
@@ -9795,7 +11893,7 @@
   end; }
 end;
 
-Function TCB_IMGPSScanX.FormCode2FileName(FormCode:String;List:TStrings):String; //��FormCode��X�ɦW(�Ĥ@��)
+Function TCB_IMGPSScanX.FormCode2FileName(FormCode:String;List:TStrings):String; //用FormCode找出檔名(第一頁)
 var
   i : Integer;
   v,v1 : Integer;
@@ -9805,7 +11903,7 @@
   begin
     V := pos('_',List.Strings[i]);
     v1 := pos('.',List.Strings[i]);
-    if (FormCode = '') and (V = 0)then //FormCode �����h�����X��
+    if (FormCode = '') and (V = 0)then //FormCode 為空的則找附件出來
     begin
       Result := List.Strings[i];
       Break;
@@ -9818,7 +11916,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FileName2FormCode(FileName:String):String; //�q�ɦW���XFormCode
+Function TCB_IMGPSScanX.FileName2FormCode(FileName:String):String; //從檔名取出FormCode
 var
   v,v1 : Integer;
 begin
@@ -9829,43 +11927,43 @@
   begin
     Result := Copy(FileName,v+1,v1-v-1);
   end
-  Else     //����
+  Else     //附件
   begin
     Result := '';
   end;
 end;
 
-Function TCB_IMGPSScanX.FileName2FormName(CaseID,FileName:String):String; //�q�ɦW���X���W��
+Function TCB_IMGPSScanX.FileName2FormName(CaseID,FileName:String):String; //從檔名取出文件名稱
 begin
   Result :=  FormCode2FormName(CaseID,FileName2FormCode(FileName));
 end;
 
-Function TCB_IMGPSScanX.FileName2ScanPage(FileName:String):Integer; //�q�ɦW��X���˭���
+Function TCB_IMGPSScanX.FileName2ScanPage(FileName:String):Integer; //從檔名轉出掃瞄頁數
 Var
   v : Integer;
   FName : String;
 begin
   FName := ExtractFileName(FileName);
   v := Pos('_',FName);
-  if v = 0 then   //����
+  if v = 0 then   //附件
     v := pos('.',FName);
   Result := Strtoint(Copy(FName,1,v-1));
 end;
 
-Function TCB_IMGPSScanX.FileName2NoQuene_Filename(FileName:String):String; //���X�S���Ǹ����ɦW
+Function TCB_IMGPSScanX.FileName2NoQuene_Filename(FileName:String):String; //取出沒有序號的檔名
 var
   v,v1 : Integer;
   FName : String;
 begin
   FName := ExtractFileName(FileName);
   v := Pos('_',FName);
-  if v = 0 then   //����
+  if v = 0 then   //附件
     v := pos('.',FName);
   v1 := length(FName);
   Result := Copy(FName,v,v1-v+1);
 end;
 
-Function TCB_IMGPSScanX.FileName2Index(FileName:String):Integer; //�q�ɦW���X�bContextList���Ǹ�
+Function TCB_IMGPSScanX.FileName2Index(FileName:String):Integer; //從檔名取出在ContextList的序號
 var
   i : Integer;
 begin
@@ -9879,7 +11977,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //�q�ɦW���X�k�ݪ����N��
+Function TCB_IMGPSScanX.FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //從檔名取出歸屬的文件代號
 var
   i : Integer;
 begin
@@ -9893,7 +11991,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FormCode2DocNo(FormCode:String):String;   //FormCode��Docno
+Function TCB_IMGPSScanX.FormCode2DocNo(FormCode:String):String;   //FormCode轉Docno
 Var
   i : Integer;
 begin
@@ -9907,28 +12005,28 @@
     end;
 
   end;
-  if (FormCode <> '') and (Result = '') then    //�O�ۭq���
+  if (FormCode <> '') and (Result = '') then    //是自訂文件
   begin
-    Result := Copy(FormCode,1,8);
+    Result := Copy(FormCode,1,8); //20170224 DocNo 固定長度8碼
   end;
 
-  {If FindSQLData(FORM_INF_List,'T1.DOC_NO','T1.FORM_ID',FormCode,0,FindResult) Then  //20130403�ӺC�F..����
+  {If FindSQLData(FORM_INF_List,'T1.DOC_NO','T1.FORM_ID',FormCode,0,FindResult) Then  //20130403太慢了..換掉
   begin
     Result := GetFindResult('T1.DOC_NO');
   end;}
 end;
 
-Function TCB_IMGPSScanX.FormCode2Version(FormCode:String):String; //FormCode�઩��
+Function TCB_IMGPSScanX.FormCode2Version(FormCode:String):String; //FormCode轉版本
 begin
   Result := Copy(FormCode,11,5);
 end;
 
-Function TCB_IMGPSScanX.FormCode2Page(FormCode:String):String; //FormCode�୶��
+Function TCB_IMGPSScanX.FormCode2Page(FormCode:String):String; //FormCode轉頁數
 begin
   Result := Copy(FormCode,9,2)
 end;
 
-Function TCB_IMGPSScanX.DocNo2DocName(CaseID,DocNo:String):String; //Docno��Doc�W��
+Function TCB_IMGPSScanX.DocNo2DocName(CaseID,DocNo:String):String; //Docno轉Doc名稱
 var
   i,v,ln : Integer;
   CusDocNo,CusDocName : String;
@@ -9936,17 +12034,18 @@
   Result := '';
   if DocNo = AttName then
   begin
-    Result := _Msg('���k��');
+    Result := _Msg('未歸類');
   end
   Else
   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;
 
-  if Result = '' then  //�h�ۭq���̧�
+  if Result = '' then  //去自訂文件裡找
   begin
     Result := GetCustomDocName(ImageSavePath+CaseID+'\',DocNo);
     {for i := 0 to Cust_DocNoList.Count - 1 do
@@ -9965,7 +12064,7 @@
 
 end;
 
-Function TCB_IMGPSScanX.DocNo2FileName(DocNo:String;List:TStrings):String; //��DocNo��X�ɦW(�Ĥ@��)
+Function TCB_IMGPSScanX.DocNo2FileName(DocNo:String;List:TStrings):String; //用DocNo找出檔名(第一頁)
 var
   i : Integer;
 begin
@@ -9980,7 +12079,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FormCode2WorkNo(FormCode:String):String; //��FormCode���X�@�~�O
+Function TCB_IMGPSScanX.FormCode2WorkNo(FormCode:String):String; //用FormCode取出作業別
 begin
   Result := '';
   If FindSQLData(FORM_INF_List,'T1.WORK_NO','T1.FORM_ID',FormCode,0,FindResult) Then
@@ -9989,7 +12088,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.DocNo2WorkNo(DocNo:String):String; //��DocNo���X�@�~�O
+Function TCB_IMGPSScanX.DocNo2WorkNo(DocNo:String):String; //用DocNo取出作業別
 begin
   Result := '';
   If FindSQLData(Doc_Inf_List,'WORK_NO','DOC_NO',DocNo,0,FindResult) Then
@@ -9998,7 +12097,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.DocNoNeedDiv(DocNo:String):Boolean; //�O�_�O�ݤ����ƪ����N��
+Function TCB_IMGPSScanX.DocNoNeedDiv(DocNo:String):Boolean; //是否是需分份數的文件代號
 var
   NeedDiv : String;
 begin
@@ -10011,11 +12110,11 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //�ץ�Node���ץ�s��  Mode: I:Caseno;P:Page
+Function TCB_IMGPSScanX.CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //案件Node取案件編號  Mode: I:Caseno;P:Page
 var
   v,ln : Integer;
 begin
-  //XXXXXX-XX��
+  //XXXXXX-XX頁
   V := Pos('-',Node.Text);
   ln := Length(Node.Text);
   case Mode of
@@ -10025,11 +12124,11 @@
 
 end;
 
-Function TCB_IMGPSScanX.DocNode2Info(Node:TTreeNode;Mode:Char):String;   //���Node�����N�� Mode: I:Docno;N:Docname;P:Page;G:Group
+Function TCB_IMGPSScanX.DocNode2Info(Node:TTreeNode;Mode:Char):String;   //文件Node取文件代號 Mode: I:Docno;N:Docname;P:Page;G:Group
 var
   v,v1,v2,v3,ln :integer;
 begin
-  //���W��@�ռ�{���N��}-XX��
+  //文件名稱@組數{文件代號}-XX頁
   V := PosEnd('@',Node.Text);
   v1 := PosEnd('{',Node.Text);
   v2 := PosEnd('}',Node.Text);
@@ -10043,11 +12142,11 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FormNode2Info(Node:TTreeNode;Mode:Char):String;   //���Node�����N��  Mode: I:FormID;N:FormName;P:Page
+Function TCB_IMGPSScanX.FormNode2Info(Node:TTreeNode;Mode:Char):String;   //表單Node取表單代號  Mode: I:FormID;N:FormName;P:Page
 var
   v,v1,v2,ln :integer;
 begin
-  //���N��{���W��}-XX��
+  //表單代號{表單名稱}-XX頁
   v := Pos('{',Node.Text);
   v1 := PosEnd('}',Node.Text);
   v2 := PosEnd('-',Node.Text);
@@ -10059,7 +12158,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //�W�@��
+Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //上一頁
 var
   iISB : TImageScrollBox;
 begin
@@ -10070,7 +12169,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //�U�@��
+Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //下一頁
 var
   iISB : TImageScrollBox;
 begin
@@ -10081,7 +12180,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //�O�_�v�s�b���
+Function TCB_IMGPSScanX.DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //是否己存在樹裡
 var
   i : Integer;
 begin
@@ -10097,7 +12196,7 @@
 
 end;
 
-Function TCB_IMGPSScanX.DocnoNeedGroup(DocNo:String):Boolean; //�ǤJ��DocNo�O�_�ݤ���
+Function TCB_IMGPSScanX.DocnoNeedGroup(DocNo:String):Boolean; //傳入的DocNo是否需分組
 begin
   Result := False;
   If FindSQLData(Doc_Inf_List,'IS_DOC_DIV','DOC_NO',DocNo,0,FindResult) Then
@@ -10107,7 +12206,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //�q�ץ�̪�FormCode���X�Ĥ@��
+Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁
 var
   i,n : Integer;
   LForm,OForm : String;
@@ -10119,6 +12218,17 @@
     S.LoadFromFile(ImageSavePath + CaseID+'\upload\Context.dat');
     for i := 0 to S.Count - 1 do
     begin
+LogFile1.LogToFile(logTimeString+S.Strings[i]+' ISExistImg='+BoolToStr(ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[i]),true));
+LogFile1.LogToFile(logTimeString+S.Strings[i]+' reSizeExistImgList='+BoolToStr(reSizeExistImgList.IndexOf(LoadFileGetMD5(ImageSavePath+CaseID+'\upload\'+S.Strings[i]))<>-1,true));
+      if FWH_category='N' then
+      begin
+        if (ISExistImg(ImageSavePath+CaseID+'\upload\'+S.Strings[i]))
+        or  (reSizeExistImgList.IndexOf(LoadFileGetMD5(ImageSavePath+CaseID+'\upload\'+S.Strings[i]))<>-1)  then
+        begin
+          Continue;
+        end;
+      end;
+
       LForm := FileName2FormCode(S.Strings[i]);
       AddOk := True;
       for n := 0 to OMRFileList.Count - 1 do
@@ -10142,7 +12252,7 @@
 end;
 
 
-Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR�ˮ�
+Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核
 var
   i,n,m,v,v1 : Integer;
   XT,RelaXT,ValueXT : TXmltool;
@@ -10156,22 +12266,24 @@
   OMROK : Boolean;
   CaseOk : Boolean;
   ErrStr : String;
-  SiteRec,RelaSiteRec : String;  //�h�զ�m�O��
+  SiteRec,RelaSiteRec : String;  //多組位置記錄
   OMRValue : String;
-  MainFormID,MainDocNo,MainVersion : String; //�DFormID
-  MainFormPage,CaseFormPage : Integer;  //�D�n���ݭn������
-  NeedDocNoStr,NoDocNoStr : String; //�ۨ� �������r��
+  MainFormID,MainDocNo,MainVersion : String; //主FormID
+  MainFormPage,CaseFormPage : Integer;  //主要文件需要的頁數
+  NeedDocNoStr,NoDocNoStr : String; //相依 互斥文件字串
   List : TStringlist;
   FormCode : String;
   FormDataPages : Integer;
-  NoSite : Boolean; //���w��
+  NoSite : Boolean; //未定位
   Anchor,Anchor1 : String;
   OMROkCount : Integer;
-  //Casecheck : Boolean;  //�O�_�n���ˮ�
-  //AllCheck : Boolean;  //�O�_�n�������ˮ�
+  //Casecheck : Boolean;  //是否要做檢核
+  //AllCheck : Boolean;  //是否要做完整檢核
+
+  ISB8W,ISB8H:integer;
 begin
-  ///OMRErrInfo  1: ���n���  2:�̤ۨ�� 3:�������  4:���� 5:��즳�Ȫ����  6:��즳�Ȥ������
-  ///            7: ��즳�Ȭ������]�n����  8:��즳�ȭn�g�Ƶ� 9:���Τ�� 10:�̤j����
+  ///OMRErrInfo  1: 必要文件  2:相依文件 3:互斥文件  4:必填 5:欄位有值附文件  6:欄位有值不附文件
+  ///            7: 欄位有值相關欄位也要有值  8:欄位有值要寫備註 9:停用日期 10:最大頁數
   //Casecheck := True;
   //Allcheck := True;
   //if (FMode = 'ISCAN') then
@@ -10196,22 +12308,31 @@
         begin
 
         end;
+//ShowMessage('MainFormID='+MainFormID);
+LogFile1.LogToFile(logTimeString+' '+FModeName+' '+CaseID+' '+'MainFormID='+MainFormID);
         if MainFormID = ''then
         begin
-          //20131203 yuu�����ˬd�o��,������
-          {if FMode <> 'SSCAN' then  //ñ�p����|���DFormID,�����L
+          //20131203 yuu說不檢查這個,先拿掉   20170315 楷琳說未歸類要擋  20170726 因此有檢查必要FormID  所以 可以拿掉
+          {if FCheck_main_form='Y' then
           begin
-            ErrStr:=_Msg('�䤣����פ��');   //�䤣��D���
-            OMRErr2ini(CaseID,ErrStr,'','','','','','',False,False,True);
-            CaseOk := false;
-          end;}
+            if (FMode <> 'SSCAN') AND (FMode<>'ESCAN') then  //簽署章件會換主FormID,先跳過 20170629 ESCAN 也不檢查
+            begin
+              ErrStr:=_Msg('找不到分案文件');   //找不到主文件
+              OMRErr2ini(CaseID,ErrStr,'','','','','','',False,False,True);
+              CaseOk := false;
+//ShowMessage('AAAAA');
+            end;
+          end;
+          }
         end
         Else
         begin
-          //////�D�n�D�D�n���//////
+          //////主要非主要文件//////
           DistinctDocinCase(ImageSavePath+CaseID+'\upload\');
-
-          if ModeNeedCheck(OMRErrInfo[1].Mode,FMode) then //�O�_�n�ˮ�
+//ShowMessage(DocNo_VerinCase.Text);
+//DocNo_VerinCase.Add('31A00101_1706A');
+LogFile1.LogToFile(logTimeString+' '+CaseID+' '+'DocNo_VerinCase.Text='+DocNo_VerinCase.Text);
+          if ModeNeedCheck(OMRErrInfo[1].Mode,FMode) then //是否要檢核
           begin
             for i := 0 to DocNo_VerinCase.Count - 1 do
             begin
@@ -10219,19 +12340,21 @@
               v1 := length(DocNo_VerinCase.Strings[i]);
               MainDocNo := Copy(DocNo_VerinCase.Strings[i],1,v-1); //FormCode2DocNo(MainFormID);
               MainVersion :=Copy(DocNo_VerinCase.Strings[i],v+1,v1-v); //FormCode2Version(MainFormID);
-              MainFormPage := GetDataDocNoPage(MainDocNo,MainVersion); //��Ʈw�O���D��󭶼�
-              CaseFormPage := CheckCaseDocNoPage(CaseID,MainDocNo,MainVersion,MainFormPage); //�ץ�D��󪺭���
+              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)]); //�D�n���ݦ�XX���Ȫ�XX��
+                ErrStr:=MainDocNo+Format(OMRErrInfo[1].Info,[Inttostr(MainFormPage),Inttostr(CaseFormPage)]); //主要文件需有XX頁僅附XX頁
                 OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[1].Ignore,OMRErrInfo[1].Display);
                 if OMRErrInfo[1].Display then
                   CaseOk := false;
               end;
             end;
           end;
-          //////�D�n�D�D�n���/////
-          //showmessage(MainFormID);
+          //////主要非主要文件/////
+//showmessage(MainFormID);
           MainDocNo := FormCode2DocNo(MainFormID);
           MainVersion := FormCode2Version(MainFormID);
           if FindSQLData(DM_FORM_INF_List,'DEPE_FORM_ID,MUTEX_FORM_ID','MAIN_FORM_ID,DOC_VERSION',MainDocNo+','+MainVersion,0,FindResult) then
@@ -10245,129 +12368,165 @@
             NoDocNoStr := GetFindResult('MUTEX_FORM_ID');
           end;
 
-          //////�̤ۨ��/////
-          if ModeNeedCheck(OMRErrInfo[2].Mode,FMode) then //�O�_�n�ˮ�
+          //////相依文件/////
+          if ModeNeedCheck(OMRErrInfo[2].Mode,FMode) then //是否要檢核
           begin
             List.CommaText := NeedDocNoStr;
             for I := 0 to List.Count - 1 do
             begin
-              if not Case_DocNoExists(CaseID,List.Strings[i]) then  //�S���̤ۨ��
+              if not Case_DocNoExists(CaseID,List.Strings[i]) then  //沒附相依文件
               begin
-                ErrStr:=Format(OMRErrInfo[2].Info,[DocNo2DocName(CaseID,List.Strings[i])]);   //�S���̤ۨ��
+                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
                   CaseOk := false;
               end;
             end;
           end;
-          //////�̤ۨ��/////
+          //////相依文件/////
 
-          //////�������/////
-          if ModeNeedCheck(OMRErrInfo[3].Mode,FMode) then //�O�_�n�ˮ�
+          //////互斥文件/////
+          if ModeNeedCheck(OMRErrInfo[3].Mode,FMode) then //是否要檢核
           begin
             List.CommaText := NoDocNoStr;
             for I := 0 to List.Count - 1 do
             begin
-              if Case_DocNoExists(CaseID,List.Strings[i]) then  //���F�������
+              if Case_DocNoExists(CaseID,List.Strings[i]) then  //附了互斥文件
               begin
-                ErrStr:=Format(OMRErrInfo[3].Info,[DocNo2DocName(CaseID,List.Strings[i])]);   //�����������
+                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
                   CaseOk := false;
               end;
             end;
           end;
-          //////�������/////
-        end;
+          //////互斥文件/////
+        end; //MainFormID結束
       //end;
       List.LoadFromFile(ImageSavePath + CaseID+'\upload\Context.dat');
       for i := 0 to List.Count - 1 do
       begin
         FormCode := FileName2FormCode(List.Strings[i]);
-        /////���k��///
-        {IF FormCode = 'Attach' Then   //20140211 yuu�����ˬd�F
+        /////未歸類///
+        {IF FormCode = 'Attach' Then   //20140211 yuu說不檢查了
         begin
-          ErrStr:=_Msg('�|������k��');
+          ErrStr:=_Msg('尚有文件未歸類');
           OMRErr2ini(CaseID,ErrStr,'','','','','','',False,False,True);
           CaseOk := false;
         end; }
-        /////���k��//////
+        /////未歸類//////
 
-        /////�����U���/////
-        {IF not FormIDExists(FormCode,False) then  //�����U���
+        /////未註冊文件/////
+        {IF not FormIDExists(FormCode,False) then  //未註冊文件
         begin
-          ErrStr:=FormCode+_Msg('�������~�Ȫ����N�X');
+          ErrStr:=FormCode+_Msg('不為此業務的表單代碼');
           OMRErr2ini(CaseID,ErrStr,'','','','',False,False,True);
           CaseOk := false;
         end }
-        /////�����U���/////
-        //////�����//
-        {Else} IF ModeNeedCheck(OMRErrInfo[9].Mode,FMode) and (not FormIDExists(FormCode,True,0)) then  //���������
+        /////未註冊文件/////
+        //////停用文件//
+        {Else} IF ModeNeedCheck(OMRErrInfo[9].Mode,FMode) and (not FormIDExists(FormCode,True,0)) and (not checkFormCodeIsCustom(ImageSavePath + CaseID+'\upload\',FormCode)) then  //有停用的文件
         begin
-          ErrStr:=Format(OMRErrInfo[9].Info,[FormCode2FormName(CaseID,FormCode)]);   //�������
+//ShowMessage('AAAA');
+          ErrStr:=Format(OMRErrInfo[9].Info,[FormCode2FormName(CaseID,FormCode)]);   //有停用文件
           OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[9].Ignore,OMRErrInfo[9].Display);
+//ShowMessage('ErrStr='+ErrStr);
           if OMRErrInfo[9].Display then
             CaseOk := false;
         end;
-        //////�����////
+        //////停用文件////
       end;
     finally
       List.Free;
     end;
     //if AllCheck then
     //begin
-      //////�̤j����/////
+      //////最大頁數///
+LogFile1.LogToFile(logTimeString+'最大頁數A段 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text);
       DistinctFormCode(CaseID);
-      if ModeNeedCheck(OMRErrInfo[10].Mode,FMode) then //�O�_�n�ˮ�
+      if ModeNeedCheck(OMRErrInfo[10].Mode,FMode) then //是否要檢核
       begin
+//ShowMessage('AAA'+OMRFileList.Text);
+LogFile1.LogToFile(logTimeString+'最大頁數B段 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text);
         For i := 0 to OMRFileList.Count - 1 do
         begin
+          if FModeName=_Msg('異動件') then Continue;
+
+          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);
 
-          IF (FormCode <> '') and (FormDataPages > 0) and (FindFormCodePages(CaseID,FormCode) > FormDataPages) then  //���W�L�̤j���ƪ����
+          IF (FormCode <> '') and (FormDataPages > 0) and (FindFormCodePages(CaseID,FormCode) > FormDataPages) then  //有超過最大頁數的文件
           begin
-            ErrStr:=Format(OMRErrInfo[10].Info,[FormCode2FormName(CaseID,FormCode),inttostr(FormDataPages)]);   //���W�L�̤j���Ƥ��
+            ErrStr:=Format(OMRErrInfo[10].Info,[FormCode2FormName(CaseID,FormCode),inttostr(FormDataPages)]);   //有超過最大頁數文件
             OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[10].Ignore,OMRErrInfo[10].Display);
             if OMRErrInfo[10].Display then
               CaseOk := false;
           end;
         end;
       end;
-      /////�̤j����/////
+      /////最大頁數/////
     //end;
     ImageScrollBox1.FileName := '';
-    //if FWork_No = 'CW' then   //�z�ߴN�����U�����ˮ֤F
+    //if FWork_No = 'CW' then   //理賠就不做下面的檢核了
     //begin
-      //////OMR�ˮ�///////
+      //////OMR檢核///////
       ContextList.LoadFromFile(ImageSavePath+CaseID+'\upload\Context.dat');
       DistinctFormCode(CaseID);
       ValueXT := TXmltool.Create;
       Try
+//ShowMessage('必填'+OMRFileList.Text);
+LogFile1.LogToFile(logTimeString+'必填 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text);
         For i := 0 to OMRFileList.Count - 1 do
         begin
+//ShowMessage('OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]);
+          if CheckRequiredColumnValues(FWork_NO,CaseID) then Continue;
+
           OMRFile := OMRFileList.Strings[i];
           OMRFormCode := FileName2FormCode(OMRFileList.Strings[i]);
           OMRFormName := FormCode2FormName(CaseID,OMRFormCode);
           Anchor := FormID2Anchor(OMRFormCode);
-          ///�̤Q�r�w���I�Y��////
-          ImageReSize(CaseID,OMRFile);
-          ////�̤Q�r�w���I�Y��////
-          if not FileExists(CheckXmlPath+OMRFormCode+'.xml') then  //�S��Xml�N�����ˮ�
+          ///依十字定位點縮放////
+          ImageReSize_FormID(CaseID,OMRFile);
+          ////依十字定位點縮放///
+//Display1.Lines.Add('OMRFile='+OMRFile+',OMRFormCode='+OMRFormCode+',OMRFormName='+OMRFormName);
+LogFile1.LogToFile(logTimeString+'OMRFile='+OMRFile+',OMRFormCode='+OMRFormCode+',OMRFormName='+OMRFormName);
+//ShowMessage('KKKKK');
+          if not FileExists(CheckXmlPath+FWork_no+'\'+OMRFormCode+'.xml') then  //沒有Xml就不用檢核
             Continue;
 
-
-          XT := TXmltool.Create(CheckXmlPath+OMRFormCode+'.xml');
+//ShowMessage('11638 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]);
+          XT := TXmltool.Create(CheckXmlPath+FWork_no+'\'+OMRFormCode+'.xml');
           RelaXT := TXmltool.Create;
-
+//ShowMessage('ModeNeedCheck='+BoolToStr(ModeNeedCheck(OMRErrInfo[4].Mode,FMode),true));
           try
-            //*******����********
-            if ModeNeedCheck(OMRErrInfo[4].Mode,FMode) then //�O�_�n�ˮ�
+            //*******必填********
+            if ModeNeedCheck(OMRErrInfo[4].Mode,FMode) then //是否要檢核
             begin
               if XT.SubNodes['/form/settype1/'].First then
               Repeat
                 OMROK := False;
-                SiteRec := ''; //�M��
+                SiteRec := ''; //清掉
                 ColEName := XT.SubNodes['/form/settype1/'].NodeName;
                 ColCName := XT.Node['/form/settype1/'+ColEName+'/'].Attributes['coldesc'];
                 ColCName := Copy(ColCName,1,length(ColCName)-6);
@@ -10378,12 +12537,15 @@
                   begin
                     Pixel := Strtoint(XT.Node['/form/settype1/'+ColEName+'/'+nodename+'/'].Attributes['pixel']);
                     Site := XT.Node['/form/settype1/'+ColEName+'/'+nodename+'/'].Attributes['colxy'];
-                    if SiteRec= '' then   //�O����m
+                    if SiteRec= '' then   //記錄位置
                       SiteRec := Site
                     else
                       SiteRec := SiteRec+'@'+Site;
-                    //����Nok
+                    //有填就ok
                     //Showmessage(ColCName +','+ inttostr(OMRMpsV1.GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site))+','+inttostr(Pixel + SafePixel));
+//SafePixel:=90000;
+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');
@@ -10398,19 +12560,19 @@
                 Until not XT.SubNodes['/form/settype1/'+ColEName+'/'].Next;
                 if not OMROk then
                 begin
-                  ErrStr:=Format(OMRErrInfo[4].Info,[ColCName]);   //XX��쥼��g
+                  ErrStr:=Format(OMRErrInfo[4].Info,[ColCName]);   //XX欄位未填寫
                   OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[4].Ignore,OMRErrInfo[4].Display);
                   if OMRErrInfo[4].Display then
                     CaseOk := false;
                 end;
               Until not XT.SubNodes['/form/settype1/'].Next ;
             end;
-            //*******����********
-
+            //*******必填********
+//ShowMessage('11692 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]);
             //if AllCheck then
             //begin
-            //*******���Ȭ���������]�n����*******
-            if ModeNeedCheck(OMRErrInfo[7].Mode,FMode) then //�O�_�n�ˮ�
+            //*******有值相關文件的欄位也要有值*******
+            if ModeNeedCheck(OMRErrInfo[7].Mode,FMode) then //是否要檢核
             begin
               if XT.SubNodes['/form/settype3/'].First then
               Repeat
@@ -10420,14 +12582,15 @@
                 ColCName := XT.Node['/form/settype3/'+ColEName+'/'].Attributes['coldesc'];
                 ColCName := Copy(ColCName,1,length(ColCName)-6);
                 Site := XT.Node['/form/settype3/'+ColEName+'/'].Attributes['colxy'];
-                if SiteRec= '' then   //�O����m
+                if SiteRec= '' then   //記錄位置
                   SiteRec := Site
                 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
-                  ////����g////
+                  ////有填寫////
 
                   if XT.SubNodes['/form/settype3/'+ColEName+'/'].First then
                   Repeat
@@ -10442,7 +12605,18 @@
                       RelaFile := FormCode2FileName(RelaFormCode,ContextList);
                       RelaFormName := FormCode2FormName(CaseID,RelaFormCode);
                       Anchor1 := FormID2Anchor(RelaFormCode);
-                      RelaXT.LoadFromFile(CheckXmlPath+RelaFormCode+'.xml');
+                      RelaXT.LoadFromFile(CheckXmlPath+FWork_no+'\'+RelaFormCode+'.xml');
+Display1.Lines.Add(RelaFile+','+RelaFormName);
+//ShowMessage(RelaFile);
+//ShowMessage(ImageSavePath+CaseID+'\upload\'+RelaFile);
+                      if RelaFile<>'' then
+                      begin
+                        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  抓相關然欄位所在圖檔的定位
+                      end;
+
                       OMROK := False;
                       //OMROK := False;
                       //if RelaXT.SubNodes['/form/settype2/'].First then
@@ -10457,32 +12631,33 @@
                           begin
                             RelaPixel := Strtoint(RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['pixel']);
                             RelaSite := RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['colxy'];
-                            if RelaSiteRec= '' then   //�O����m
+                            if RelaSiteRec= '' then   //記錄位置
                               RelaSiteRec := RelaSite
                             else
                               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
                           if not FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then
-                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('����')+RelaFormName+')'   //XX����g��,XX��쥼��g
+                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('未附')+RelaFormName+')'   //XX欄位填寫時,XX欄位未填寫
                           Else if NoSite then
-                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('���w��')+')'
+                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('未定位')+')'
                           Else
-                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName]);   //XX����g��,XX��쥼��g
+                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName]);   //XX欄位填寫時,XX欄位未填寫
                           OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSiteRec,Anchor,Anchor1,False,OMRErrInfo[7].Ignore,OMRErrInfo[7].Display);
                           if OMRErrInfo[7].Display then
                             CaseOk := false;
@@ -10494,10 +12669,11 @@
                 end;
               Until not XT.SubNodes['/form/settype3/'].Next ;
             end;
-            //*******���Ȭ���������]�n����*******
+            //*******有值相關文件的欄位也要有值*******
+//ShowMessage('11788 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]);
 
-            //*******���Ȭ��������줣�঳��*******
-            if ModeNeedCheck(OMRErrInfo[11].Mode,FMode) then //�O�_�n�ˮ�
+            //*******有值相關文件的欄位不能有值*******
+            if ModeNeedCheck(OMRErrInfo[11].Mode,FMode) then //是否要檢核
             begin
               if XT.SubNodes['/form/settype8/'].First then
               Repeat
@@ -10508,15 +12684,16 @@
                 ColCName := XT.Node['/form/settype8/'+ColEName+'/'].Attributes['coldesc'];
                 ColCName := Copy(ColCName,1,length(ColCName)-6);
                 Site := XT.Node['/form/settype8/'+ColEName+'/'].Attributes['colxy'];
-                if SiteRec= '' then   //�O����m
+                if SiteRec= '' then   //記錄位置
                   SiteRec := Site
                 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
-                  ////����g// //
+                  ////有填寫// //
                   inc(OMROkCount);
                 end;
                 if XT.SubNodes['/form/settype8/'+ColEName+'/'].First then
@@ -10532,7 +12709,16 @@
                     RelaFile := FormCode2FileName(RelaFormCode,ContextList);
                     RelaFormName := FormCode2FormName(CaseID,RelaFormCode);
                     Anchor1 := FormID2Anchor(RelaFormCode);
-                    RelaXT.LoadFromFile(CheckXmlPath+RelaFormCode+'.xml');
+                    RelaXT.LoadFromFile(CheckXmlPath+FWork_no+'\'+RelaFormCode+'.xml');
+
+                    if RelaFile<>'' then
+                    begin
+                      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  抓相關然欄位所在圖檔的定位
+                    end;
+
                     OMROK := False;
                     //OMROK := False;
                     //if RelaXT.SubNodes['/form/settype2/'].First then
@@ -10547,18 +12733,22 @@
                         begin
                           RelaPixel := Strtoint(RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['pixel']);
                           RelaSite := RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['colxy'];
-                          if RelaSiteRec= '' then   //�O����m
+                          if RelaSiteRec= '' then   //記錄位置
                             RelaSiteRec := RelaSite
                           else
                             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
@@ -10569,11 +12759,11 @@
                       if OMROkCount > 1  then
                       begin
                         if not FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then
-                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('����')+RelaFormName+')'   //XX����g��,XX���]��g
+                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('未附')+RelaFormName+')'   //XX欄位填寫時,XX欄位也填寫
                         Else if NoSite then
-                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('���w��')+')'
+                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('未定位')+')'
                         Else
-                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName]);   //XX����g��,XX���]��g
+                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName]);   //XX欄位填寫時,XX欄位也填寫
                         OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,ImageSavePath+CaseID+'\upload\'+RelaFile,RelaSiteRec,Anchor,Anchor1,False,OMRErrInfo[7].Ignore,OMRErrInfo[7].Display);
                         if OMRErrInfo[11].Display then
                           CaseOk := false;
@@ -10584,12 +12774,12 @@
                 Until not XT.SubNodes['/form/settype8/'+ColEName+'/'].Next;
               Until not XT.SubNodes['/form/settype8/'].Next ;
             end;
-            //*******���Ȭ��������줣�঳��*******
+            //*******有值相關文件的欄位不能有值*******
 
+//ShowMessage('11889 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]);
 
-
-              //*******���Ȭ̤ۨ��*******
-            if ModeNeedCheck(OMRErrInfo[5].Mode,FMode) then //�O�_�n�ˮ�
+              //*******有值相依文件*******
+            if ModeNeedCheck(OMRErrInfo[5].Mode,FMode) then //是否要檢核
             begin
               if XT.SubNodes['/form/settype4/'].First then
               Repeat
@@ -10599,14 +12789,16 @@
                 ColCName := XT.Node['/form/settype4/'+ColEName+'/'].Attributes['coldesc'];
                 ColCName := Copy(ColCName,1,length(ColCName)-6);
                 Site := XT.Node['/form/settype4/'+ColEName+'/'].Attributes['colxy'];
-                if SiteRec= '' then   //�O����m
+                if SiteRec= '' then   //記錄位置
                   SiteRec := Site
                 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
-                  ////����g////
+                  ////有填寫////
                   if XT.SubNodes['/form/settype4/'+ColEName+'/'].First then
                   Repeat
                     nodename := XT.SubNodes['/form/settype4/'+ColEName+'/'].NodeName;
@@ -10620,7 +12812,7 @@
                       RelaDocName := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformname'];
                       if RelaFile='' then
                       begin
-                        ErrStr:=Format(OMRErrInfo[5].Info,[ColCName,RelaDocName]);   //XX���XX����g��,�ݪ�XX���
+                        ErrStr:=Format(OMRErrInfo[5].Info,[ColCName,RelaDocName]);   //XX文件XX欄位填寫時,需附XX文件
                         OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[5].Ignore,OMRErrInfo[5].Display);
                         if OMRErrInfo[5].Display then
                           CaseOk := false;
@@ -10630,10 +12822,10 @@
                 end;
               Until not XT.SubNodes['/form/settype4/'].Next ;
             end;
-              //*******���Ȭ̤ۨ��*******
+              //*******有值相依文件*******
 
-              //*******���Ȥ������*******
-            if ModeNeedCheck(OMRErrInfo[6].Mode,FMode) then //�O�_�n�ˮ�
+              //*******有值互斥文件*******
+            if ModeNeedCheck(OMRErrInfo[6].Mode,FMode) then //是否要檢核
             begin
               if XT.SubNodes['/form/settype5/'].First then
               Repeat
@@ -10643,14 +12835,16 @@
                 ColCName := XT.Node['/form/settype5/'+ColEName+'/'].Attributes['coldesc'];
                 ColCName := Copy(ColCName,1,length(ColCName)-6);
                 Site := XT.Node['/form/settype5/'+ColEName+'/'].Attributes['colxy'];
-                if SiteRec= '' then   //�O����m
+                if SiteRec= '' then   //記錄位置
                   SiteRec := Site
                 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
-                  ////����g////
+                  ////有填寫////
                   if XT.SubNodes['/form/settype5/'+ColEName+'/'].First then
                   Repeat
                     nodename := XT.SubNodes['/form/settype5/'+ColEName+'/'].NodeName;
@@ -10662,9 +12856,9 @@
                       RelaDocNo := XT.Node['/form/settype5/'+ColEName+'/'+nodename+'/'].Attributes['relaformid'];
                       RelaFile := DocNo2FileName(RelaDocNo,ContextList);
                       RelaDocName := XT.Node['/form/settype5/'+ColEName+'/'+nodename+'/'].Attributes['relaformname'];
-                      if RelaFile<>'' then //����   20130604�ݨ�(='')�諸(����)
+                      if RelaFile<>'' then //有附   20130604看到(='')改的(未測)
                       begin
-                        ErrStr:=Format(OMRErrInfo[6].Info,[ColCName,RelaDocName]);   //XX���XX����g��,�����XX���
+                        ErrStr:=Format(OMRErrInfo[6].Info,[ColCName,RelaDocName]);   //XX文件XX欄位填寫時,不能附XX文件
                         OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[6].Ignore,OMRErrInfo[6].Display);
                         if OMRErrInfo[6].Display then
                           CaseOk := false;
@@ -10674,10 +12868,10 @@
                 end;
               Until not XT.SubNodes['/form/settype5/'].Next ;
             end;
-              //*******���Ȥ������*******
+              //*******有值互斥文件*******
 
-              //*******���ȼg�Ƶ�*******
-            if ModeNeedCheck(OMRErrInfo[8].Mode,FMode) then //�O�_�n�ˮ�
+              //*******有值寫備註*******
+            if ModeNeedCheck(OMRErrInfo[8].Mode,FMode) then //是否要檢核
             begin
               if XT.SubNodes['/form/settype6/'].First then
               Repeat
@@ -10688,16 +12882,19 @@
                 Site := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['colxy'];
                 Pixel := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['pixel'];
 
-                if SiteRec= '' then   //�O����m
+                if SiteRec= '' then   //記錄位置
                   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
-                  ////����g////
+                  ////有填寫////
                   if not FileExists(ImageSavePath+CaseID+'ScanMemo.dat') then
                   begin
-                    ErrStr:=Format(OMRErrInfo[8].Info,[ColCName]);   //XX���XX����g��,�ݼg�Ƶ�
+                    ErrStr:=Format(OMRErrInfo[8].Info,[ColCName]);   //XX文件XX欄位填寫時,需寫備註
                     OMRErr2ini(CaseID,ErrStr,ImageSavePath+CaseID+'\upload\'+OMRFile,SiteRec,'','',Anchor,Anchor1,False,OMRErrInfo[8].Ignore,OMRErrInfo[8].Display);
                     if OMRErrInfo[8].Display then
                       CaseOk := false;
@@ -10705,13 +12902,13 @@
                 end;
               Until not XT.SubNodes['/form/settype6/'].Next ;
             end;
-              //*******���ȼg�Ƶ�*******
+              //*******有值寫備註*******
 
-              //*******OMR�a��********
+              //*******OMR帶值********
               if XT.SubNodes['/form/settype7/'].First then
               Repeat
                 ColEName := XT.SubNodes['/form/settype7/'].NodeName;
-                ValueXT['/content/'+ColEName+'/@savevalue'] := '';  //�����w�]�ť�
+                ValueXT['/content/'+ColEName+'/@savevalue'] := '';  //先給預設空白
                 if XT.SubNodes['/form/settype7/'+ColEName+'/'].First then
                 Repeat
                   nodename := XT.SubNodes['/form/settype7/'+ColEName+'/'].NodeName;
@@ -10721,17 +12918,19 @@
                     Site := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['colxy'];
                     OMRValue := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['getvalue'];
 
-                    //����Nok
+                    //有填就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;  //����N�����]�w����
+                      ValueXT['/content/'+ColEName+'/@savevalue'] := OMRValue;  //有填就換成設定的值
                       Break;
                     end;
                   end;
                 Until not XT.SubNodes['/form/settype7/'+ColEName+'/'].Next;
               Until not XT.SubNodes['/form/settype7/'].Next ;
 
-              //*******OMR�a��********
+              //*******OMR帶值********
             //end;
           Finally
           if (OMRValue <> '') then
@@ -10740,6 +12939,7 @@
           RelaXT.Free;
           end;
         end;
+        //必填迴圈結束
       Finally
       ValueXT.Free;
       end;
@@ -10748,7 +12948,7 @@
   Result := CaseOk;
 end;
 
-Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR�ˮ֥��Ѽg�Jini
+Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini
 var
   ini : Tinifile;
   Errcount : Integer;
@@ -10758,7 +12958,7 @@
   begin
     ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini');
     try
-      Errcount := ini.ReadInteger('OMRCount','Count',0);  //�z�LErrcount�ӹ���
+      Errcount := ini.ReadInteger('OMRCount','Count',0);  //透過Errcount來對應
       inc(ErrCount);
       ini.WriteString(inttostr(ErrCount),'Reason',Reason);
       ini.WriteBool(inttostr(ErrCount),'Ingnore',Ingnore);
@@ -10788,7 +12988,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR�ˮ֥��ѱqini�g�JListView
+Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView
 var
   ini : Tinifile;
   Errcount : Integer;
@@ -10801,7 +13001,7 @@
 
     for i := 1 to ErrCount do
     begin
-      Del := ini.ReadBool(inttostr(i),'Del',False); //�O�_�Q�����F
+      Del := ini.ReadBool(inttostr(i),'Del',False); //是否被移除了
       if Not Del then
       begin
         With ErrlistForm.ErrListLV.Items.Add do
@@ -10818,35 +13018,70 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.DownLanguage:Boolean;  //�U���h��y����
+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
   Result := True;     // http://192.168.0.101:8080/fbnp/servlet/CWC01?act=getservertime
-
-  If not ProcessServlet(HTTPSClient,FURL+'Language.Lng','',FReWrite,Memo1,False) Then
+  //dnFile(HTTPSClient,FUrl+'Language.Lng','','',LngPath+'Language.Lng',FReWrite.Text,Memo1,False,DownImgStatus)
+  If not dnFile_Get(HTTPSClient,FUrl+'Language.Lng','','',LngPath+'Language.Lng',FReWrite,Memo1,False,DownImgStatus) Then
   begin
-    HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+    HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
     Result := False;
     Exit;
   end;
   IF memo1.Lines.Strings[0] = '1' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end
   Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
   begin
-    HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+    HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
     Result := False;
     Exit;
-  end
-  Else {if Trim(memo1.Lines.Strings[0]) = SBUtils.StrToUTF8('MultiLanguage') Then}
-  begin
-    memo1.Lines.SaveToFile(LngPath+'Language.lng',TEncoding.UTF8);
   end;
+  
 end;
 
-procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //��FormCode�ӧ�v��
+procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像
 var i,p:integer;
     ISB : TImageScrollBox;
     lb : TLabel;
@@ -10855,10 +13090,10 @@
     List_FormCode,Err_FormCode: String;
     iFormID : String;
 begin
-   ShowText := '�v����ܤ�,�еy��';
+   ShowText := _Msg('影像顯示中,請稍候');
    DataLoading(True,True);
 
-   IF FormCode = 'ShowAll' then  //��ܩҦ����v�� (�]������|�ǪŦr��,�ҥH��ShowAll)
+   IF FormCode = 'ShowAll' then  //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll)
    begin
      ClearView(1);
      CreatePreViewISB(ContextList.Count);
@@ -10880,7 +13115,7 @@
 
        List_FormCode := FileName2FormCode(ContextList.Strings[i]);
        lb := TLabel(FindComponent('lb'+intToStr(stview)));
-       lb.Caption := Format(_Msg('��%s��'),[Add_Zoo(i+1,3)]);
+       lb.Caption := Format(_Msg('第%s頁'),[Add_Zoo(i+1,3)]);
        If List_FormCode = '' Then
          lb.Caption := lb.Caption+'('+FormCode2FormName(List_FormCode)+')'
        Else
@@ -10896,7 +13131,7 @@
      end;
      FitPreViewISB;
    end
-   Else  //��ܫ��wFormCode���v��
+   Else  //顯示指定FormCode的影像
    begin
      If (TreeView1.Selected <> nil) Then
      begin
@@ -10940,7 +13175,7 @@
            //MPSViewX.ImageZoomMode := zmFullpage;
            //MPSViewX.AntiAliased := True;
            lb := TLabel(FindComponent('lb'+intToStr(stview)));
-           lb.Caption := Format(_Msg('��%s��'),[Add_Zoo(i+1,3)]);
+           lb.Caption := Format(_Msg('第%s頁'),[Add_Zoo(i+1,3)]);
            If List_FormCode = '' Then
              lb.Caption := lb.Caption+'('+FormCode2FormName(NowCaseno,List_FormCode)+')'
            Else
@@ -10962,18 +13197,21 @@
    DataLoading(False,False);
 end;
 
-procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //��DocNo�ӧ�v��
+procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像
 var i,n,p:integer;
     ISB : TImageScrollBox;
     lb : TLabel;
     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 := '�v����ܤ�,�еy��';
+   ShowText := _Msg('影像顯示中,請稍候');
    DataLoading(True,True);
-   IF DocNo = 'ShowAll' then  //��ܩҦ����v�� (�]������|�ǪŦr��,�ҥH��ShowAll)
+ST1:=TStringList.Create;
+//Display1.Lines.Clear;
+   IF DocNo = 'ShowAll' then  //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll)
    begin
      ClearView(1);
      if GetCasePage(ImageSavePath,NowCaseno) > 30 then
@@ -10982,37 +13220,66 @@
        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   //�J�w���y���ݫD�J�w���
-          ((FIs_In_Wh  = 'N') and (DocNoIs_In_WH(iDocNo)))) and
-          ((iDocNo <> 'Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then     //�D�J�w���y���ݤJ�w���
+
+       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 := False;
+         ISB.AntiAliased := True;
          if ISB.ZoomPercent > 100  then
            ISB.AntiAliased := False;
          ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1);
 
-         DpiResize(ISB.Graphic,36);
+         DpiResize(ISB.Graphic,36,False);
          ISB.Redraw(true);
 
        end;
+
      end;
      //if DirectoryExists(Path+'Attach') then
      if DirectoryExists(Path+AttName) then
@@ -11032,28 +13299,48 @@
          ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1);
        end;
      end;
+
      FitPreViewISB;
+
    end
-   Else if (DocNo <> '') and (FormID = '') then  //��ܫ��wDocNo+�էO���v��  ����� Attach
-   begin
+   Else if (DocNo <> '') and (FormID = '') then  //顯示指定DocNo+組別的影像  附件傳 Attach
+   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;
        ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[i],1);
-       DpiResize(ISB.Graphic,36);
+       DpiResize(ISB.Graphic,36,False);
        ISB.Redraw(true);
      end;
      FitPreViewISB;
    end
-   Else if (FormID <> '') {and (FormID <> 'Attach')} then  //��ܫ��wFormID���v��
+   Else if (FormID <> '') {and (FormID <> 'Attach')} then  //顯示指定FormID的影像
    begin
      If (TreeView1.Selected <> nil) Then
      begin
@@ -11065,65 +13352,47 @@
        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);
+           DpiResize(ISB.Graphic,36,False);
            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;
 
-Function TCB_IMGPSScanX.ShapeName2PreViewISBName(SP:TShape):String; //��X���wPreViewISBName
+Function TCB_IMGPSScanX.ShapeName2PreViewISBName(SP:TShape):String; //轉出指定PreViewISBName
 begin
   Result := ISBName+Copy(SP.Name,3,length(SP.Name)-2);
 end;
@@ -11235,6 +13504,7 @@
   ISB : TImageScrollBox;
   Panel : TPanel;
   i,W,H : Integer;
+  myDate : TDateTime;
 begin
   FreePreViewISB;
   ScrollBox1.HorzScrollBar.Visible := False;
@@ -11242,32 +13512,38 @@
   H := 250;
   for I := 1 to Count do
   begin
-    Panel := TPanel.Create(Self);
-    Panel.Name := 'M_Pl'+inttostr(i);
-    Panel.Left := 4;
-    Panel.Top := (i-1)*H+(6*i);
-    Panel.Height := H;
-    Panel.Width := W;
-    Panel.Parent := ScrollBox1;
-    Panel.Caption :='';
-    ISB := TImageScrollBox.Create(Self);
-    ISB.Name := ISBName+inttostr(i);
-    ISB.Parent := Panel;
-    ISB.Align := alClient;
-    ISB.ZoomMode := zmFullPage;
-    ISB.DragMode := dmAutomatic;
-    ISB.MouseMode := mmuser;
-    ISB.OnImageClick := ISBClick;
-    ISB.OnImageMouseMove := ISBMouseMove;
-    ISB.PopupMenu := PopupMenu6;
-    ISB.OnImageMouseDown := ISBImageMouseDown;
-    ISB.OnImageMouseUp := ISBImageMouseUp;
-    //ISB.OnStartDrag := ISBStartDrag;
-    ISB.OnEndDrag := ISBEndDrag;
-//    ISB.OnImageDragDrop := ISBDragDrop;
-//    ISB.OnImageDragOver := ISBDragOver;
-    ISB.OnDragDrop := ISBDragDrop;
-    ISB.OnDragOver := ISBDragOver;
+
+    if FindComponent('M_Pl'+inttostr(i))=nil then
+    begin
+      Panel := TPanel.Create(Self);
+      Panel.Name := 'M_Pl'+inttostr(i);//FormatDateTime('yyyymmddhhnnsszzz', now)
+      Panel.Left := 4;
+      Panel.Top := (i-1)*H+(6*i);
+      Panel.Height := H;
+      Panel.Width := W;
+      Panel.Parent := ScrollBox1;
+      Panel.Caption :='';
+
+      if FindComponent(ISBName+inttostr(i))=nil then
+      begin
+        ISB := TImageScrollBox.Create(Self);
+        ISB.Name := ISBName+inttostr(i);
+        ISB.Parent := Panel;
+        ISB.Align := alClient;
+        ISB.ZoomMode := zmFullPage;
+        ISB.DragMode := dmAutomatic;
+        ISB.MouseMode := mmuser;
+        ISB.OnImageClick := ISBClick;
+        ISB.OnImageMouseMove := ISBMouseMove;
+        ISB.PopupMenu := PopupMenu6;
+        ISB.OnImageMouseDown := ISBImageMouseDown;
+        ISB.OnImageMouseUp := ISBImageMouseUp;
+        ISB.OnEndDrag := ISBEndDrag;
+        ISB.OnDragDrop := ISBDragDrop;
+        ISB.OnDragOver := ISBDragOver;
+      end;
+    end;
+
   end;
 
 end;
@@ -11276,25 +13552,29 @@
 var
   i : Integer;
 begin
+try
   For i:= ComponentCount -1 downto 0 do
   begin
-    IF Components[i] is TImageScrollBox Then
+    IF (Components[i] is TImageScrollBox) and (Components[i]<>nil) Then
     begin
       IF Pos(ISBName,Components[i].Name) > 0 Then
         Components[i].Free;
     end
-    Else If Components[i] is TPanel Then
+    Else If (Components[i] is TPanel) and  (Components[i]<>nil) Then
     begin
       IF Pos('M_Pl',Components[i].Name) > 0  Then
         Components[i].Free;
     end
-    Else If Components[i] is TShape Then
+    Else If (Components[i] is TShape) and (Components[i]<>nil) Then
     begin
       IF Pos('SP',Components[i].Name) > 0  Then
         Components[i].Free;
     end;
   end;
   Application.ProcessMessages;
+except on E: Exception do
+end;
+
   //showmessage(inttostr(Count));
 end;
 
@@ -11335,7 +13615,7 @@
 
 end;
 
-Procedure TCB_IMGPSScanX.PaintShape(FromImg,ToImg:TImageScrollBox); //�e���Q������v��
+Procedure TCB_IMGPSScanX.PaintShape(FromImg,ToImg:TImageScrollBox); //畫有被選取的影像
 var
   i,F_No,T_No : Integer;
   SP : TShape;
@@ -11345,7 +13625,7 @@
     Result := strtoint(Copy(iISB.Name,length(ISBName)+1,length(iISB.Name)-length(ISBName))); //'PreViewISB'
   end;
 begin
-  IF ToImg = nil Then   //�u�e��@��
+  IF ToImg = nil Then   //只畫單一個
   begin
     ISB := TImageScrollBox(FindComponent(ISBName+inttostr(GetImgNo(FromImg))));
     if TShape(FindComponent('SP'+inttostr(GetImgNo(FromImg)))) = nil then
@@ -11395,7 +13675,7 @@
 var
   i : Integer;
 begin
-  IF SelectISB = nil then //��Free;
+  IF SelectISB = nil then //全Free;
   begin
     For i:= ComponentCount -1 downto 0 do
     begin
@@ -11406,7 +13686,7 @@
       end;
     end;
   end
-  Else  //�uFree���w��
+  Else  //只Free指定的
   begin
     TShape(FindComponent('SP'+Copy(SelectISB.Name,length(ISBName)+1,length(SelectISB.Name)-length(ISBName)))).Free;
   end;
@@ -11441,6 +13721,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);
@@ -11451,7 +13734,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
@@ -11604,7 +13887,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetCaseFormID(Path:String):String;  //���ץ󪺥DFormID
+Function TCB_IMGPSScanX.GetCaseFormID(Path:String):String;  //取案件的主FormID
 var i,n : Integer;
     FileFormID : String;
 begin
@@ -11613,6 +13896,11 @@
   for I := 0 to ContextList.Count - 1 do
   begin
     FileFormID := FileName2FormCode(ContextList.Strings[i]);
+
+    if DivPageFormIDList.IndexOf(FileFormID)<>-1 then //20170509 跳過分案頁的formid
+    begin
+      Continue;
+    end;
     if FindDivFormCode(FileFormID) then
     begin
       Result := FileFormID;
@@ -11621,7 +13909,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CreateFormID_FormName(Path,CaseID:String);  //����FormID_FormName.dat
+Procedure TCB_IMGPSScanX.CreateFormID_FormName(Path,CaseID:String);  //產生FormID_FormName.dat
 var i : Integer;
     S : TStringlist;
     FormID : String;
@@ -11641,7 +13929,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CreateDocNo_DocName(Path,CaseID:String);  //����DocNo_DocName.dat
+Procedure TCB_IMGPSScanX.CreateDocNo_DocName(Path,CaseID:String);  //產生DocNo_DocName.dat
 var
   i : Integer;
   S : TStringlist;
@@ -11653,7 +13941,7 @@
     for i := 0 to CaseDocNoList.Count - 1 do
     begin
       Doc_Name := CaseDocNoList.Strings[i]+'_'+DocNo2DocName(CaseID,CaseDocNoList.Strings[i]);
-      if not DocnoNeedGroup(CaseDocNoList.Strings[i]) Then  //���Τ��ժ��[*��������
+      if not DocnoNeedGroup(CaseDocNoList.Strings[i]) Then  //不用分組的加*號給智豪
         Doc_Name := '*'+Doc_Name;
       S.Add(Doc_Name);
     end;
@@ -11663,7 +13951,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.CreateIn_WH(CaseID:String);  //����In_WH.dat
+Procedure TCB_IMGPSScanX.CreateIn_WH(CaseID:String);  //產生In_WH.dat
 var
   i,n : Integer;
   DocDirList,In_WH_List : TStringlist;
@@ -11694,7 +13982,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CreateDocNo_Info(CaseID:String):String; //���� DocNo[tab]����[tab]�`����[tab]�O�_����[����]DocNo[tab]����[tab]�`����[tab]�O�_����
+Function TCB_IMGPSScanX.CreateDocNo_Info(CaseID:String):String; //產生 DocNo[tab]份數[tab]總頁數[tab]是否異動[換行]DocNo[tab]份數[tab]總頁數[tab]是否異動
 var
   i,n : Integer;
   DocDirList,DocDir_CopiesList,FileList,C_DocNoList : TStringlist;
@@ -11710,13 +13998,18 @@
   try
     Str := '';
     if Not FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then Exit;
+
     DocDirList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
+
+    if DocDirList.Count =0 then exit;//20170222 新加
+
+
     DocDir_CopiesList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo_Copies.dat');
     while DocDirList.Count > 0 do
     begin
       iDocDir := DocDirList.Strings[0];
       DocNo := DocNoDir2DocNo(iDocDir);
-      if Copy(iDocDir,1,5) <> 'ZZZZZ' then   //�����۩w���
+      if Copy(iDocDir,1,5) <> 'ZZZZZ' then   //不為自定文件
       begin
         //icopys := 1;
         icopys := GetDocNoCount(CaseID,DocNo);
@@ -11773,7 +14066,7 @@
   end; }
 end;
 
-Function TCB_IMGPSScanX.CreateCustDocNo_Info(CaseID:String):String; //���ۭͦq��� DocName[tab]����[tab]�`����[tab]�O�_����[#13#10]DocName[tab]����[tab]�`����[tab]�O�_����
+Function TCB_IMGPSScanX.CreateCustDocNo_Info(CaseID:String):String; //產生自訂文件 DocName[tab]份數[tab]總頁數[tab]是否異動[#13#10]DocName[tab]份數[tab]總頁數[tab]是否異動
 var
   i,n : Integer;
   DocDirList,FileList : TStringlist;
@@ -11788,11 +14081,12 @@
     Str := '';
     if Not FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then Exit;
     DocDirList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
+//ShowMessage(DocDirList.Text);
     while DocDirList.Count > 0 do
     begin
       iDocDir := DocDirList.Strings[0];
       DocNo := DocNoDir2DocNo(iDocDir);
-      if Copy(iDocDir,1,5) = 'ZZZZZ' then   //�O�۩w���
+      if Copy(iDocDir,1,5) = 'ZZZZZ' then   //是自定文件
       begin
         //icopys := 1;
         DocName := GetCustomDocName(ImageSavePath+CaseID+'\',DocNo);
@@ -11825,7 +14119,7 @@
   Result := Str;
 end;
 
-Function TCB_IMGPSScanX.CreateDocnoFrom_Info(CaseID:String):String; //���ͳQ�޶i���O�޳U����T  Docno[tab]����[tab]�ץ�s��#13#10Docno[tab]����[tab]�ץ�s��
+Function TCB_IMGPSScanX.CreateDocnoFrom_Info(CaseID:String):String; //產生被引進的保管袋文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
 var
   i,n : Integer;
   DocDirList,DocDir_CopiesList,FileList : TStringlist;
@@ -11842,12 +14136,16 @@
     Str := '';
     if Not FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then Exit;
     DocDirList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
+
+    if DocDirList.Count=0 then exit;//20170222 新加
+
+
     DocDir_CopiesList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo_Copies.dat');
     while DocDirList.Count > 0 do
     begin
       iDocDir := DocDirList.Strings[0];
       DocNo := DocNoDir2DocNo(iDocDir);
-      if (Copy(iDocDir,1,5) <> 'ZZZZZ') then   //�����۩w���
+      if (Copy(iDocDir,1,5) <> 'ZZZZZ') then   //不為自定文件
       begin
         //icopys := 1;
         //icopys := GetDocNoCount(CaseID,DocNo);
@@ -11886,7 +14184,7 @@
   Result := Str;
 end;
 
-Function TCB_IMGPSScanX.CreateCustDocNoFrom_Info(CaseID:String):String; //���ͳQ�޶i���۩w����T  Docno[tab]����[tab]�ץ�s��#13#10Docno[tab]����[tab]�ץ�s��
+Function TCB_IMGPSScanX.CreateCustDocNoFrom_Info(CaseID:String):String; //產生被引進的自定文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
 var
   i,n : Integer;
   DocDirList,FileList : TStringlist;
@@ -11906,7 +14204,7 @@
     begin
       iDocDir := DocDirList.Strings[0];
       DocNo := DocNoDir2DocNo(iDocDir);
-      if Copy(iDocDir,1,5) = 'ZZZZZ' then   //�O�۩w���
+      if Copy(iDocDir,1,5) = 'ZZZZZ' then   //是自定文件
       begin
         //icopys := 1;
         //icopys := GetDocNoCount(CaseID,DocNo);
@@ -11944,14 +14242,14 @@
   Result := Str;
 end;
 
-Function TCB_IMGPSScanX.CreateAttach_Info(CaseID:String):String; //���ͬO�_��Attach Y:�� N:�S��
+Function TCB_IMGPSScanX.CreateAttach_Info(CaseID:String):String; //產生是否有Attach Y:有 N:沒有
 begin
   Result := 'N';
   if GetDocDir_Page(CaseID,AttName) > 0 Then
     Result := 'Y';
 end;
 
-Function TCB_IMGPSScanX.GetDocNoEdit(CaseID,DocNo,DocName:String):String; //���XDocNo�O�_�Q���� (Y/N)
+Function TCB_IMGPSScanX.GetDocNoEdit(CaseID,DocNo,DocName:String):String; //取出DocNo是否被異動 (Y/N)
 var
   i : Integer;
   EditedDocDirList : TStringlist;
@@ -11991,7 +14289,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetDocNo_Count(Path,DocNo:String):Integer;  //���X������
+Function TCB_IMGPSScanX.GetDocNo_Count(Path,DocNo:String):Integer;  //取出文件份數
 var
   i : Integer;
   iCopys : integer;
@@ -12031,7 +14329,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.GetDocNo_Page(Path,DocNo:String):Integer;  //���X����`����
+Function TCB_IMGPSScanX.GetDocNo_Page(Path,DocNo:String):Integer;  //取出文件總頁數
 var
   i : Integer;
   ipages : integer;
@@ -12058,21 +14356,21 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //�ˬdFormID�O�_�s�b
+Function TCB_IMGPSScanX.FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //檢查FormID是否存在
 var
   STDate,SPDate : String;
   Docno,Version : String;
 begin
   Result := False;
-  If FormCode = '' then  //�����ˬd
+  If FormCode = '' then  //附件不檢查
   begin
     Result := True;
     Exit;
   end;
-  if CheckDate then  //�n�ˬd���
+  if CheckDate then  //要檢查日期
   begin
-    STDate := '00000000'; //�S�]�w
-    SPDate := '99999999'; //�S�]�w
+    STDate := '00000000'; //沒設定
+    SPDate := '99999999'; //沒設定
 
     IF FindSQLData(FORM_INF_List,'T1.FORM_ID,T1.DOC_NO','T1.FORM_ID',FormCode,index,FindResult) then
     begin
@@ -12083,8 +14381,8 @@
         Result := True;
         STDate := GetFindResult('START_DATE');
         SPDate := GetFindResult('STOP_DATE');
-        if STDate = '' then STDate := '00000000'; //�S�]�w
-        if SPDate = '' then SPDate := '99999999'; //�S�]�w
+        if STDate = '' then STDate := '00000000'; //沒設定
+        if SPDate = '' then SPDate := '99999999'; //沒設定
         if (ServerDate < STDate) or (ServerDate > SPDate) then
           Result := False;
       end;
@@ -12096,7 +14394,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno�O�_�s�b�ץ��
+Function TCB_IMGPSScanX.Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno是否存在案件裡
 var
   i : Integer;
   S : TStringlist;
@@ -12126,7 +14424,7 @@
   TwainShowUI := CB1.Checked;
 end;
 
-Procedure TCB_IMGPSScanX.ReSortFileName(Path:String); //�ɦW���s�Ƨ�
+Procedure TCB_IMGPSScanX.ReSortFileName(Path:String); //檔名重新排序
 var
   i : Integer;
   OldName,NewName : String;
@@ -12142,6 +14440,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;
@@ -12153,7 +14452,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ReSortFileName_New(Path:String); //�ɦW���s�Ƨ�
+Procedure TCB_IMGPSScanX.ReSortFileName_New(Path:String); //檔名重新排序
 var
   i : Integer;
   OldName,NewName : String;
@@ -12180,7 +14479,7 @@
   end;
 end;
 
-Procedure TCB_IMGPSScanX.ReSortFileName2Scanlist(Path:String); //�ɦW���s�Ƨǵ�Scanlist.dat
+Procedure TCB_IMGPSScanX.ReSortFileName2Scanlist(Path:String); //檔名重新排序給Scanlist.dat
 var
   i : Integer;
   OldName,NewName : String;
@@ -12205,7 +14504,7 @@
 end;
 
 
-Function TCB_IMGPSScanX.GetOMRCheckSet : Boolean; //�U��OMR�ˮ�XML��
+Function TCB_IMGPSScanX.GetOMRCheckSet : Boolean; //下載OMR檢核XML檔
 var
   SendData : String;
   LastDateTime : String;
@@ -12227,32 +14526,32 @@
     SendData := 'settype=3&lastupdate='+LastDateTime;
     if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC01/settings',SendData,CheckXmlPath+'OMRSet.zip',FReWrite,Memo1,False,DownImgStatus) then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
-    if FileExists(CheckXmlPath+'OMRSet.zip') then   //����s
+    if FileExists(CheckXmlPath+'OMRSet.zip') then   //有更新
     begin
-      ExecuteUnZip(CheckXmlPath+'OMRSet.zip',CheckXmlPath,False);
+      ExecuteUnZip(CheckXmlPath+'OMRSet.zip',CheckXmlPath,True);
       S.Clear;
       S.Add(ServerDate+GetBalance2Time(Balance));
       S.SaveToFile(CheckXmlPath+'LastDateTime.dat');
     end
     Else
     begin
-      if (Memo1.Lines.Strings[0] = 'nodata') Then   //�S��s
+      if (Memo1.Lines.Strings[0] = 'nodata') Then   //沒更新
       begin
         Result := True;
       end
       Else if (Memo1.Lines.Strings[0] = '1') Then
       begin
-        HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+        HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
         Result := False;
         Exit;
       end
       Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
       begin
-        HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+        HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
         Result := False;
         Exit;
       end;
@@ -12264,7 +14563,7 @@
 
 end;
 
-Function TCB_IMGPSScanX.GetKeyinSet : Boolean; //���n���]�w
+Function TCB_IMGPSScanX.GetKeyinSet : Boolean; //取登打設定
 var
   SendData : String;
   LastDateTime : String;
@@ -12285,32 +14584,32 @@
     SendData := 'settype=2&lastupdate='+LastDateTime;
     if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC01/settings',SendData,SitePath+'KeyinSet.zip',FReWrite,Memo1,False,DownImgStatus) then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
-    if FileExists(SitePath+'KeyinSet.zip') then  //����s
+    if FileExists(SitePath+'KeyinSet.zip') then  //有更新
     begin
-      ExecuteUnZip(SitePath+'KeyinSet.zip',SitePath,False);
+      ExecuteUnZip(SitePath+'KeyinSet.zip',SitePath,True);
       S.Clear;
       S.Add(ServerDate+GetBalance2Time(Balance));
       S.SaveToFile(SitePath+'LastDateTime.dat');
     end
     Else
     begin
-      if (Memo1.Lines.Strings[0] = 'nodata') Then   //�S��s
+      if (Memo1.Lines.Strings[0] = 'nodata') Then   //沒更新
       begin
         Result := True;
       end
       Else if (Memo1.Lines.Strings[0] = '1') Then
       begin
-        HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+        HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1];
         Result := False;
         Exit;
       end
       Else if Pos('<script type="text/javascript" src="scripts/CW00/login.js"></script>',Memo1.Lines.Text) > 0 then
       begin
-        HttpErrStr := _Msg('���~��]:')+_Msg('���m�L�[�γQ�n�X,�Э��s�n�J');
+        HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
         Result := False;
         Exit;
       end;
@@ -12327,19 +14626,23 @@
 var
   SendData : String;
 begin
-  SendData := 'data='+FData+'&verify='+FVerify+'&case_no='+CaseID;
-  if (FMode = 'NSCAN') then
+//Memo1.Clear;
+  SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID+'&work_no='+FWork_no;
+  if (FMode = 'NSCAN') or (FMode = 'DSCAN') then
   begin
+//ShowMessage('JJJJJ');
     If not ProcessServlet_Get(HTTPSClient,FURL+'service/imgpsc/IMGPSC05/isnew',SendData,FReWrite,Memo1,False) Then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := -1;
       Exit;
     end;
   end;
+//ShowMessage(SendData);
+
   IF memo1.Lines.Strings[0] <> '0' Then
   begin
-    HttpErrStr := _Msg('���~��]:')+memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('')+memo1.Lines.Strings[1]+'。';
     Result := -1;
     Exit;
   end
@@ -12347,7 +14650,7 @@
   begin
     if (memo1.Lines.Count < 2) then
     begin
-      HttpErrStr := _Msg('���~��]:')+'OCX:Index Count error';
+      HttpErrStr := _Msg('')+'OCX:Index Count error';
       Result := -1;
       Exit;
     end
@@ -12361,7 +14664,7 @@
         Result := 1
       Else
       begin
-        HttpErrStr := _Msg('���~��]:')+'OCX:Value error';
+        HttpErrStr := _Msg('')+'OCX:Value error';
         Result := -1;
         Exit;
       end;
@@ -12369,7 +14672,7 @@
   end;
 end;
 
-Function TCB_IMGPSScanX.CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //�q���ǰe����
+Function TCB_IMGPSScanX.CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //通知傳送完成
 var
   OMRValue,Batchnum,Usermemo,Checkmemo,UpformID,ReMoveMemo: String;
   Case_type,Handle_no,Format_id,Cen_Uid,Cen_Cliname,Cen_Platno,Cen_Apolyno,Case_priority : String;
@@ -12389,12 +14692,12 @@
 
 
     Case_type := '0';
-    if FileExists(Path+'Context.dat') then    //���y����
+    if FileExists(Path+'Context.dat') then    //掃描頁數
     begin
       S.LoadFromFile(Path+'Context.dat');
       Pages := S.Count;
     end;
-    if not FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then //�p�G�S�o���ɴN�����͹w�]��
+    if not FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then //如果沒這個檔就重產生預設值
     begin
       ClearCaseIndex;
       WriteCaseIndex(ImageSavePath+CaseID+'\');
@@ -12403,34 +14706,34 @@
     begin
       S.LoadFromFile(ImageSavePath+CaseID+'\CaseIndex.dat');
 
-      Handle_No := S.Strings[0];    //�g��N��
-      Cen_Uid := S.Strings[1];      //�Q�O�HID
-      Cen_Cliname := S.Strings[2];  //�Q�O�H�m�W
-      Cen_Platno := S.Strings[3];   //����
-      Case_Priority := S.Strings[4];//�ץ󵥯�
-      if FMode = 'SSCAN' then  //ñ�p���󪺮ɭԤ@�߶�Format_ID
+      Handle_No := S.Strings[0];    //經辦代號
+      Cen_Uid := S.Strings[1];      //被保人ID
+      Cen_Cliname := S.Strings[2];  //被保人姓名
+      Cen_Platno := S.Strings[3];   //車號
+      Case_Priority := S.Strings[4];//案件等級
+      if FMode = 'SSCAN' then  //簽署章件的時候一律傳Format_ID
       begin
-        Format_ID := S.Strings[5];    //�D��� (�����渹or��O�渹or�O�渹�Xor�O�I�Ҹ�)
+        Format_ID := S.Strings[5];    //主鍵值 (報價單號or續保單號or保單號碼or保險證號)
       end
       Else
       begin
         if (Length(UpformID) = 12) and (UpformID[2] = '-') then
-          Format_ID := S.Strings[5]    //�D��� (�����渹or��O�渹or�O�渹�Xor�O�I�Ҹ�)
+          Format_ID := S.Strings[5]    //主鍵值 (報價單號or續保單號or保單號碼or保險證號)
         else
-          Cen_Apolyno := S.Strings[5]; //�j���Ҹ�
+          Cen_Apolyno := S.Strings[5]; //強制證號
       end;
       if (FMode = 'MSCAN') and (length(Format_ID) = 16) and (Copy(Format_ID,1,2) = '05') then
       begin
-        Format_ID := Copy(Format_ID,3,14);   //20130606 yuu���ʲz���󪺥D��Ȭ�16�X�B�}�}��05���n�h��
+        Format_ID := Copy(Format_ID,3,14);   //20130606 yuu說監理站件的主鍵值為16碼且開開為05的要去掉
       end;
 
     end; }
-    if FileExists(ImageSavePath+CaseID+'\GetValue.xml') then    //���y�a��
+    if FileExists(ImageSavePath+CaseID+'\GetValue.xml') then    //掃描帶值
     begin
       S.LoadFromFile(ImageSavePath+CaseID+'\GetValue.xml');
       OMRValue := Trim(S.Text);
     end;
-    if MainCase then    //���D�����D�n�ץ�
+    if MainCase then    //雙主約的主要案件
     begin
       if FileExists(ImageSavePath+CaseID+'\Batchnum.dat') then
       begin
@@ -12438,7 +14741,7 @@
         Batchnum := Trim(S.Text);
       end;
     end
-    Else    //���D�����ĤG�ץ�
+    Else    //雙主約的第二案件
     begin
       if FileExists(ImageSavePath+CaseID+'\SecBatchnum.dat') then
       begin
@@ -12471,30 +14774,30 @@
   if (FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') then
   begin
     SendData := 'checktime='+EnCodeDateTime
-                +'&work_no='+FWork_No                                  //�@�~�O
-                +'&case_id='+CaseID                                    //���z�s��
-                +'&form_id='+UpformID                                  //���N��
-                +'&scan_page='+inttostr(pages)                         //���y����
-                +'&scan_get_value='+HTTPEncode(UTF8Encode(OMRValue))   //���y�a��
-                +'&case_priority='+case_priority                       //�ץ󵥯�
-                +'&batch_no='+batchnum                                 //�����帹
-                +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))        //�ϥΪ̵��O
-                +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))      //�ˮֵ��O
-                +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))    //�ˮֲ������O
-                +'&case_type='+Case_type                               //�i�����    �i��0 �k��1
-                +'&handle_no='+Handle_no                               //�g��N��
-                +'&format_id='+Format_id                               //�ץ�D���
-                +'&cen_uid='+Cen_Uid                                   //�Q�O�HID
-                +'&cen_cliname='+HTTPEncode(UTF8Encode(Cen_Cliname))   //�Q�O�H�m�W
-                +'&cen_platno='+Cen_Platno                             //���P
-                +'&cen_apolyno='+Cen_Apolyno                           //�j���Ҹ�
-                +'&has_authorize='+Has_Authorize;                      //�O�_�����v�Ѽv��
+                +'&work_no='+FWork_No                                  //作業別
+                +'&case_id='+CaseID                                    //受理編號
+                +'&form_id='+UpformID                                  //表單代號
+                +'&scan_page='+inttostr(pages)                         //掃描頁數
+                +'&scan_get_value='+HTTPEncode(UTF8Encode(OMRValue))   //掃描帶值
+                +'&case_priority='+case_priority                       //案件等級
+                +'&batch_no='+batchnum                                 //車隊批號
+                +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))        //使用者註記
+                +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))      //檢核註記
+                +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))    //檢核移除註記
+                +'&case_type='+Case_type                               //進件種類    進件0 歸檔1
+                +'&handle_no='+Handle_no                               //經辦代號
+                +'&format_id='+Format_id                               //案件主鍵值
+                +'&cen_uid='+Cen_Uid                                   //被保人ID
+                +'&cen_cliname='+HTTPEncode(UTF8Encode(Cen_Cliname))   //被保人姓名
+                +'&cen_platno='+Cen_Platno                             //車牌
+                +'&cen_apolyno='+Cen_Apolyno                           //強制證號
+                +'&has_authorize='+Has_Authorize;                      //是否有授權書影像
                 Showmessage(SendData);
     if not RejectCase then
     begin
       If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC05',SendData,FReWrite,Memo1,False) Then
       begin
-        HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+        HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
         Result := False;
         Exit;
       end;
@@ -12503,7 +14806,7 @@
     begin
       If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC06',SendData,FReWrite,Memo1,False) Then
       begin
-        HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+        HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
         Result := False;
         Exit;
       end;
@@ -12522,11 +14825,11 @@
                 +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))
                 +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))
                 +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))
-                +'&has_authorize='+Has_Authorize;    //�O�_�����v�Ѽv��
+                +'&has_authorize='+Has_Authorize;    //是否有授權書影像
     //Showmessage(SendData);
     If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC08',SendData,FReWrite,Memo1,False) Then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
@@ -12540,10 +14843,10 @@
                 +'&user_memo='+HTTPEncode(UTF8Encode(usermemo))
                 +'&check_memo='+HTTPEncode(UTF8Encode(checkmemo))
                 +'&remove_memo='+HTTPEncode(UTF8Encode(ReMoveMemo))
-                +'&has_authorize='+Has_Authorize;     //�O�_�����v�Ѽv��
+                +'&has_authorize='+Has_Authorize;     //是否有授權書影像
     If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC09',SendData,FReWrite,Memo1,False) Then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
@@ -12561,10 +14864,10 @@
                 +'&usermemo='+HTTPEncode(UTF8Encode(usermemo))
                 +'&checkmemo='+HTTPEncode(UTF8Encode(checkmemo))
                 +'&removememo='+HTTPEncode(UTF8Encode(ReMoveMemo))
-                +'&has_authorize='+Has_Authorize;        //�O�_�����v�Ѽv��
+                +'&has_authorize='+Has_Authorize;        //是否有授權書影像
     If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC01',SendData,FReWrite,Memo1,False) Then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
@@ -12581,10 +14884,10 @@
                     +'&usermemo='+HTTPEncode(UTF8Encode(usermemo))
                     +'&checkmemo='+HTTPEncode(UTF8Encode(checkmemo))
                     +'&removememo='+HTTPEncode(UTF8Encode(ReMoveMemo))
-                    +'&has_authorize='+Has_Authorize;      //�O�_�����v�Ѽv��
+                    +'&has_authorize='+Has_Authorize;      //是否有授權書影像
     If not ProcessServlet(HTTPSClient,FURL+'servlet/CWC01',SendData,FReWrite,Memo1,False) Then
     begin
-      HttpErrStr := _Msg('���~�N�X:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
+      HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason;
       Result := False;
       Exit;
     end;
@@ -12592,7 +14895,7 @@
 
   if Memo1.Lines.Strings[0] <> '0'then
   begin
-    HttpErrStr := _Msg('���~��]:')+Memo1.Lines.Strings[1];
+    HttpErrStr := _Msg('錯誤原因:')+Memo1.Lines.Strings[1];
     Result := False;
     Exit;
   end;
@@ -12604,15 +14907,23 @@
   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;
   InitialOk := False;
+
+  FMaxUploadSize:='10';
+  FJpgCompression:=50;
+  FFtpRootPath := '';  //影像平台沒有給FtpRoot目錄,會直接用FFtpExtraPath切換至指定目錄
+  //FMode := 'DSCAN' ;
   //FIs_In_Wh := 'Y';
   if FIs_In_Wh = 'Y' then
-    AttName := 'Attach'  //�J�w����
+    AttName := 'Attach'  //入庫附件
   else
-    AttName := 'S_Attach'; //Smartlending ����
+    AttName := 'S_Attach'; //Smartlending 附件
 //ShowMessage('1111111');
   if FMode = 'SAMPLESCAN' then
   begin
@@ -12626,7 +14937,7 @@
     SampleScanBtn.Visible := True;
     Panel1.Visible := True;
     Panel6.Visible := True;
-    ScanDuplexCB.Visible := False; //�������y
+    ScanDuplexCB.Visible := False; //雙面掃描
   end
   Else if (FMode = 'NSCAN') then
   begin
@@ -12635,7 +14946,10 @@
     Panel6.Visible := True;
     Panel21.Visible := True;
     Panel23.Visible := True;
-    ScanDuplexCB.Visible := True; //�������y
+
+    AttFileGB.Visible := True;
+    Splitter2.Visible := True;
+    ScanDuplexCB.Visible := True; //雙面掃描
   end
   Else if FMode = 'FSCAN' then
   begin
@@ -12649,127 +14963,181 @@
     Panel6.Visible := True;
     Panel21.Visible := True;
     Panel23.Visible := True;
+    AttFileGB.Visible := True;
+    Splitter2.Visible := True;
   end;
   DisplayMode(1,1,1,Panel9);
   Application.ProcessMessages;
   StatusBar1.Panels[0].Text := 'Ver'+GetCurrentVersionNo;
-  StatusBar1.Panels[1].Text := _Msg('�n�J�H��:')+FUserName;
+  StatusBar1.Panels[1].Text := 'Login User:'+FUserName;
+  {$IFDEF Test}
+    StatusBar1.Panels[0].Text := StatusBar1.Panels[0].Text+'(test)';
+  {$ENDIF}
+    StatusBar1.Panels[0].Text := StatusBar1.Panels[0].Text;
+
   if FPrintyn = 'Y' then
     PrtLB.Visible := True;
 
+  initParameter;  //20170222 針對新加的parameter 作初始化參數
   InitScrollRec;
   If FUrl = '' then
   begin
-    Showmessage(_Msg('URL���ର�ť�,�Ь��ߵ{���H��'));
+    Showmessage(_Msg('URL cannot be empty,please contact system administrator'));
     Exit;
   end;
   if FUrl[length(FUrl)]<>'/' then
     FUrl := FUrl + '/';
-  //********�M���********
+  //20221028 把語言檔改放至 Local目錄裡,才不會有些文字來不及使用
+  LngPath := GetLocalAppDir(Handle)+'MPS\CB_IMGPS\';
+  Str2Dir(LngPath);
+  ////下載語言檔/////  20170218 先拿調以便測試
+  If not DownLanguage Then
+  begin
+    Showmessage('Language File error!!'+HttpErrStr);
+    DataLoading(False,False);
+    Exit;
+  end;
 
-  Doc_Inf_List := TStringList.Create;  //Doc_Inf �M��   Docno + ������key
-  DM_FORM_INF_List := TStringList.Create;  //DM_FORM_INF �M��   Docno + ������key
-  FORM_INF_List := TStringList.Create; //FORM_INF���M��
-  CHECK_RULE_INF_List := TStringList.Create;  //CHECK_RULE_INF  �M��
-  MEMO_INF_List := TStringList.Create;  //MEMO_INF �M��
-  WORK_INF_List := TStringList.Create;  //WORK_INF �M��
-  LASTEST_FORM_INF_List := TStringList.Create;  // LASTEST_FORM_INF �M��
-  FindResult := TStringlist.Create;  //��SQLData�����G
+  InitialLanguage(Self);  //載入多國語言
 
-  OMRFileList := TStringList.Create; //�nOMR�ˮ֪����(�u�ˬd�C��Form���Ĥ@��)
-  FormCode_PageSize := TStringList.Create; //��󪺹w�]�j�p  FormCode_Height_Width
-  DocNo_NeedDoc := TStringList.Create; //��Docno�ɭn�̪ۨ����   DocNo_�̤ۨ��_�̤ۨ��
-  DocNo_NoDoc := TStringList.Create; //��Docno�ɤ��������   DocNo_�������_�������
-  DocNo_VerinCase := TStringList.Create; //�ץ�̪�DocNo+�������M��
-  CaseDocNoList := TStringlist.Create;  //�ץ�̪�DocNo�M��
-  CaseDocNo_CopiesList := TStringlist.Create; //�ץ�̪�DocNo���ƲM��
-  CaseList := TStringList.Create;    //�O�����ˮץ󪺶���
-  Context_DocnoList := TStringlist.Create; //�ץ�̪��ɮ�Docno�M��
-  ContextList := TStringlist.Create; //�ץ�̪��ɮײM��
-  NoSaveBarCodeList := TStringlist.Create; //���x�s�����X�M��
-  FormID_List := TStringlist.Create;  //FormID�M��
-  DocNo_List := TStringlist.Create; //DocNo�M��
-  NowShowFileList := TStringlist.Create;  //�ثe��ܪ��v���M��
-  NowSelectFileList := TStringlist.Create; //�ثe�Q�I�諸�v���M��
-  Cust_DocNoList := TStringlist.Create; //�ۦ�w�q�����W��
-  IN_WH_DocNoList := TStringlist.Create; //�J�w�����M��
-  GuideFormIDList := TStringlist.Create; //�n��ɤޭ����M��
-  //********�M���********
 
-  ShowText := _Msg('��Ƹ��J��,�еy��');
+  if FWork_no='' then
+  begin
+    Showmessage(_Msg('業務別不能為空白,請洽詢程式人員'));
+    Exit;
+  end;
+
+  if CaseIDLength = 0 then
+  begin
+    Showmessage(_Msg('案件編號長度限制不能為空白,請洽詢程式人員'));
+    //Exit;  //測試時不退出
+  end;
+
+  //********清單區********
+
+  Doc_Inf_List := TStringList.Create;  //Doc_Inf 清單   Docno + 版本為key
+  DM_FORM_INF_List := TStringList.Create;  //DM_FORM_INF 清單   Docno + 版本為key
+  FORM_INF_List := TStringList.Create; //FORM_INF的清單
+  CHECK_RULE_INF_List := TStringList.Create;  //CHECK_RULE_INF  清單
+  MEMO_INF_List := TStringList.Create;  //MEMO_INF 清單
+  WORK_INF_List := TStringList.Create;  //WORK_INF 清單
+  LASTEST_FORM_INF_List := TStringList.Create;  // LASTEST_FORM_INF 清單
+  FindResult := TStringlist.Create;  //找SQLData的結果
+
+  OMRFileList := TStringList.Create; //要OMR檢核的文件(只檢查每種Form的第一頁)
+  FormCode_PageSize := TStringList.Create; //文件的預設大小  FormCode_Height_Width
+  DocNo_NeedDoc := TStringList.Create; //有Docno時要相依的文件   DocNo_相依文件_相依文件
+  DocNo_NoDoc := TStringList.Create; //有Docno時互斥的文件   DocNo_互斥文件_互斥文件
+  DocNo_VerinCase := TStringList.Create; //案件裡的DocNo+版本的清單
+  CaseDocNoList := TStringlist.Create;  //案件裡的DocNo清單
+  CaseDocNo_CopiesList := TStringlist.Create; //案件裡的DocNo份數清單
+  CaseList := TStringList.Create;    //記錄掃瞄案件的順序
+  Context_DocnoList := TStringlist.Create; //案件裡的檔案Docno清單
+  ContextList := TStringlist.Create; //案件裡的檔案清單
+  AttContextList := TStringlist.Create; //案件裡的附加檔案清單
+  NoSaveBarCodeList := TStringlist.Create; //不儲存的條碼清單
+  FormID_List := TStringlist.Create;  //FormID清單
+  DocNo_List := TStringlist.Create; //DocNo清單
+  NowShowFileList := TStringlist.Create;  //目前顯示的影像清單
+  NowSelectFileList := TStringlist.Create; //目前被點選的影像清單
+  Cust_DocNoList := TStringlist.Create; //自行定義的文件名稱
+  IN_WH_DocNoList := TStringlist.Create; //入庫的文件清單
+  GuideFormIDList := TStringlist.Create; //要當導引頁表單清單
+  DivPageFormIDList := TStringList.Create; //要當分案頁表單清單
+  LastInitFormidList :=TStringList.Create;
+  LastAddFormidList := TStringList.Create;
+  SampleFormIDList := TStringList.Create;//20170627 加入
+  ExistImgList := TStringList.Create;  //20170724 新增
+  reSizeExistImgList :=TStringList.Create; //20171012 新增
+  //********清單區********
+
+  ShowText := _Msg('資料載入中,請稍候');
   DataLoading(True,True);
 
   IF not GetServerDate Then
   begin
-    Showmessage(_Msg('���D���ɶ���,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取主機時間時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetServerDate  '+ServerDate+' , '+ServerTime);
-  ////�U���t�θ�T////
-  IF not GetSetInf1 Then  //��DOC_INF  ����T
+
+  if FMode='SAMPLESCAN' then
   begin
-    Showmessage(_Msg('������T��,�����o�Ϳ��~!!')+HttpErrStr);
+    IF not GetSampleInf Then  //取已存在sample
+    begin
+      Showmessage(_Msg('取存在範本資訊時,網路發生錯誤!!')+HttpErrStr);
+      DataLoading(False,False);
+      Exit;
+    end;
+  end;
+
+
+
+//ShowMessage('GetServerDate  '+ServerDate+' , '+ServerTime);
+  ////下載系統資訊////
+  IF not GetSetInf1 Then  //取DOC_INF  文件資訊
+  begin
+    Showmessage(_Msg('取文件資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetSetInf1');
+//ShowMessage('GetSetInf1');
   //showmessage(self.Doc_Inf_List.Text);
-  IF not GetSetInf2 Then  //��DM_FORM_INF     �̤ۨ�����T
+  IF not GetSetInf2 Then  //取DM_FORM_INF     相依互斥資訊
   begin
-    Showmessage(_Msg('���̤ۨ�����T��,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取相依互斥資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetSetInf2');
+//ShowMessage('GetSetInf2');
   //Showmessage(self.Doc_Inf_List.Text);
-  IF not GetSetInf3 Then   //��FORM_INF  ����T
+  IF not GetSetInf3 Then   //取FORM_INF  表單資訊
   begin
-    Showmessage(_Msg('������T��,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取表單資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetSetInf3');
-  IF not GetSetInf4 Then   //��CHECK_RULE_INF   �ˮֳW�h��T
+//ShowMessage('GetSetInf3');
+  IF not GetSetInf4 Then   //取CHECK_RULE_INF   檢核規則資訊
   begin
-    Showmessage(_Msg('���ˮֳW�h��T��,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取檢核規則資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
   //showmessage(self.CHECK_RULE_INF_List.Text);
-ShowMessage('GetSetInf4');
-  IF not GetSetInf5 Then   //��MEMO_INF   �`���y��T
+//ShowMessage('GetSetInf4');
+  IF not GetSetInf5 Then   //取MEMO_INF   常用片語資訊
   begin
-    Showmessage(_Msg('���`�Τ��y��T��,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取常用片語資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetSetInf5');
+//ShowMessage('GetSetInf5');
   //showmessage(self.MEMO_INF_List.Text);
-  IF not GetSetInf6 Then   //��WORK_INF   �t�ΰѼƸ�T
+  IF not GetSetInf6 Then   //取WORK_INF   系統參數資訊
   begin
-    Showmessage(_Msg('���t�ΰѼƸ�T��,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取系統參數資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetSetInf6');
+//ShowMessage('GetSetInf6');
   //showmessage(FORM_INF_List.Text);
-  IF not GetSetInf7 Then   //��LASTES_FORM_INF   �t�ΰѼƸ�T
+  IF not GetSetInf7 Then   //取LASTES_FORM_INF   系統參數資訊
   begin
-    Showmessage(_Msg('���̷s��FORMID�ѼƸ�T��,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('取最新版FORMID參數資訊時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-ShowMessage('GetSetInf7');
+//ShowMessage('GetSetInf7');
   //Showmessage(LASTEST_FORM_INF_List.Text);
-  SetFormID_DocNo;  //�NFormID��Docno��X��JList��  20130403�W�[
-  SetIn_WH_DocNo; //�N�n�J�w��DocNo��X�ӥt�s�Jlist��
-  GetDefScanIni; //���o���y�w�]�Ȥά����]�w
+  SetFormID_DocNo;  //將FormID及Docno抽出塞入List裡  20130403增加
+  SetIn_WH_DocNo; //將要入庫的DocNo抽出來另存入list裡
+  GetDefScanIni; //取得掃描預設值及相關設定
 
-  ////�U���t�θ�T/////
+  ////下載系統資訊/////
   if ImagePath = '' then
   begin
-    Showmessage(_Msg('�����Ȧs���|���o���ť�'));
+    Showmessage(_Msg('本機暫存路徑不得為空白'));
     DataLoading(False,False);
     Panel1.Enabled := False;
     Panel2.Enabled := False;
@@ -12778,43 +15146,58 @@
   initkscan;
   if ImagePath[Length(ImagePath)] <> '\' then
     ImagePath := ImagePath + '\';
-  CheckXmlPath := ImagePath+'OMRSITE\'+FWork_No;
-  SitePath := ImagePath+'Site\'+FWork_No+'\';
-  LngPath := ImagePath;
+//ShowMessage('ImagePath='+ImagePath);
+  //CheckXmlPath := ImagePath+'OMRSITE\'+FWork_No;
+  CheckXmlPath := ImagePath+'OMRSITE\';  // 20200612 發現影像平台是取回所有業務的設定,所以不能有業務別目錄
+//ShowMessage('CheckXmlPath='+CheckXmlPath);
+  //SitePath := ImagePath+'Site\'+FWork_No+'\';
+  SitePath := ImagePath+'Site\';  // 20200612 發現影像平台是取回所有業務的設定,所以不能有業務別目錄
+  //LngPath := ImagePath; //改放至上面取Local目錄
   SamplePath := ImagePath+'Sample\'+FWork_No+'\';
   ImagePath := ImagePath + 'Scantemp\';
+//ShowMessage('AA  ImagePath='+ImagePath);
   ScaniniPath :=ImagePath+FWork_No+'\'+FUserUnit +'\';
+//ShowMessage('ScaniniPath='+ScaniniPath);
   ImagePath := ImagePath + FWork_No+'\'+FUserUnit+'\'+FMode+'\';
+  ImagePath := StringReplace(ImagePath, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
+//ShowMessage('BB  ImagePath='+ImagePath);
   ImageSavePath := ImagePath;
   str2dir(CheckXmlPath);
   str2dir(SitePath);
   str2dir(ImagePath);
   str2dir(SamplePath);
-  Del_Sub_NothingPath(ImagePath);  //�M���ץ�ؿ��O�Ū�
-  ShowText := _Msg('��Ƹ��J��,�еy��');
-  DataLoading(True,True);
-  if not CheckAvailable Then   //�ˬd���v
-  begin
-    DataLoading(False,False);
-    Panel1.Enabled := False;
-    Panel2.Enabled := False;
-    Exit;
-  end;
-ShowMessage('CheckAvailable');
-  ShowText := _Msg('��Ƹ��J��,�еy��');
+  Del_Sub_NothingPath(ImagePath);  //清掉案件目錄是空的
+
+
+  LogFile1.LogFile:=LngPath+'IMGPSCheck.log';
+
+  ReduceLogFile;
+
+  LogFile1.LogToFile(logTimeString+'OCX取表data結束');
+
+  ShowText := _Msg('資料載入中,請稍候');
   DataLoading(True,True);
 
-   ////�U���y����/////
-  If not DownLanguage Then
-  begin
-    Showmessage('Language File error!!'+HttpErrStr);
-    DataLoading(False,False);
-    Exit;
-  end;
+//  if not CheckAvailable Then   //檢查授權  20170218 說不用了
+//  begin
+//    DataLoading(False,False);
+//    Panel1.Enabled := False;
+//    Panel2.Enabled := False;
+//    Exit;
+//  end;
 
-  InitialLanguage(Self);  //���J�h��y��
-  ////�U���y����/////
-  if (FMode = 'RSCAN') or (FMode = 'ESCAN') or (FMode = 'FSCAN') then //������β��ʥ�n�u�౽���w�s������
+//Button3Click(Self);
+//ShowMessage('CheckAvailable');
+  ShowText := _Msg('資料載入中,請稍候');
+  DataLoading(True,True);
+
+
+  StatusBar1.Panels[1].Text := _Msg('登入人員:')+FUserName;
+  //FCaseID:='20150302180133';//測試用
+  ////下載語言檔/////
+//ShowMessage('OOOO');
+
+  if (FMode = 'RSCAN')  or (FMode = 'DSCAN') or (FMode = 'ESCAN') or (FMode = 'FSCAN') then //重掃件及異動件要只能掃指定編號的件
   begin
     _Deltree(ImagePath);
     str2dir(ImagePath);
@@ -12823,66 +15206,79 @@
     MkDir(ImageSavePath+FCaseID);
     CreateEmptyCase(ImageSavePath,FCaseID);
     MkDir(ImageSavePath+FCaseID+'\Download');
-    IF (FMode = 'ESCAN') then  //���ʥ���U���v��
+    IF (FMode = 'ESCAN') or (FMode = 'DSCAN') then  //異動件先下載影像
     begin
-      ShowText := _Msg('�ץ�U����,�еy��');
+      ShowText := _Msg('案件下載中,請稍候');
       DataLoading(True,True);
-      If not Down_Img(ImageSavePath+FCaseID+'\Download\',FCaseID) then
+      If not DownLoadImage(ImageSavePath+FCaseID+'\Download\',FCaseID) Then
       begin
-        Showmessage(FCaseID+_msg('���J���ʼv����,�����o�Ϳ��~')+HttpErrStr);
+        Showmessage(FCaseID+_msg('載入異動影像時,網路發生錯誤')+DownFileErrStr);
         DataLoading(False,False);
         Exit;
       end;
 
+      {If not Down_Img(ImageSavePath+FCaseID+'\Download\',FCaseID) then
+      begin
+        Showmessage(FCaseID+_msg('載入異動影像時,網路發生錯誤')+HttpErrStr);
+        DataLoading(False,False);
+        Exit;
+      end;}
+//Showmessage(ImageSavePath+FCaseID+'\Download\'+#10#13+ImageSavePath+FCaseID+'\');
       Download2Case(ImageSavePath+FCaseID+'\Download\',ImageSavePath+FCaseID+'\');
-      //Showmessage('aaa');
-      //Download2Case('C:\Users\Hong\Downloads\�S���A��\',ImageSavePath+FCaseID+'\');
+//Showmessage('aaa');
+      //Download2Case('C:\Users\Hong\Downloads\沒有括號\',ImageSavePath+FCaseID+'\');
       if (FIs_OldCase = 'Y') then
       begin
         if (FWork_no='HLN') then
-          ErrFormtoCurrentForm(FCaseID,'10000001011112A','11000001011112A');  //��������FormID
-        //if not FileExists(ImageSavePath+FCaseID+'\CaseDocNo_Copies.dat') then   //�o�ӷ|�bDownload2Case�ɤ@�߲��ͩҥH���঳�o�� 20141013
+          ErrFormtoCurrentForm(FCaseID,'10000001011112A','11000001011112A');  //換掉錯的FormID
+        //if not FileExists(ImageSavePath+FCaseID+'\CaseDocNo_Copies.dat') then   //這個會在Download2Case時一律產生所以不能有這行 20141013
         OldCasetoNewCase(FCaseID);
-        //ErrFormtoCurrentForm(FCaseID,'11B00005011312A','11000001011112A');  //��������FormID
+        //ErrFormtoCurrentForm(FCaseID,'11B00005011312A','11000001011112A');  //換掉錯的FormID
         //LoadImgFile;
       end;
-      {if (FIs_OldCase = 'Y') and (FWork_no='HLN') then   //77����
-      begin
-        ErrFormtoCurrentForm(FCaseID,'10000001011112A','11000001011112A');  //��������FormID
-        if not FileExists(ImageSavePath+FCaseID+'\CaseDocNo_Copies.dat') then
-          OldCasetoNewCase(FCaseID);
-        //ErrFormtoCurrentForm(FCaseID,'11B00005011312A','11000001011112A');  //��������FormID
-        //LoadImgFile;
-      end;}
-      Create_Cust_DocDir(FCaseID); //���ͥ~���ǤJ�����
+//      if (FIs_OldCase = 'Y') and (FWork_no='HLN') then   //77版的
+//      begin
+//        ErrFormtoCurrentForm(FCaseID,'10000001011112A','11000001011112A');  //換掉錯的FormID
+//        if not FileExists(ImageSavePath+FCaseID+'\CaseDocNo_Copies.dat') then
+//          OldCasetoNewCase(FCaseID);
+//        //ErrFormtoCurrentForm(FCaseID,'11B00005011312A','11000001011112A');  //換掉錯的FormID
+//        //LoadImgFile;
+//      end;
+      Create_Cust_DocDir(FCaseID); //產生外面傳入的文件
+      if FMode='ESCAN' then
+        LastInitFormidListCreate(ImageSavePath+FCaseID+'\Download\');
     end;
   end;
-ShowMessage('GetOMRCheckSet�e');
-  ////�U���ˮ�XML//////
+
+//ShowMessage('GetOMRCheckSet前');
+  ////下載檢核XML//////
   IF not GetOMRCheckSet Then
   begin
-    Showmessage(_Msg('�U���ˮ֩w���ɮ׮�,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('下載檢核定位檔案時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-  ////�U���ˮ�XML/////
-ShowMessage('GetOMRCheckSet���');
-  ////�U���n���]�w/////
+  ////下載檢核XML/////
+//ShowMessage('GetOMRCheckSet後來');
+  ////下載登打設定/////
   IF not GetKeyinSet Then
   begin
-    Showmessage(_Msg('�U���n���w���ɮ׮�,�����o�Ϳ��~!!')+HttpErrStr);
+    Showmessage(_Msg('下載登打定位檔案時,網路發生錯誤!!')+HttpErrStr);
     DataLoading(False,False);
     Exit;
   end;
-  ////�U���n���]�w/////
-ShowMessage('GetKeyinSet');
-  if ScanDenialHint <> '' then   //���]�w���ܦr��N�q�b�k�W��
+  ////下載登打設定/////
+//ShowMessage('GetKeyinSet');
+  if ScanDenialHint <> '' then   //有設定提示字串就秀在右上角
   begin
     DenialTimeLb.Visible := True;
     DenialTimeLb.Caption := Format(ScanDenialHint,[ScanDenialTime]);
   end;
-
-  R_W_Scanini('R'); //���˳]�w��ini
+//ShowMessage(IntToStr(ScanDpi));
+  R_W_Scanini('R'); //掃瞄設定的ini
+//ShowMessage(IntToStr(ScanDpi));
+//ShowMessage('停掉DataLoading');
+//DataLoading(False,False);
   ScanDuplexCB.Checked := ScanDuplex;
   if FMode <> 'SAMPLESCAN' then
     LoadImgFile;
@@ -12896,13 +15292,47 @@
   end;
   InitialOk := True;
 
-  {AttFileGB.Visible := True; //���[�q�l�ɵ�  //20120207���ɻ����b�o�[�q�l�ɥ�����
+  {AttFileGB.Visible := True; //附加電子檔窗  //20120207楊玉說不在這加電子檔先拿掉
   Splitter2.Visible := True;
-  AttFileGB.Visible := False; //���[�q�l�ɵ�
+  AttFileGB.Visible := False; //附加電子檔窗
   Splitter2.Visible := False; }
-
+//ShowMessage('ImageSavePath='+ImageSavePath);
   DataLoading(False,False);
-ShowMessage('��l�ܰ��槹��');
+
+  LogFile1.LogToFile(logTimeString+'OCX初始化結束');
+  LogFile1.LogToFile(logTimeString+'FUrl='+FUrl+
+	',FCaseID='+FCaseID+
+	',FMode='+FMode+
+	',FModeName='+FModeName+
+	',FWork_no='+FWork_no+
+	',FUserID='+FUserID+
+	',FUserName='+FUserName+
+	',FUserUnit='+FUserUnit+
+	',FData='+FData+
+	',FVerify='+FVerify+
+	',FReWrite='+FReWrite+
+	',FLanguage='+FLanguage+
+	',FLoanDoc_Value='+FLoanDoc_Value+
+	',FLoanDoc_Enable='+FLoanDoc_Enable+
+	',FUseProxy='+FUseProxy+
+	',FC_DocNoList='+FC_DocNoList+
+	',FC_DocNameList='+FC_DocNameList+
+	',FFixFileList='+FFixFileList+
+	',FIs_In_Wh='+FIs_In_Wh+
+	',FOldCaseInfo='+FOldCaseInfo+
+	',FPrintyn='+FPrintyn+
+	',FIs_OldCase='+FIs_OldCase+
+	',FCustDocYN='+FCustDocYN);
+  LogFile1.LogToFile(logTimeString+'FImgDPI='+IntToStr(FImgDPI)+
+    ',FScanColor='+    IntToStr(FScanColor)+
+    ',FFileSizeLimit='+  IntToStr(FFileSizeLimit)+
+    ',FCaseNoLength='+ IntToStr(FCaseNoLength)+
+    ',FImgDelete='+FImgDelete+
+    ',FIsExternal='+FIsExternal+
+    ',FWH_category='+FWH_category+
+    ',FCheck_main_form='+FCheck_main_form+
+    ',FMaxUploadSize='+FMaxUploadSize);
+
 end;
 
 procedure TCB_IMGPSScanX.Timer2Timer(Sender: TObject);
@@ -12919,32 +15349,42 @@
   CaseID : String;
   i,n,v: Integer;
   ZipFileList : TStringlist;
-  CaseTrans : Integer; //-1:���� 0:�i 1:����
+  CaseTrans : Integer; //-1:失敗 0:可 1:不行
   SuccessCount,ReCasecount,CheckErrCount : Integer;
   TransMsg : String;
   AreaStr : String;
   S : TStringlist;
   CheckStr : String;
+  uploadMsg:String;//20171122 新增 配合不同mode下要秀不能上傳訊息
 begin
   IF not InitialOk Then
   begin
-    Showmessage(_msg('��T�|���U������,�еy�ԩέ��s�i�J'));
+    Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入'));
     Exit;
   end;
+LogFile1.LogToFile(logTimeString+'按下上傳');
   ClearView(1);
   CaseHelpBtn.Visible := False;
   DisplayPath := '';
   ClearCaseIndex;
   RejectCase := False;
-
-  if not CheckCaseID_OK then  //�ˬd�O�_�����t�����ץ�
+  uploadMsg:='';
+  if not CheckCaseID_OK then  //檢查是否有未配號的案件
   begin
-    Showmessage(_Msg('�|�����t���ץ�,�L�k�W��'));
+    Showmessage(_Msg('尚有「無案件編號」之案件,無法上傳'));
     Exit;
   end;
+
+  if not CheckCaseAttach_OK then  //20170911檢查是否有未歸類的案件
+  begin
+    Showmessage(_Msg('尚有未歸類文件,無法上傳'));
+    Exit;
+  end;
+
+
   if NewTreeNode.Count = 0  then
   begin
-    Showmessage(_Msg('�L�v���ݶǰe'));
+    Showmessage(_Msg('無影像需傳送'));
     Exit;
   end;
 
@@ -12953,31 +15393,29 @@
   CheckErrCount := 0;
   if (FMode = 'NSCAN') and (not CheckScanDenialTime) then
   begin
-    if Messagedlg(Format(_Msg('�v�W�L����ɶ�(%s),�w�w�@�~�鬰�U����~��,�O�_�~��W��??'),[ScanDenialTime]),mtConfirmation,[mbyes,mbcancel],0)=mrcancel then Exit;
+    if Messagedlg(Format(_Msg('己超過收件時間(%s),預定作業日為下個營業日,是否繼續上傳??'),[ScanDenialTime]),mtConfirmation,[mbyes,mbcancel],0)=mrcancel then Exit;
   end;
 
-  ShowText := _Msg('��ƤW�Ǥ�,�еy��');
+  ShowText := _Msg('資料上傳中,請稍候');
   DataLoading(True,True);
 
   For i := 0 to NewTreeNode.Count -1 do
   begin
     v := posend('-',NewTreenode.Item[i].Text);
     CaseID := Copy(NewTreenode.Item[i].Text,1,v-1);
-    ShowText := CaseID+_Msg('��ƤW�Ǥ�,�еy��');
+    ShowText := CaseID+_Msg('資料上傳中,請稍候');
     DataLoading(True,True);
-    CreateIn_WH(CaseID);    //���ͤJ�w����r�� In_Wh.dat
-    Case2upload(CaseID);   //���ͭ�v�����c
-
+    CreateIn_WH(CaseID);    //產生入庫文件文字檔 In_Wh.dat
+    Case2upload(CaseID);   //產生原影像結構
     TransPath := ImageSavePath+CaseID+'\Upload\';
-
-    {if FMode = 'ESCAN' then    //20140320 yuu���������ˬd
+    {if FMode = 'ESCAN' then    //20140320 yuu說拿掉此檢查
     begin
       S := TStringlist.Create;
       try
         S.LoadFromFile(TransPath + 'Context.dat');
         if S.Count = 0 then
         begin
-          Showmessage(_Msg('�L�v���ɵL�k�ǰe'));
+          Showmessage(_Msg('無影像檔無法傳送'));
           DataLoading(False,False);
           LoadImgFile;
           Exit;
@@ -12986,47 +15424,48 @@
       s.Free;
       end;
     end;}
-
-    if (FMode = 'NSCAN') then
+    if (FMode = 'NSCAN') or (FMode = 'DSCAN')  then //20170406 待掃瞄也要問一下
     begin
-      /////�T�ݬO�_�i�W��/////
+      /////訊問是否可上傳/////
       CaseTrans := CaseAsk(CaseID);
-      /////�T�ݬO�_�i�W��////
+      //Showmessage('記得改回來');
+      //CaseTrans := 0;
+
+      /////訊問是否可上傳////
     end
-    Else  ///���O�s��B������B���ʥ󪺤��d
+    Else  ///不是新件、重掃件、異動件的不查
     begin
       CaseTrans := 0;
     end;
-    if CaseTrans = -1 then  //����
+    if CaseTrans = -1 then  //失敗
     begin
-      Showmessage(_Msg('�߰ݮץ�i�_�ǰe��,�����o�Ϳ��~!!')+HttpErrStr);
+      Showmessage(_Msg('')+HttpErrStr+'.');
       DataLoading(False,False);
       LoadImgFile;
       Exit;
     end;
     if CaseTrans = 1 then
     begin
-      ////���ƳB�z/////
+      ////重複處理/////
       Inc(ReCasecount);
-      ////���ƳB�z/////
+      ////重複處理/////
       Continue;
     end
-    Else if CaseTrans = 0 then   //�i�H�ǰe
+    Else if CaseTrans = 0 then   //可以傳送
     begin
-      ///////�ˮ�//////  20100927 User�אּ�h�ܥ~����  ///20101019 User�S��^�W�ǭn��
-      //if FMode = 'NSCAN' then  //20101019�令Ū�]�w���ǼҦ��n�������ˮ�
+      ///////檢核//////  20100927 User改為搬至外面做  ///20101019 User又改回上傳要做
+      //if FMode = 'NSCAN' then  //20101019改成讀設定那些模式要做那些檢核
       //begin
-
-       ///�̤Q�r�w���I�Y��////
-       CaseReSize(CaseID);   //�ҥH�v���A���@���Y��
-       ////�̤Q�r�w���I�Y��///////   }
+       ///依十字定位點縮放////
+       CaseReSize(CaseID);   //所以影像再做一次縮放
+       ////依十字定位點縮放///////   }
         if (FMode <> 'FSCAN') then
         begin
-          if (NewTreenode.Item[i].ImageIndex <> 7) and (NewTreenode.Item[i].ImageIndex <> 5) then  //�ˮ֧��������A�ˮ�
+          if (NewTreenode.Item[i].ImageIndex <> 7) and (NewTreenode.Item[i].ImageIndex <> 5) then  //檢核完成的不再檢核
           begin
-            ShowText := CaseID+_Msg('�ˮ֤�,�еy��');
+            ShowText := CaseID+_Msg('檢核中,請稍候');
             DataLoading(True,True);
-            If not OMRCheckCase(CaseID) then
+            If not OMRCheckCase(CaseID) then  //進檢核
             begin
               Inc(CheckErrCount);
               Continue;
@@ -13039,10 +15478,11 @@
           end;
         end;
       //end;
-      ///////�ˮ�//////
-      ShowText := CaseID+_Msg('��ƤW�Ǥ�,�еy��');
+      ///////檢核//////
+      ShowText := CaseID+_Msg('資料上傳中,請稍候');
       DataLoading(True,True);
-      If Not TransCaseID(TransPath,CaseID,True) Then  //�ǰe�ץ�
+//ShowMessage('退出');DataLoading(False,False);Exit;
+      If Not TransCaseID(TransPath,CaseID,True) Then  //傳送案件
       begin
         DataLoading(False,False);
         LoadImgFile;
@@ -13052,16 +15492,42 @@
     end;
   end;
   DataLoading(False,False);
-  TransMsg := Format(_Msg('���\��%d��'),[SuccessCount]);
+  TransMsg := Format(_Msg('成功件【%d】件'),[SuccessCount]);
   if ReCasecount > 0 then
-    TransMsg := TransMsg + #13#10 + Format(_Msg('�L�k�W�ǥ�%d��'),[ReCasecount]);
+    TransMsg := TransMsg + #13#10 + Format(_Msg('無法上傳件【%d】件'),[ReCasecount]);
   if CheckErrCount > 0 then
-    TransMsg := TransMsg + #13#10 + Format(_Msg('�ˮ֥��ѥ�%d��'),[CheckErrCount]);
+  begin
+    TransMsg := TransMsg + #13#10 + Format(_Msg('檢核失敗件【%d】件,請先點選「案件編號」,再點選「問號」查看錯誤原因'),[CheckErrCount]);
+LogFile1.LogToFile(logTimeString+'檢核失敗原因:'+OMRErrini2ListForLog(''));
+  end;
 
-  Showmessage(_Msg('�ǰe����')+#13#10+TransMsg);
+  if (FMode = 'DSCAN') and (SuccessCount = 1)  then
+  begin
+    uploadMsg:=NowCaseNo+_Msg('影像上傳完成。此案已進入下一流程');
+  end;
+  if (FMode='ESCAN') and (FModeName=_Msg('補件掃描')) and (SuccessCount = 1) then
+  begin
+    uploadMsg:=NowCaseNo+_Msg('影像已補件完成');
+  end;
+//ShowMessage('uploadMsg='+uploadMsg);
+  if uploadMsg<>'' then
+  begin
+    ShowMessage(uploadMsg);
+  end
+  else
+  begin
+    Showmessage(_Msg('傳送完成')+#13#10+TransMsg);
+  end;
 
   LoadImgFile;
   if (FMode = 'ESCAN') and (SuccessCount = 1) then
+  begin
+    if FEvents <> nil Then
+    begin
+      FEvents.OnClosePage;
+    end;
+  end;
+  if (FMode = 'DSCAN') and (SuccessCount = 1) then
   begin
     if FEvents <> nil Then
     begin
@@ -13086,26 +15552,28 @@
   NowDocNo := '';
   NowFormCode := '';
   NowFormName := '';
-
   NowPage := 0;
   NowShowFileList.Clear;
   StatusBar1.Panels[2].Text := '';
   ClearCaseIndex;
-  PageLv.Items.Clear;  //���ƲM��
+  PageLv.Items.Clear;  //頁數清單
   //Panel18.Enabled:= False;
+  AttListBox.Items.Clear;
+  AddAttFileLB.Enabled := False;
+  DelAttFileLB.Enabled := False;
   UseOldCaseLb.Visible := False;
-  PM107.Visible := False; //�Ƶ��\��
-  CaseHelpBtn.Visible := False; //�ˮ֥��ѭ�]�s
+  PM107.Visible := False; //備註功能
+  CaseHelpBtn.Visible := False; //檢核失敗原因鈕
   Panel5.Visible := True;
   ContextList.Clear;
   SortMode := false;
   ISB1.ZoomMode := zmFullPage;
   IF TreeView1.Selected.Parent <> nil Then
   begin
-    if TreeView1.Selected.Parent = NewTreenode then  //�I�b�ץ�W
+    if TreeView1.Selected.Parent = NewTreenode then  //點在案件上
     begin
       //Panel18.Enabled := True;
-      PM107.Visible := True; //�Ƶ��\��
+      PM107.Visible := True; //備註功能
       MyTreeNode1 := TreeView1.Selected;
       MyTreeNode2 := nil;
       MyTreeNode3 := nil;
@@ -13146,7 +15614,7 @@
         ScrollBar1.Max := page;
       MyTreeNode1.Expand(True);
     end
-    Else If TreeView1.Selected.Parent.Parent  = NewTreenode Then    //�I�b���W
+    Else If TreeView1.Selected.Parent.Parent  = NewTreenode Then    //點在文件上
     begin
 
       MyTreeNode1 := TreeView1.Selected.Parent;
@@ -13168,9 +15636,9 @@
       DisplayPath := ImageSavePath+NowCaseNo+'\';
 
       if GetUseCase('F',DisplayPath,NowDocDir) <> '' then
-        StatusBar1.Panels[2].Text := Format('�q%s�ޥ�',[GetUseCase('F',DisplayPath,NowDocDir)]);
+        StatusBar1.Panels[2].Text := Format(_Msg('從%s引用'),[GetUseCase('F',DisplayPath,NowDocDir)]);
       if GetUseCase('T',DisplayPath,NowDocDir) <> '' then
-        StatusBar1.Panels[2].Text := Format('�Q%s�ޥ�',[GetUseCase('T',DisplayPath,NowDocDir)]);
+        StatusBar1.Panels[2].Text := Format(_Msg('被%s引用'),[GetUseCase('T',DisplayPath,NowDocDir)]);
       if FLoanDoc_Enable = 'Y' then
       begin
         AddCredit1RG.Enabled := True;
@@ -13200,12 +15668,12 @@
         Cust_DocNoList.LoadFromFile(DisplayPath+'CustomDocNo.dat');
        MyTreeNode1.Expand(True);
     end
-    Else If (NewTreenode <> nil) and (TreeView1.Selected.Parent.Parent.Parent  = NewTreenode) Then //�I�b���W
+    Else If (NewTreenode <> nil) and (TreeView1.Selected.Parent.Parent.Parent  = NewTreenode) Then //點在表單上
     begin
-      //NoteBtn.Visible := True; //�Ƶ��\��
+      //NoteBtn.Visible := True; //備註功能
       //Panel18.Enabled := True;
       ClearView(1);
-      PM107.Visible := True; //�Ƶ��\��
+      PM107.Visible := True; //備註功能
       MyTreeNode1 := TreeView1.Selected.Parent.Parent;
       MyTreeNode2 := TreeView1.Selected.Parent;
       MyTreeNode3 := TreeView1.Selected;
@@ -13235,7 +15703,7 @@
         NowFormName := Copy(MyTreeNode3.Text,v+1,v1-v-1);
         page := strtoint(Copy(MyTreeNode3.Text,v2+1,ln-v2-1));
       end
-      Else  //�I�b���󪺭���
+      Else  //點在附件的頁數
       begin
         NowFormCode := '';
         page := 1;
@@ -13244,9 +15712,9 @@
       DisplayPath := ImageSavePath+NowCaseNo+'\';
 
       if GetUseCase('F',DisplayPath,NowDocDir) <> '' then
-        StatusBar1.Panels[2].Text := Format('�q%s�ޥ�',[GetUseCase('F',DisplayPath,NowDocDir)]);
+        StatusBar1.Panels[2].Text := Format(_Msg('從%s引用'),[GetUseCase('F',DisplayPath,NowDocDir)]);
       if GetUseCase('T',DisplayPath,NowDocDir) <> '' then
-        StatusBar1.Panels[2].Text := Format('�Q%s�ޥ�',[GetUseCase('T',DisplayPath,NowDocDir)]);
+        StatusBar1.Panels[2].Text := Format(_Msg('被%s引用'),[GetUseCase('T',DisplayPath,NowDocDir)]);
 
       if FLoanDoc_Enable = 'Y' then
       begin
@@ -13273,9 +15741,14 @@
       if FileExists(DisplayPath+'CustomDocNo.dat') then
         Cust_DocNoList.LoadFromFile(DisplayPath+'CustomDocNo.dat');
     end;
-     MyTreeNode1.Expand(True);
+    MyTreeNode1.Expand(True);
+    AddAttFileLB.Enabled := True;
+    if FileExists(DisplayPath+'ATTContext.dat') then
+    begin
+      LoadAttFile(NowCaseno);
+    end;
   end
-  Else     //�I�bNewTreenode or MyTreenode1 �W
+  Else     //點在NewTreenode or MyTreenode1 上
   begin
     ClearView(1);
     MyTreeNode1 := nil;
@@ -13326,7 +15799,7 @@
     NewDocNo := Copy(iTreeNode2.Text,v+1,v1-v-1);
     NewPath := ImagePath+NewCaseNo+'\';
     OldFileName := ExtractFileName(DisplayISB.FileName);
-    if Copy(NewDocNo,1,5) = 'ZZZZZ' then  //�ۭq���
+    if Copy(NewDocNo,1,5) = 'ZZZZZ' then  //自訂文件
     begin
       NewFileName := Add_Zoo(FileName2ScanPage(OldFileName),3)+'_'+NewDocNo+'0000000'+ExtractFileExt(OldFileName);
       NewFormCode := NewDocNo+'0000000';
@@ -13361,7 +15834,7 @@
       NewFormName := Copy(iTreeNode3.Text,1,v1-1);
     end;
     NewPath := ImagePath+NewCaseNo+'\'+NewDocDir+'\';
-    if NewPath = DisplayPath Then  //�P�ץ�
+    if NewPath = DisplayPath Then  //同案件
     begin
       if NewFormCode <> '' then
         //NewFileName := Copy(OldFileName,1,3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
@@ -13370,7 +15843,7 @@
         //NewFileName := Copy(OldFileName,1,3)+ExtractFileExt(OldFileName)
         NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir),3)+ExtractFileExt(OldFileName);
     end
-    else   //���P�ץ�
+    else   //不同案件
     begin
       if NewFormCode <> '' then
         //NewFileName := Copy(OldFileName,1,3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
@@ -13391,7 +15864,7 @@
       //NewFileName := Copy(OldFileName,1,3)+ExtractFileExt(OldFileName)
       NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir)+1,3)+ExtractFileExt(OldFileName);
 
-    if NewCaseNo = NowCaseNo then  //�P�ץ󤣧ﶶ��
+    if NewCaseNo = NowCaseNo then  //同案件不改順序
     begin
       CopyFile(PWideChar(OldFileName),PwideChar(NewPath+NewFileName),False);
       SetContextList('A',-1,NewCaseNo,NewDocDir,NewFileName);
@@ -13408,17 +15881,17 @@
       ContextList.LoadFromFile(DisplayPath+'Context.dat');
       if (ContextList.Count = 1) and ((FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'ISCAN')) then
       begin
-        if Messagedlg(Format(_Msg('���ʫ�(%s)�ץ�L�v��,�N�R�����ץ�,�O�_�T�w����?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
+        if Messagedlg(Format(_Msg('移動後(%s)案件無影像,將刪除此案件,是否確定移動?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
       end;
       CopyFile(PWideChar(DisplayISB.FileName),PWideChar(NewPath+NewFileName),False);
       ContextList.LoadFromFile(NewPath+'Context.dat');
       ContextList.Add(NewFileName);
       ContextList.SaveToFile(NewPath+'Context.dat');
       //Showmessage('1');
-      iTreeNode2.Text := Format(_Msg('%s-%d��'),[NewCaseNo,GetCasePage(ImagePath,NewCaseNo)]);
+      iTreeNode2.Text := Format(_Msg('%s-%d頁'),[NewCaseNo,GetCasePage(ImagePath,NewCaseNo)]);
       //Showmessage('2');
       //DrawDocItem(iTreeNode1,FORM_INF_List,NewCaseNo);
-      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NewCaseno);   20140820��
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NewCaseno);   20140820改
       DrawDocItem2(MytreeNode1,NewCaseno);
       //Showmessage('3');
       ClearErrini(NewCaseNo,iTreeNode1);
@@ -13459,7 +15932,7 @@
     ReSortFileName(ExtractFilePath(OldFileName));
   end;
   DrawDocItem2(MytreeNode1,NowCaseno);
-  ClearErrini(NowCaseno,MyTreeNode1);  //�M���ˮְO��
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
   if GoAtt then
   begin
     GotoAttach(AttLv);
@@ -13498,7 +15971,7 @@
     or((NewNode.Level <>2) and (NewNode.Level<>3))
     or((NewNode.Level =2) and ((ImgDocNo = Node2DocNo(NewNode))or(Node2DocNo(NewNode)='')or (copy(Node2DocNo(NewNode),1,5)<>'ZZZZZ')))
     or((NewNode.Level =3) and ((ImgFormCode=Node3FormID(NewNode)) or (ImgDocNo = Node3DocNo(NewNode)) or (Node3DocNo(NewNode)='')))
-    or(Pos(_Msg('�����U���'),Newnode.Text)>0)
+    or(Pos(_Msg('未註冊文件'),Newnode.Text)>0)
      Then
       Accept := False;}
 end;
@@ -13506,13 +15979,37 @@
 procedure TCB_IMGPSScanX.TreeView1KeyUp(Sender: TObject; var Key: Word;
   Shift: TShiftState);
 begin
-  TreeView1Click(nil);
+  IF TreeView1.Selected.Parent <> nil Then
+  begin
+    TreeView1Click(nil);
+  end
+  else
+  begin
+    ClearView(1);
+  end;
+
+end;
+
+procedure TCB_IMGPSScanX.TreeView1MouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  IF Button = TMouseButton(MbRight) Then
+  begin
+    MDown := True;
+    If TreeView1.GetNodeAt(X,Y) = nil then Exit;
+    TreeView1.Selected := TreeView1.GetNodeAt(X,Y);
+  end;
+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;
@@ -13523,9 +16020,13 @@
   IF Button = TMouseButton(MbRight) Then
   begin
     If TreeView1.GetNodeAt(X,Y) = nil then Exit;
-    TreeView1.Selected := TreeView1.GetNodeAt(X,Y);
-    TreeView1Click(self);
-    TreeView1.PopupMenu.Popup(Mouse.CursorPos.X ,Mouse.CursorPos.Y);
+    if MDown then
+    begin
+      TreeView1Click(self);
+      TreeView1.PopupMenu.Popup(Mouse.CursorPos.X ,Mouse.CursorPos.Y);
+    end;
+    Application.ProcessMessages; //需加這行,不然有些全域變數會沒變到
+    MDown:= False;
   end;
 end;
 
@@ -13577,9 +16078,13 @@
 procedure TCB_IMGPSScanX.Set_language(const Value: WideString);
 begin
   FLanguage := lowercase(Value);
+  if FLanguage='zh-tw' then
+  begin
+    FLanguage:='zh_tw'
+  end;
   if FileExists(LngPath+'Language.lng') then
   begin
-    InitialLanguage(Self);  //���J�h��y��
+    InitialLanguage(Self);  //載入多國語言
   end;
 end;
 
@@ -13619,7 +16124,7 @@
 begin
   FUseProxy := UpperCase(Value);
   if FUseProxy = 'Y' then
-    UseProxy := True;  //�n���n��Proxy
+    UseProxy := True;  //要不要用Proxy
 
 end;
 
@@ -13778,6 +16283,137 @@
   FCustDocYN := UpperCase(Value);
 end;
 
+function TCB_IMGPSScanX.Get_casenolength: WideString;
+begin
+
+end;
+
+function TCB_IMGPSScanX.Get_filesizelimit: WideString;
+begin
+
+end;
+
+function TCB_IMGPSScanX.Get_imgdpi: WideString;
+begin
+
+end;
+
+function TCB_IMGPSScanX.Get_scancolor: WideString;
+begin
+
+end;
+
+procedure TCB_IMGPSScanX.Set_casenolength(const Value: WideString);
+begin
+  if Value ='' then
+  begin
+    FCaseNoLength := 0 ;
+    CaseIDLength := FCaseNoLength;
+  end
+  else
+  begin
+    FCaseNoLength := StrToInt(Value) ;
+    CaseIDLength := FCaseNoLength;
+  end;
+
+end;
+
+procedure TCB_IMGPSScanX.Set_filesizelimit(const Value: WideString);
+begin
+//ShowMessage(Value);
+  FFileSizeLimit:=0;
+  if Value ='' then
+  begin
+    FFileSizeLimit := 5*1024;
+  end
+  else
+  begin
+    FFileSizeLimit := StrToInt(Value);
+  end;
+
+end;
+
+procedure TCB_IMGPSScanX.Set_imgdpi(const Value: WideString);
+begin
+  if Value ='' then
+  begin
+    FImgDPI := 300;
+    ScanDpi := FImgDPI;
+  end
+  else
+  begin
+    FImgDPI := StrToInt(Value);
+    ScanDpi := FImgDPI;
+    Def_ScanDpi := FImgDPI;
+  end;
+
+end;
+
+procedure TCB_IMGPSScanX.Set_scancolor(const Value: WideString);
+begin
+  if value='' then
+  begin
+    FScanColor := 0;
+    ScanColor := ifBlackWhite;
+  end
+  else
+  begin
+    FScanColor := StrToInt(Value);
+    ScanColor := ifBlackWhite;
+  end;
+
+  if FScanColor = 1 then
+  begin
+    ScanColor := ifGray256 ;
+  end;
+
+  if FScanColor = 2 then
+  begin
+    ScanColor := ifTrueColor ;
+  end;
+
+end;
+
+function TCB_IMGPSScanX.Get_imgdelete: WideString;
+begin
+
+end;
+
+procedure TCB_IMGPSScanX.Set_imgdelete(const Value: WideString);
+begin
+  FImgDelete:=Value;
+end;
+
+function TCB_IMGPSScanX.Get_check_main_form: WideString;
+begin
+
+end;
+
+function TCB_IMGPSScanX.Get_isExternal: WideString;
+begin
+
+end;
+
+procedure TCB_IMGPSScanX.Set_check_main_form(const Value: WideString);
+begin
+  FCheck_main_form := Value;
+end;
+
+procedure TCB_IMGPSScanX.Set_isExternal(const Value: WideString);
+begin
+  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,
@@ -13789,14 +16425,22 @@
     OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
     tmApartment);
 
-  SetLicenseKey('5B4451E676A1D2976FBB0F3BB18341336AF114C80B5ABAE7F6926B1CAF671F44' +
+  {SetLicenseKey('5B4451E676A1D2976FBB0F3BB18341336AF114C80B5ABAE7F6926B1CAF671F44' +
   'BD2F098CCEDA922F6389BFAE398DA6AEE67F97EEA0C17234C20D75C12173DBDA' +
   '594924D56DD8E342F454389C836AD880BB4352CA3BE62C4933B1BA3828E7462C' +
   '60514F2ECDAD322E6128D841F12D24DA00B623106D3F08EBCAA917D8A97CAA34' +
   '3D65F2DA567316457395BF9123EE53DF235D181F191A5712DBB27735284AA92D' +
   '5DFA0C8308308505F384707E900C6063F53F1BFF4C6972607955D1AE517B19D0' +
   '82CDD16301885403AD229D57BAEF98C056F31430861E5F68F339D658D72E1F92' +
-  '63899412EC2D07891FE3AFD35F3E4A4390B2F0A8A1BF1B7D6160E5F1CC009B17');
+  '63899412EC2D07891FE3AFD35F3E4A4390B2F0A8A1BF1B7D6160E5F1CC009B17'); }
+  SetLicenseKey('4B2CF65E8C2A86CE8A0DD0F6A7DB03BC0B0126168B48AE4C27EBD78CAE75CF0F' +
+   'A612190861E0D99F6FAE3ED97AC1941B5E97843CFFCF705A3787989072D4EB2C' +
+   'AE6CAB3F5B69B86616ACC8A37AD6A2AB21C7BDD5C9AE1EDF9E4193D353805C9A' +
+   '403631CE8A3D0803FEBB1BE4C209CE7A63B1298EF080EB34B8628CED567D2B68' +
+   'E777FAC58E2E32B7411FC217A04336231D1E861A93474759DAA6EDF53F6EB632' +
+   'A3055229A52F3053FB844754741409022DDE3DFB19473510F2BE63328E74BE20' +
+   'A6A29AA24878F91ADA9DF8CE1F320AF4DAF58EBF95D9BE761D70EEA274E19475' +
+   '1C15948B184264C5C49E60493F3BCD2FFAE2CA8B021D00B96F45550C5F050D8A');
 
 
   SetLicenseKey('A6A94A8D91B08A9D58F300C0573EA9EF1B9DB0BF69B90E13B958DB4CB6B44F5A' +

--
Gitblit v1.8.0