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