From 0756bf12d10cf1b7f78c571de0a9ad69cbaeb7ca Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期一, 30 三月 2026 14:24:17 +0800
Subject: [PATCH] fix: 更新內部引用方法參照

---
 reassemble/CB_IMGPSScanImp.omr.pas | 1042 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,042 insertions(+), 0 deletions(-)

diff --git a/reassemble/CB_IMGPSScanImp.omr.pas b/reassemble/CB_IMGPSScanImp.omr.pas
new file mode 100644
index 0000000..79c45c1
--- /dev/null
+++ b/reassemble/CB_IMGPSScanImp.omr.pas
@@ -0,0 +1,1042 @@
+{ ==============================================================================
+  方法名稱:GetSiteOMR
+  引用相依:ClearLine, FindPoint, GetSiteOMR, Get_OMR, LoadFromFile
+  方法描述:在影像指定座標執行 OMR 辨識。載入影像、計算相對於定位點的座標偏移、限制
+            邊界並呼叫核心辨識程式獲取結果。
+============================================================================== }
+function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;
+var
+  OMRRect : TRect;
+  Xdpi,Ydpi : Integer;
+  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
+      OMRRect.Top := 0;
+    if OMRRect.Right > ImageScrollBox1.Graphic.Width then
+      OMRRect.Right := ImageScrollBox1.Graphic.Width;
+    if OMRRect.Bottom > ImageScrollBox1.Graphic.Height then
+      OMRRect.Bottom := ImageScrollBox1.Graphic.Height;
+
+    result := Get_OMR(ISB_BW.Graphic,OMRRect);
+//ShowMessage('result='+IntToStr(result));
+
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:CheckRule2OMRErrInfo
+  引用相依:
+  方法描述:將檢核規則清單(CHECK_RULE_INF_List)中的資料轉換為內部的 OMRErrInfo R
+            ecord 陣列,設定各項規則的顯示類型(Display)、是否可忽略(Ignore)及提示
+            訊息與掃瞄模式。
+============================================================================== }
+Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo;   //檢核規則填入OMRErrINFo Record
+var i : Integer;
+    CheckNo : String;
+begin
+  for I := 1 to 11 do
+  begin
+    CheckNo := Add_Zoo(i,3);
+
+    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  //顯示
+      Else if GetFindResult('MESG_SHOW_TYPE') = '2' then
+        OMRErrInfo[i].Display := False; //不顯示
+
+      if GetFindResult('MESG_DISP_TYPE') = '1' then
+        OMRErrInfo[i].Ignore := True    //可忽略
+      Else if GetFindResult('MESG_DISP_TYPE') = '2' then
+        OMRErrInfo[i].Ignore := False;  //不可忽略
+
+      OMRErrInfo[i].Info := GetFindResult('CHECK_MESG');
+      OMRErrInfo[i].Mode := GetFindResult('SCAN_MODE');
+    end;
+  end;
+end;
+
+
+
+
+{ ==============================================================================
+  方法名稱:DistinctFormCode
+  引用相依:LoadFileGetMD5, LoadFromFile
+  方法描述:從案件的 Context.dat 檔案中提取不重複的表單代碼(FormCode)並存入 OMRF
+            ileList。程序會遍歷上傳目錄下的所有檔案,檢查檔案是否存在且未被處理過。
+            接著比對 OMRFileList 中已有的表單代碼,若為新出現的表單代碼且檔案有效
+            ,則將其加入清單中,用於後續 OMR 處理。
+============================================================================== }
+Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁
+var
+  i,n : Integer;
+  LForm,OForm : String;
+  Addok : Boolean;
+  S : TStringlist;
+begin
+  S := TStringlist.Create;
+  try
+    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
+      begin
+        OForm := FileName2FormCode(OMRFileList.Strings[n]);
+        if (LForm <> '') and (LForm = OForm) then
+        begin
+          AddOk := False;
+          Break;
+        end;
+      end;
+      if AddOk then
+      begin
+        OMRFileList.Add(S.Strings[i]);
+      end;
+    end;
+  finally
+  S.Free;
+  end;
+
+end;
+
+
+
+{ ==============================================================================
+  方法名稱:OMRCheckCase
+  引用相依:FileExists, FindPoint, GetSiteOMR, ImageReSize_FormID, ImageResize, 
+            LoadFromFile, SaveToFile
+  方法描述:執行案件的自動化 OMR 規則檢核,這是確保掃瞄案件合規性的核心邏輯。程序
+            流程:
+            1. 初始化檢核日誌。
+            2. 識別主文件並驗證必要文件是否缺漏、相依與互斥文件是否衝突、以及表單
+            是否已停用。
+            3. 檢查各文件類型是否超過預設的最大頁數。
+            4. 針對案件內每張影像,執行十字定位點縮放 (ImageReSize_FormID) 後,載
+            入對應表單的 XML 規則檔。
+            5. 執行欄位級檢核,包含必填項 (settype1)、跨文件欄位關聯 (settype3/set
+            type8)、相依文件需求 (settype4) 及備註填寫要求 (settype6) 等。
+            6. 將所有檢核失敗原因紀錄至 Checkerr.ini。最終返回案件是否通過所有檢
+            核規則。
+============================================================================== }
+Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核
+var
+  i,n,m,v,v1 : Integer;
+  XT,RelaXT,ValueXT : TXmltool;
+  OMRFormCode,OMRFile,OMRFormName,ColEName,ColCName,Site : String;
+  Pixel : Integer;
+  RelaFormCode,RelaFile,RelaFormName,RelaColEName,RelaColCName,RelaSite : String;
+  RelaDocNo,RelaDocName : string;
+  RelaPixel : Integer;
+  s : String;
+  nodename : String;
+  OMROK : Boolean;
+  CaseOk : Boolean;
+  ErrStr : String;
+  SiteRec,RelaSiteRec : String;  //多組位置記錄
+  OMRValue : String;
+  MainFormID,MainDocNo,MainVersion : String; //主FormID
+  MainFormPage,CaseFormPage : Integer;  //主要文件需要的頁數
+  NeedDocNoStr,NoDocNoStr : String; //相依 互斥文件字串
+  List : TStringlist;
+  FormCode : String;
+  FormDataPages : Integer;
+  NoSite : Boolean; //未定位
+  Anchor,Anchor1 : String;
+  OMROkCount : Integer;
+  //Casecheck : Boolean;  //是否要做檢核
+  //AllCheck : Boolean;  //是否要做完整檢核
+
+  ISB8W,ISB8H:integer;
+begin
+  ///OMRErrInfo  1: 必要文件  2:相依文件 3:互斥文件  4:必填 5:欄位有值附文件  6:欄位有值不附文件
+  ///            7: 欄位有值相關欄位也要有值  8:欄位有值要寫備註 9:停用日期 10:最大頁數
+  //Casecheck := True;
+  //Allcheck := True;
+  //if (FMode = 'ISCAN') then
+    //Allcheck := False;
+  CaseOk := True;
+  //if Casecheck then
+  //begin
+    DeleteFile(ImageSavePath+CaseID+'\upload\Checkerr.ini');
+    DeleteFile(ImageSavePath+CaseID+'\upload\CheckMemo.dat');
+    //DeleteFile(ImageSavePath+CaseID+'\upload\ReSize.dat');
+    DeleteFile(ImageSavePath+CaseID+'\upload\RemoveMemo.dat');
+    DeleteFile(ImageSavePath+CaseID+'\upload\OMRCheckOk.dat');
+    Memo1.Lines.Clear;
+    OMRFileList.Clear;
+
+    MainFormID := GetCaseFormID(ImageSavePath+CaseID+'\upload\');
+    List := TStringlist.Create;
+    try
+      //if AllCheck then
+      //begin
+        if GetCasePage(ImageSavePath,CaseID) =0 then
+        begin
+
+        end;
+//ShowMessage('MainFormID='+MainFormID);
+LogFile1.LogToFile(logTimeString+' '+FModeName+' '+CaseID+' '+'MainFormID='+MainFormID);
+        if MainFormID = ''then
+        begin
+          //20131203 yuu說不檢查這個,先拿掉   20170315 楷琳說未歸類要擋  20170726 因此有檢查必要FormID  所以 可以拿掉
+          {if FCheck_main_form='Y' then
+          begin
+            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
+          //////主要非主要文件//////
+          DistinctDocinCase(ImageSavePath+CaseID+'\upload\');
+//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
+              v := Pos('_', DocNo_VerinCase.Strings[i]);
+              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); //資料庫記錄主文件頁數
+              CaseFormPage := CheckCaseDocNoPage(CaseID,MainDocNo,MainVersion,MainFormPage); //案件主文件的頁數
+LogFile1.LogToFile(logTimeString+CaseID+',MainDocNo='+MainDocNo+',MainVersion='+MainVersion+',MainFormPage='+IntToStr(MainFormPage)+',CaseFormPage='+IntToStr(CaseFormPage));
+              //CheckFirstDocNoPage
+              IF (MainFormPage > 0) and (MainFormPage <> CaseFormPage) then
+              begin
+                ErrStr:=MainDocNo+Format(OMRErrInfo[1].Info,[Inttostr(MainFormPage),Inttostr(CaseFormPage)]); //主要文件需有XX頁僅附XX頁
+                OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[1].Ignore,OMRErrInfo[1].Display);
+                if OMRErrInfo[1].Display then
+                  CaseOk := false;
+              end;
+            end;
+          end;
+          //////主要非主要文件/////
+//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
+          begin
+            NeedDocNoStr := GetFindResult('DEPE_FORM_ID');
+            NoDocNoStr := GetFindResult('MUTEX_FORM_ID');
+          end
+          Else if FindSQLData(DM_FORM_INF_List,'DEPE_FORM_ID,MUTEX_FORM_ID','MAIN_FORM_ID,DOC_VERSION',MainDocNo+','+MainVersion,0,FindResult) then
+          begin
+            NeedDocNoStr := GetFindResult('DEPE_FORM_ID');
+            NoDocNoStr := GetFindResult('MUTEX_FORM_ID');
+          end;
+
+          //////相依文件/////
+          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  //沒附相依文件
+              begin
+                if FWH_category='N' then
+                begin
+                  if ISExistImg(ImageSavePath+CaseID+'\upload\'+List.Strings[i]) then
+                  begin
+                    Continue;
+                  end;
+                end;
+                ErrStr:=Format(OMRErrInfo[2].Info,[DocNo2DocName(CaseID,List.Strings[i])]);   //沒附相依文件
+                OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[2].Ignore,OMRErrInfo[2].Display);
+                if OMRErrInfo[2].Display then
+                  CaseOk := false;
+              end;
+            end;
+          end;
+          //////相依文件/////
+
+          //////互斥文件/////
+          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  //附了互斥文件
+              begin
+                if FWH_category='N' then
+                begin
+                  if ISExistImg(ImageSavePath+CaseID+'\upload\'+List.Strings[i]) then
+                  begin
+                    Continue;
+                  end;
+                end;
+                ErrStr:=Format(OMRErrInfo[3].Info,[DocNo2DocName(CaseID,List.Strings[i])]);   //有附互斥文件
+                OMRErr2ini(CaseID,ErrStr,'','','','','','',False,OMRErrInfo[3].Ignore,OMRErrInfo[3].Display);
+                if OMRErrInfo[3].Display then
+                  CaseOk := false;
+              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]);
+        /////未歸類///
+        {IF FormCode = 'Attach' Then   //20140211 yuu說不檢查了
+        begin
+          ErrStr:=_Msg('尚有文件未歸類');
+          OMRErr2ini(CaseID,ErrStr,'','','','','','',False,False,True);
+          CaseOk := false;
+        end; }
+        /////未歸類//////
+
+        /////未註冊文件/////
+        {IF not FormIDExists(FormCode,False) then  //未註冊文件
+        begin
+          ErrStr:=FormCode+_Msg('不為此業務的表單代碼');
+          OMRErr2ini(CaseID,ErrStr,'','','','',False,False,True);
+          CaseOk := false;
+        end }
+        /////未註冊文件/////
+        //////停用文件//
+        {Else} IF ModeNeedCheck(OMRErrInfo[9].Mode,FMode) and (not FormIDExists(FormCode,True,0)) and (not checkFormCodeIsCustom(ImageSavePath + CaseID+'\upload\',FormCode)) then  //有停用的文件
+        begin
+//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
+      //////最大頁數///
+LogFile1.LogToFile(logTimeString+'最大頁數A段 '+CaseID+' '+'OMRFileList.Text='+OMRFileList.Text);
+      DistinctFormCode(CaseID);
+      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  //有超過最大頁數的文件
+          begin
+            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;
+      /////最大頁數/////
+    //end;
+    ImageScrollBox1.FileName := '';
+    //if FWork_No = 'CW' then   //理賠就不做下面的檢核了
+    //begin
+      //////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);
+          ///依十字定位點縮放////
+          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;
+
+//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 //是否要檢核
+            begin
+              if XT.SubNodes['/form/settype1/'].First then
+              Repeat
+                OMROK := False;
+                SiteRec := ''; //清掉
+                ColEName := XT.SubNodes['/form/settype1/'].NodeName;
+                ColCName := XT.Node['/form/settype1/'+ColEName+'/'].Attributes['coldesc'];
+                ColCName := Copy(ColCName,1,length(ColCName)-6);
+                if XT.SubNodes['/form/settype1/'+ColEName+'/'].First then
+                Repeat
+                  nodename := XT.SubNodes['/form/settype1/'+ColEName+'/'].NodeName;
+                  If nodename <> '@coldesc' then
+                  begin
+                    Pixel := Strtoint(XT.Node['/form/settype1/'+ColEName+'/'+nodename+'/'].Attributes['pixel']);
+                    Site := XT.Node['/form/settype1/'+ColEName+'/'+nodename+'/'].Attributes['colxy'];
+                    if SiteRec= '' then   //記錄位置
+                      SiteRec := Site
+                    else
+                      SiteRec := SiteRec+'@'+Site;
+                    //有填就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');
+                      OMROK := True;
+                      Break;
+                    end;
+                  end
+                  Else
+                  begin
+                    //ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/'];
+                  end;
+                Until not XT.SubNodes['/form/settype1/'+ColEName+'/'].Next;
+                if not OMROk then
+                begin
+                  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
+            //*******有值相關文件的欄位也要有值*******
+            if ModeNeedCheck(OMRErrInfo[7].Mode,FMode) then //是否要檢核
+            begin
+              if XT.SubNodes['/form/settype3/'].First then
+              Repeat
+                SiteRec := '';
+                RelaSiteRec := '';
+                ColEName := XT.SubNodes['/form/settype3/'].NodeName;
+                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   //記錄位置
+                  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
+                  ////有填寫////
+
+                  if XT.SubNodes['/form/settype3/'+ColEName+'/'].First then
+                  Repeat
+                    RelaSiteRec := '';
+                    nodename := XT.SubNodes['/form/settype3/'+ColEName+'/'].NodeName;
+                    If (nodename <> '@coldesc') and (not XT.SubNodes['/form/settype3/'+ColEName+'/'].NodeIsAttr) then
+                    begin
+                      RelaFormCode := XT.node['/form/settype3/'+ColEName+'/'+nodename+'/'].Attributes['relaformid'];
+                      RelaColEName := XT.node['/form/settype3/'+ColEName+'/'+nodename+'/'].Attributes['rela_col_name'];
+                      RelaColCName := XT.node['/form/settype3/'+ColEName+'/'+nodename+'/'].Attributes['relacoldesc'];
+                      RelaColCName := Copy(RelaColCName,1,length(RelaColCName)-6);
+                      RelaFile := FormCode2FileName(RelaFormCode,ContextList);
+                      RelaFormName := FormCode2FormName(CaseID,RelaFormCode);
+                      Anchor1 := FormID2Anchor(RelaFormCode);
+                      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
+                      //Repeat
+                        NoSite := True;
+                        if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Count >0 then
+                          NoSite := False;
+                        if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].First then
+                        Repeat
+                          nodename := RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].NodeName;
+                          If nodename <> '@coldesc' then
+                          begin
+                            RelaPixel := Strtoint(RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['pixel']);
+                            RelaSite := RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['colxy'];
+                            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;
+
+                        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欄位填寫時,XX欄位未填寫
+                          Else if NoSite then
+                            ErrStr:=Format(OMRErrInfo[7].Info,[ColCName,RelaColCName])+'('+_msg('未定位')+')'
+                          Else
+                            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;
+                        end;
+                      //Until not RelaXT.SubNodes['/form/settype2/'].Next ;
+
+                    end;
+                  Until not XT.SubNodes['/form/settype3/'+ColEName+'/'].Next;
+                end;
+              Until not XT.SubNodes['/form/settype3/'].Next ;
+            end;
+            //*******有值相關文件的欄位也要有值*******
+//ShowMessage('11788 OMRFileList.Strings['+IntToStr(i)+']'+OMRFileList.Strings[i]);
+
+            //*******有值相關文件的欄位不能有值*******
+            if ModeNeedCheck(OMRErrInfo[11].Mode,FMode) then //是否要檢核
+            begin
+              if XT.SubNodes['/form/settype8/'].First then
+              Repeat
+                SiteRec := '';
+                RelaSiteRec := '';
+                OMROkCount := 0;
+                ColEName := XT.SubNodes['/form/settype8/'].NodeName;
+                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   //記錄位置
+                  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
+                  ////有填寫// //
+                  inc(OMROkCount);
+                end;
+                if XT.SubNodes['/form/settype8/'+ColEName+'/'].First then
+                Repeat
+                  RelaSiteRec := '';
+                  nodename := XT.SubNodes['/form/settype8/'+ColEName+'/'].NodeName;
+                  If (nodename <> '@coldesc') and (not XT.SubNodes['/form/settype8/'+ColEName+'/'].NodeIsAttr) then
+                  begin
+                    RelaFormCode := XT.node['/form/settype8/'+ColEName+'/'+nodename+'/'].Attributes['relaformid'];
+                    RelaColEName := XT.node['/form/settype8/'+ColEName+'/'+nodename+'/'].Attributes['rela_col_name'];
+                    RelaColCName := XT.node['/form/settype8/'+ColEName+'/'+nodename+'/'].Attributes['relacoldesc'];
+                    RelaColCName := Copy(RelaColCName,1,length(RelaColCName)-6);
+                    RelaFile := FormCode2FileName(RelaFormCode,ContextList);
+                    RelaFormName := FormCode2FormName(CaseID,RelaFormCode);
+                    Anchor1 := FormID2Anchor(RelaFormCode);
+                    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
+                    //Repeat
+                      NoSite := True;
+                      if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Count >0 then
+                        NoSite := False;
+                      if RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].First then
+                      Repeat
+                        nodename := RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].NodeName;
+                        If nodename <> '@coldesc' then
+                        begin
+                          RelaPixel := Strtoint(RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['pixel']);
+                          RelaSite := RelaXT.Node['/form/settype2/'+RelaColEName+'/'+nodename+'/'].Attributes['colxy'];
+                          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
+                        //begin
+                          //ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/'];
+                        //end;
+                      Until not RelaXT.SubNodes['/form/settype2/'+RelaColEName+'/'].Next;
+                      if OMROkCount > 1  then
+                      begin
+                        if not FileExists(ImageSavePath+CaseID+'\upload\'+RelaFile) then
+                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('未附')+RelaFormName+')'   //XX欄位填寫時,XX欄位也填寫
+                        Else if NoSite then
+                          ErrStr:=Format(OMRErrInfo[11].Info,[ColCName,RelaColCName])+'('+_msg('未定位')+')'
+                        Else
+                          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;
+                      end;
+                    //Until not RelaXT.SubNodes['/form/settype2/'].Next ;
+
+                  end;
+                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 //是否要檢核
+            begin
+              if XT.SubNodes['/form/settype4/'].First then
+              Repeat
+                SiteRec := '';
+                RelaSiteRec := '';
+                ColEName := XT.SubNodes['/form/settype4/'].NodeName;
+                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   //記錄位置
+                  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
+                  ////有填寫////
+                  if XT.SubNodes['/form/settype4/'+ColEName+'/'].First then
+                  Repeat
+                    nodename := XT.SubNodes['/form/settype4/'+ColEName+'/'].NodeName;
+                    If (nodename <> 'coldesc') and (not XT.SubNodes['/form/settype4/'+ColEName+'/'].NodeIsAttr) then
+                    begin
+                      {RelaFormCode := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformid'];
+                      RelaFile := FormCode2FileName(RelaFormCode);
+                      RelaFormName := FormCode2FormName(RelaFormCode); }
+                      RelaDocNo := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformid'];
+                      RelaFile := DocNo2FileName(RelaDocNo,ContextList);
+                      RelaDocName := XT.Node['/form/settype4/'+ColEName+'/'+nodename+'/'].Attributes['relaformname'];
+                      if RelaFile='' then
+                      begin
+                        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;
+                      end;
+                    end;
+                  Until not XT.SubNodes['/form/settype4/'+ColEName+'/'].Next;
+                end;
+              Until not XT.SubNodes['/form/settype4/'].Next ;
+            end;
+              //*******有值相依文件*******
+
+              //*******有值互斥文件*******
+            if ModeNeedCheck(OMRErrInfo[6].Mode,FMode) then //是否要檢核
+            begin
+              if XT.SubNodes['/form/settype5/'].First then
+              Repeat
+                SiteRec := '';
+                RelaSiteRec := '';
+                ColEName := XT.SubNodes['/form/settype5/'].NodeName;
+                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   //記錄位置
+                  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
+                  ////有填寫////
+                  if XT.SubNodes['/form/settype5/'+ColEName+'/'].First then
+                  Repeat
+                    nodename := XT.SubNodes['/form/settype5/'+ColEName+'/'].NodeName;
+                    If (nodename <> 'coldesc') and (not XT.SubNodes['/form/settype5/'+ColEName+'/'].NodeIsAttr) then
+                    begin
+                      {RelaFormCode := XT.Node['/form/settype5/'+ColEName+'/'+nodename+'/'].Attributes['relaformid'];
+                      RelaFile := FormCode2FileName(RelaFormCode);
+                      RelaFormName := FormCode2FormName(RelaFormCode);}
+                      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看到(='')改的(未測)
+                      begin
+                        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;
+                      end;
+                    end;
+                  Until not XT.SubNodes['/form/settype5/'+ColEName+'/'].Next;
+                end;
+              Until not XT.SubNodes['/form/settype5/'].Next ;
+            end;
+              //*******有值互斥文件*******
+
+              //*******有值寫備註*******
+            if ModeNeedCheck(OMRErrInfo[8].Mode,FMode) then //是否要檢核
+            begin
+              if XT.SubNodes['/form/settype6/'].First then
+              Repeat
+                SiteRec := '';
+                ColEName := XT.SubNodes['/form/settype6/'].NodeName;
+                ColCName := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['coldesc'];
+                ColCName := Copy(ColCName,1,length(ColCName)-6);
+                Site := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['colxy'];
+                Pixel := XT.Node['/form/settype6/'+ColEName+'/'].Attributes['pixel'];
+
+                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
+                  ////有填寫////
+                  if not FileExists(ImageSavePath+CaseID+'ScanMemo.dat') then
+                  begin
+                    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;
+                  end;
+                end;
+              Until not XT.SubNodes['/form/settype6/'].Next ;
+            end;
+              //*******有值寫備註*******
+
+              //*******OMR帶值********
+              if XT.SubNodes['/form/settype7/'].First then
+              Repeat
+                ColEName := XT.SubNodes['/form/settype7/'].NodeName;
+                ValueXT['/content/'+ColEName+'/@savevalue'] := '';  //先給預設空白
+                if XT.SubNodes['/form/settype7/'+ColEName+'/'].First then
+                Repeat
+                  nodename := XT.SubNodes['/form/settype7/'+ColEName+'/'].NodeName;
+                  If nodename <> '@coldesc' then
+                  begin
+                    Pixel := Strtoint(XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['pixel']);
+                    Site := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['colxy'];
+                    OMRValue := XT.Node['/form/settype7/'+ColEName+'/'+nodename+'/'].Attributes['getvalue'];
+
+                    //有填就ok
+ Display1.Lines.Add(ColEName+' '+ColCName+'   圖像實際點數='+IntToStr(GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt))+' 設定點數='+IntToStr( (Pixel + SafePixel)));
+
+                    if GetSiteOMR(ImageSavePath+CaseID+'\upload\'+OMRFile,Site,Bt) > (Pixel + SafePixel)  then
+                    begin
+                      ValueXT['/content/'+ColEName+'/@savevalue'] := OMRValue;  //有填就換成設定的值
+                      Break;
+                    end;
+                  end;
+                Until not XT.SubNodes['/form/settype7/'+ColEName+'/'].Next;
+              Until not XT.SubNodes['/form/settype7/'].Next ;
+
+              //*******OMR帶值********
+            //end;
+          Finally
+          if (OMRValue <> '') then
+            ValueXT.SaveToFile(ImageSavePath+CaseID+'/GetValue.xml');
+          XT.Free;
+          RelaXT.Free;
+          end;
+        end;
+        //必填迴圈結束
+      Finally
+      ValueXT.Free;
+      end;
+    //end;
+  //end;
+  Result := CaseOk;
+end;
+
+
+{ ==============================================================================
+  方法名稱:OMRErr2ini
+  引用相依:FileExists, LoadFromFile, SaveToFile
+  方法描述:紀錄 OMR 檢核失敗的詳細資訊。方法根據 Display 旗標決定紀錄方式:若為 T
+            rue,則在案件目錄下的 Checkerr.ini 中建立新的錯誤序號區段,詳細紀錄失
+            敗原因、檔案路徑、OMR 座標點、關聯檔案及定位點類型,用於後續 UI 呈現;若
+            為 False,則僅將錯誤原因字串附加於 CheckMemo.dat 純文字日誌中,作為背
+            景紀錄之用。
+============================================================================== }
+Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini
+var
+  ini : Tinifile;
+  Errcount : Integer;
+  S : TStringlist;
+begin
+  if Display then
+  begin
+    ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini');
+    try
+      Errcount := ini.ReadInteger('OMRCount','Count',0);  //透過Errcount來對應
+      inc(ErrCount);
+      ini.WriteString(inttostr(ErrCount),'Reason',Reason);
+      ini.WriteBool(inttostr(ErrCount),'Ingnore',Ingnore);
+      ini.writeString(inttostr(ErrCount),'FileName',FileName);
+      ini.WriteString(inttostr(ErrCount),'Site',Site);
+      ini.WriteString(inttostr(ErrCount),'RelaFileName',RelaFileName);
+      ini.WriteString(inttostr(ErrCount),'RelaSite',RelaSite);
+      ini.WriteString(inttostr(ErrCount),'Anchor',Anchor);
+      ini.WriteString(inttostr(ErrCount),'RelaAnchor',Anchor1);
+      ini.WriteBool(inttostr(ErrCount),'Del',Del);
+      ini.WriteInteger('OMRCount','Count',ErrCount);
+    finally
+    ini.Free;
+    end;
+  end
+  Else
+  begin
+    S := TStringlist.Create;
+    try
+      if FileExists(ImageSavePath + CaseID+'\CheckMemo.dat') then
+        S.LoadFromFile(ImageSavePath + CaseID+'\CheckMemo.dat');
+      S.Add(Reason);
+      S.SaveToFile(ImageSavePath + CaseID+'\CheckMemo.dat');
+    finally
+    S.Free;
+    end;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:OMRErrini2List
+  引用相依:
+  方法描述:將檢核失敗紀錄從 INI 設定檔載入至 UI 介面。方法會讀取 Checkerr.ini,遍
+            歷所有錯誤紀錄,並過濾掉已標記為刪除 (Del) 的項目。將符合條件的錯誤原
+            因填入 ErrlistForm 中的 ListView 元件,供使用者查看與修正。若清單中仍
+            存在錯誤,會同步停用介面上的上傳按鈕以防止不合規案件送出。
+============================================================================== }
+Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView
+var
+  ini : Tinifile;
+  Errcount : Integer;
+  Del : Boolean;
+  i : Integer;
+begin
+  ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini');
+  try
+    Errcount := ini.ReadInteger('OMRCount','Count',0);
+
+    for i := 1 to ErrCount do
+    begin
+      Del := ini.ReadBool(inttostr(i),'Del',False); //是否被移除了
+      if Not Del then
+      begin
+        With ErrlistForm.ErrListLV.Items.Add do
+        begin
+          Caption := ini.ReadString(inttostr(i),'Reason','');
+          SubItems.Add(inttostr(i));
+        end;
+      end;
+    end;
+    if Errlistform.ErrListLV.Items.Count > 0 then
+      Errlistform.ImmediateBt.Enabled := False;
+  finally
+  ini.Free;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:OMRErrini2List
+  引用相依:
+  方法描述:將 OMR 檢核失敗的記錄從 Checkerr.ini 讀取並顯示在 ListView 中。程序會
+            開啟指定案件目錄下的設定檔,讀取錯誤總數後逐一檢查每筆記錄是否已被移
+            除(Del 標記)。若記錄有效,則將錯誤原因及索引值新增至傳入的 ErrlistForm
+             中的 ErrListLV 列表。
+============================================================================== }
+Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView
+var
+  ini : Tinifile;
+  Errcount : Integer;
+  Del : Boolean;
+  i : Integer;
+begin
+  ini := Tinifile.Create(ImageSavePath + CaseID+'\upload\Checkerr.ini');
+  try
+    Errcount := ini.ReadInteger('OMRCount','Count',0);
+
+    for i := 1 to ErrCount do
+    begin
+      Del := ini.ReadBool(inttostr(i),'Del',False); //是否被移除了
+      if Not Del then
+      begin
+        With ErrlistForm.ErrListLV.Items.Add do
+        begin
+          Caption := ini.ReadString(inttostr(i),'Reason','');
+          SubItems.Add(inttostr(i));
+        end;
+      end;
+    end;
+    if Errlistform.ErrListLV.Items.Count > 0 then
+      Errlistform.ImmediateBt.Enabled := False;
+  finally
+  ini.Free;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:OMRErrini2ListForLog
+  引用相依:LoadFromFile
+  方法描述:彙整系統中所有活動案件的 OMR 檢核錯誤訊息。方法讀取全域的 CaseList.da
+            t,依次遍歷每個案件子目錄下的 Checkerr.ini,收集所有未被移除的錯誤原因
+            ,並將其合併為一個完整的文字區塊返回。此功能主要用於產生系統運行日誌,
+            方便追蹤與審查多案件的檢核狀態。
+============================================================================== }
+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;
+
+
+

--
Gitblit v1.8.0