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/scan/twain.pas | 853 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 853 insertions(+), 0 deletions(-)
diff --git a/reassemble/scan/twain.pas b/reassemble/scan/twain.pas
new file mode 100644
index 0000000..fd7ceed
--- /dev/null
+++ b/reassemble/scan/twain.pas
@@ -0,0 +1,853 @@
+{ ==============================================================================
+ 方法名稱:StatrTwainScan
+ 引用相依:OnAcquire, Scanner, Scanner.AcquireWithSourceOpen, Scanner.CloseSour
+ ce, Scanner.OpenSource, StatrTwainScan, TTiffGraphic
+ 方法描述:啟動 TWAIN 掃描流程。檢查驅動是否安裝,初始化 ScanInfo 並設定 DPI、影像
+ 格式、UI 顯示及雙面掃描模式。執行 AcquireWithSourceOpen 並利用 try...f
+ inally 確保資源釋放。
+============================================================================== }
+procedure TCB_IMGPSScanX.StatrTwainScan;
+var ScanInfo : TScanInfo;
+ i : Integer;
+begin
+ if not Scanner.IsConfigured then
+ begin
+ ShowMessage(_Msg('TWAIN 掃瞄驅動尚未安裝'));
+ Exit;
+ end;
+ FillChar(ScanInfo, SizeOf(ScanInfo), 0);
+ ScanInfo.MultiPage := True;
+ ScanInfo.ImageCount := 0;
+ ScanInfo.Graphic := TTiffGraphic.Create;
+ try
+ ISB := nil; //規零
+//ShowMessage(IntToStr(ScanDpi));
+ Scanner.RequestedXDpi := ScanDpi;
+ Scanner.RequestedYDpi := ScanDpi;
+ Scanner.RequestedImageFormat := ScanColor;
+ Scanner.ShowUI := TwainShowUI;
+
+ Try
+ Scanner.OpenSource;
+ 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('掃瞄器發生錯誤!!'));
+ Scanner.CloseSource;
+ Exit;
+ end;
+ try
+ Try
+ Scanner.AcquireWithSourceOpen( OnAcquire, LongInt(@ScanInfo));
+ Except
+ Scanner.CloseSource;
+ end;
+ finally
+ Scanner.CloseSource;
+ end;
+ finally
+ Scanner.CloseSource;
+ ScanInfo.Graphic.Free;
+ end;
+end;
+
+
+{ ==============================================================================
+ 方法名稱:OnAcquire
+ 引用相依:OnAcquire, TJpegGraphic, TTiffGraphic
+ 方法描述:掃描影像獲取後的回調處理。處理 DIB 句柄、設定 DPI、執行條碼辨識、影像旋
+ 轉、反向、去偏斜及清黑邊。支援 A3 裁切判定與空白頁過濾。
+============================================================================== }
+procedure TCB_IMGPSScanX.OnAcquire( const DibHandle : THandle;
+ const XDpi : Word;
+ const YDpi : Word;
+ const CallBackData : LongInt );
+var
+ pScanInfo : TpScanInfo;
+ SaveFileName : String;
+ SaveStream : TFileStream;
+ strResults : TBarcodeStringResult;
+ DeleteStm : TMemoryStream;
+ isDelete : Boolean;
+ iGraphic,iGraphic_First,iGraphic_sec : TTiffGraphic;
+ iRect : TRect;
+ JpgGr : TJpegGraphic;
+ i : Integer;
+ TagTxt : String;
+ function Deletepage(Graphic:TDibGraphic;BlankSize:Integer):Boolean;
+ begin
+ DeleteStm := TMemoryStream.Create;
+ DeleteStm.Seek(0,soFromBeginning);
+ Graphic.AppendToStream(DeleteStm);
+
+ //DeleteStm.LoadFromFile(Path+'temp.tif');
+ //Isb1.Graphic.SaveToStream(DeleteStm);
+ //Isb1.Graphic.AppendToStream(DeleteStm);
+ if DeleteStm.Size < BlankSize Then
+ Result:= True
+ Else
+ Result := False;
+
+ DeleteStm.Free;
+ //DeleteFile(Path+'temp.tif');
+ end;
+begin
+ pScanInfo := TpScanInfo(CallBackData);
+ isDelete := False;
+
+ if pScanInfo^.MultiPage then
+ begin
+ pScanInfo^.Graphic.AssignFromDibHandle(DibHandle);
+ pScanInfo^.Graphic.XDotsPerInch := XDpi;
+ pScanInfo^.Graphic.YDotsPerInch := YDpi;
+ TagTxt := 'height:'+inttostr(pScanInfo^.Graphic.Height)+',width:'+inttostr(pScanInfo^.Graphic.Width);
+ if pScanInfo^.Graphic.ImageFormat = ifBlackWhite then
+ begin
+ ImageScrollBox1.Graphic.Assign(pScanInfo^.Graphic);
+ ImageScrollBox1NewGraphic(ImageScrollBox1.Graphic);
+
+ pScanInfo^.Graphic.Compression := tcGroup4;
+ MpsGetBarcode(pScanInfo^.Graphic,MpsBarcodeinf);
+ For i := 1 to MpsBarcodeinf.count do
+ begin
+ If (MpsBarcodeinf.r180[i] <> 0) and (Length(MpsBarcodeinf.Text[i])=FormIDLength) Then
+ begin
+ Rotate(pScanInfo^.Graphic,MpsBarcodeinf.r180[i]);
+ MpsGetBarcode(pScanInfo^.Graphic,MpsBarcodeinf); //旋轉後再重取一次條碼資訊
+ Break;
+ end;
+ end;
+
+ //影像反向
+ IF ScannerReverse then
+ NegativeImg(pScanInfo^.Graphic);
+ //傾斜矯正
+ IF ScanDeskew Then
+ DeskewImg(pScanInfo^.Graphic);
+ //清黑邊
+ IF BoardClear then
+ CleanupBorder(pScanInfo^.Graphic);
+ end
+ else if pScanInfo^.Graphic.ImageFormat = ifTrueColor then
+ begin
+ //Ext := '.jpg';
+ ImageScrollBox1.Graphic.Assign(pScanInfo^.Graphic);
+ //ImageScrollBox1NewGraphic(ImageScrollBox1.Graphic);
+ MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);
+ For i := 1 to MpsBarcodeinf.count do
+ begin
+ 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); //旋轉後再重取一次條碼資訊
+ Break;
+ end;
+ end;
+ pScanInfo^.Graphic.Compression := tcJpeg;
+ 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 := FJpgCompression;
+ end
+ else if pScanInfo^.Graphic.ImageFormat = ifGray256 Then
+ begin
+ //Ext := '.jpg';
+ ImageScrollBox1.Graphic.Assign(pScanInfo^.Graphic);
+ ImageScrollBox1NewGraphic(ImageScrollBox1.Graphic);
+ MpsGetBarcode(ISB_BW.Graphic,MpsBarcodeinf);
+ For i := 1 to MpsBarcodeinf.count do
+ begin
+ 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); //旋轉後再重取一次條碼資訊
+ Break;
+ end;
+ end;
+ pScanInfo^.Graphic.Compression := tcJpeg;
+ pScanInfo^.Graphic.JpegQuality := FJpgCompression;
+//ShowMessage(IntToStr(pScanInfo^.Graphic.JpegQuality));
+//if pScanInfo^.Graphic.Compression = tcJpeg then
+//begin
+//ShowMessage('jpg');
+//end;
+
+ end
+ else
+ begin
+ //Ext := '.tif';
+ pScanInfo^.Graphic.Compression := tcPackBits;
+ end;
+
+ end;
+ //Application.ProcessMessages;
+ iGraphic_First := TTiffGraphic.Create;
+ iGraphic_sec := TTiffGraphic.Create;
+ //iGraphic := TTiffGraphic.Create;
+ try
+ iGraphic_First.Assign(pScanInfo^.Graphic);
+ //Application.ProcessMessages;
+ if CheckNeedCrop(iGraphic_First) Then
+ begin
+ 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); //再取右邊的影像
+ iRect.Left := 0;
+ iRect.Top := 0;
+ iRect.Right := pScanInfo^.Graphic.Width div 2;
+ iRect.Bottom := pScanInfo^.Graphic.Height;
+ CropImg(iGraphic_Sec,iRect);
+ 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;
+ IF (not DeviceDelete) or (not Deletepage(iGraphic,DeviceDeleteSize)) Then
+ begin
+ ImageScrollBox1.Graphic.Assign(iGraphic);
+ 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
+ IF LowerCase(ExtractFileExt(PEFileName)) = '.tif' Then
+ begin
+ if FileExists( PEFileName ) then
+ SaveStream := TFileStream.Create( PEFileName ,fmOpenReadWrite)
+ Else
+ SaveStream := TFileStream.Create( PEFileName ,fmCreate );
+ try
+ SaveStream.Seek(0, soFromBeginning);
+ iGraphic.AppendToStream(SaveStream);
+ finally
+ SaveStream.Free;
+ end;
+ end
+ Else IF LowerCase(ExtractFileExt(PEFileName)) = '.jpg' Then
+ begin
+ if FileExists( PEFileName ) then
+ DeleteFile(PEFileName);
+ //SaveStream := TFileStream.Create( PEFileName ,fmCreate );
+ JpgGr := TJpegGraphic.Create;
+ try
+ JpgGr.Assign(iGraphic);
+ JpgGr.SaveQuality := FJpgCompression;
+ //JpgGr.AppendToStream(SaveStream);
+ JpgGr.SaveToFile(PEFileName);
+ finally
+ JpgGr.Free;
+ //SaveStream.Free;
+ end;
+ end;
+ PageDone;
+ end;
+ end;
+ if iGraphic = iGraphic_First then
+ iGraphic := iGraphic_Sec
+ else
+ iGraphic.Assign(nil);
+ //iGraphic.Assign(iGraphic_Sec);
+ end;
+ finally
+ //iGraphic.Free;
+ iGraphic_First.Free;
+ iGraphic_Sec.Free;
+ end;
+
+end;
+
+
+{ ==============================================================================
+ 方法名稱:PageDone
+ 引用相依:LoadFromFile, PageDone
+ 方法描述:單頁影像處理後的 UI 更新。累加計數,根據模式(新建、取代、插入、取樣)將影
+ 像載入對應的顯示元件,並依設定調整反鋸齒與縮放。
+============================================================================== }
+procedure TCB_IMGPSScanX.PageDone;
+Var
+ ISB,NowISB : TImageScrollBox;
+begin
+ inc(Scaninfo.ImageCount);
+ case ScanMode of
+ smNew:
+ begin
+ if ScanImgShowMode = 0 then //清楚顯示
+ begin
+ ISB := FindISB2View(VMode);
+ ISB.AntiAliased := True;
+ ISB.ZoomMode := zmFittopage;
+ ISB.LoadFromFile(PEFileName,1);
+ end
+ 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 //不顯示
+ begin
+
+ end
+ end;
+ smReplace:
+ begin
+ DisplayISB.LoadFromFile(PEFileName,1);
+ end;
+ smInsert:
+ begin
+ ISB := FindISB2View(VMode);
+ ISB.ZoomMode := zmFittopage;
+ ISB.LoadFromFile(PEFileName,1);
+ end;
+ smSample:
+ begin
+ ISB := FindISB2View(VMode);
+ ISB.ZoomMode := zmFittopage;
+ ISB.LoadFromFile(PEFileName,1);
+ end;
+ smRTS:
+ begin
+
+ end;
+ end;
+end;
+
+
+{ ==============================================================================
+ 方法名稱:PageEnd
+ 引用相依:DirectoryExists, GetNoNameCase, PageEnd, SaveToFile, Str2Dir, _DelTr
+ ee
+ 方法描述:管理影像儲存路徑與命名。辨識條碼區分表單、導引頁或分案頁;處理分份邏輯
+ 與自動建立目錄,並更新樹狀結構索引。
+============================================================================== }
+procedure TCB_IMGPSScanX.PageEnd;
+Var
+ i,n : Integer;
+ SampleFormID : String;
+ DocNo,FormID,FormVersion : String;
+ BarStr : String;
+begin
+ case ScanMode of
+ smNew:
+ begin
+ ScanSaveFilename := '';
+ DocNo:='';
+ FormID:='';
+ FormVersion:='';
+ PEFileName := '';
+ //if not FindNoSaveBarCode then //沒有不儲存影像的條碼
+ //begin
+ if FormID = '' then
+ begin
+ FormID := BarCode2FormID; //取出FormID
+ end;
+
+ 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);
+//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; //清掉案件索引
+ ScanCaseno := BarCode2CaseID; //取出案件編號
+ NowGuideFormID := '';
+ NowDivPageFormID :='';
+//ShowMessage('B NowGuideFormID='+NowGuideFormID+#10#13+'FormID='+FormID+#10#13+'ScanCaseno='+ScanCaseno);
+ end;
+ if ScanCaseno = '' then //一開始都沒找到
+ begin
+ ScanCaseno := GetNoNameCase(ImageSavePath);
+ end;
+ ImageSavePath := ImagePath;
+ if (ScanInfo.ImageCount = 0) then
+ begin
+ if DirectoryExists(ImageSavePath + ScanCaseno+'\') then
+ begin
+ _DelTree(ImageSavePath + ScanCaseno+'\');
+ SetCaseList('D',-1,ScanCaseno);
+ end;
+ end;
+
+ ScanPath := ImageSavePath+ScanCaseno+'\';
+ Str2Dir(ScanPath);
+
+ ScanDocDir := FindLastestDocDir(ScanCaseno,DocNo);
+//ShowMessage('AA ScanDocDir='+ScanDocDir);
+
+//ShowMessage('BB ScanDocDir='+ScanDocDir);
+ if DocNoNeedDiv(DocNo)then //要分份數
+ begin
+ //Showmessage(DocNo+#13+FormCode2Page(FormID)+#13+inttostr(GetDocDir_Page(ScanCaseno,ScanDocDir))+#13+ScanDocDir);
+ if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(ScanCaseno,ScanDocDir)>0)) or (ScanDocDir = '') then
+ begin
+ //ScanInfo.ImageCount := 0;
+ ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
+ end;
+ end
+ Else //不分份數
+ begin
+ if DocNo <> '' then
+ ScanDocDir := DocNo
+ else //Attach 附件
+ ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
+ end;
+ //ScanDocDir := GetDocNoDir(ImageSavePath+ScanCaseno+'\',DocNo);
+ if FirstDocDir = '' then
+ FirstDocDir := ScanDocDir;
+
+ ScanPath := ImageSavePath+ScanCaseno+'\'+ScanDocdir+'\';
+ //Showmessage(ScanPath);
+ if (not DirectoryExists(ScanPath)) and (ScanDocdir <> AttName) then
+ begin
+ //Showmessage('ADD:'+ScanCaseno+','+ScanDocdir);
+ SetDocNoList('A',-1,ScanCaseno,ScanDocdir,'1');
+ end;
+ Str2Dir(ScanPath);
+
+
+ ScanSaveFilename := FormID;
+
+ Str2Dir(ScanPath);
+ 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 //沒有不儲存影像的條碼
+ begin
+ if ScanInfo.ImageCount = 0 then
+ begin
+ SetCaseList('A',-1,ScanCaseno);
+ WriteCaseIndex(ImageSavePath + ScanCaseno+'\'); //寫入案件索引
+ MyTreeNode1 := TreeView1.Items.AddChild(NewTreenode,ScanCaseno);
+ MyTreenode1.ImageIndex := 2;
+ MyTreenode1.SelectedIndex := 2;
+ Application.ProcessMessages;
+ end;
+
+ SetContextList('A',-1,ScanCaseno,ScanDocDir,ScanSaveFilename);
+ //ContextList.Add(ScanSaveFilename);
+ //ContextList.SaveToFile(ScanPath+'Context.dat');
+
+ PEFileName := ScanPath+ScanSaveFilename;
+ end;
+ end;
+ smReplace:
+ begin
+ if ScanInfo.ImageCount = 0 then
+ begin
+ DeleteFile(ScanPath+ScanSaveFilename);
+ PEFileName := ScanPath+ScanSaveFilename;
+ end;
+ end;
+ smInsert:
+ begin
+ ScanSaveFilename := '';
+ FormID := BarCode2FormID; //取出FormID
+ if (FormID <> '') and ISGuideFormID(FormID) then //20170510 註解 因為DSCAN 會全擠在導引頁下
+ NowGuideFormID := FormID;
+ if (NowGuideFormID <> '') {and (FormID = '')} then //20170510 註解 因為DSCAN 會全擠在導引頁下
+ FormID := NowGuideFormID;
+ DocNo := FormCode2DocNo(FormID);
+ ScanDocDir := FindLastestDocDir(ScanCaseno,DocNo);
+
+ if (FMode='ESCAN') and (FModeName=_Msg('補件掃描')) then //20180207 加入的特殊邏輯
+ begin
+ ScanDocDir := FindLastestDocDirForPage(ScanCaseno, DocNo,FormID);
+ end;
+
+ if (DocNoNeedDiv(DocNo)) then //要分份數
+ begin
+ if TreeView1.Selected = MyTreeNode1 then //20170421 掃瞄插頁時選則在案號上才要分份數 選在FormID上就不分份數
+ begin
+ 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 //不分份數
+ begin
+ if DocNo <> '' then
+ ScanDocDir := DocNo
+ else //Attach 附件
+ ScanDocDir := DocNo2DocNoDir(ImageSavePath + ScanCaseno+'\',DocNo);
+ end;
+ if FirstDocDir = '' Then
+ FirstDocDir := ScanDocDir;
+
+ ScanPath := ImageSavePath+ScanCaseno+'\'+ScanDocdir+'\';
+ if (not DirectoryExists(ScanPath)) and (ScanDocdir <> 'Attach') and (ScanDocdir <> 'S_Attach') then
+ SetDocNoList('A',-1,ScanCaseno,ScanDocdir,'1');
+
+
+ ScanSaveFilename := FormID;
+ Str2Dir(ScanPath);
+ 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;
+ //ContextList.Add(ScanSaveFilename);
+ //ContextList.SaveToFile(ScanPath+'Context.dat');
+ SetContextList('A',-1,ScanCaseno,ScanDocDir,ScanSaveFilename);
+ //Showmessage(ScanPath+ScanSaveFilename);
+ //Showmessage('Stop');
+ PEFileName := ScanPath+ScanSaveFilename;
+ end;
+ smSample:
+ begin
+ if ScanInfo.ImageCount = 0 then
+ begin
+ DeleteFile(ScanPath+ScanSaveFilename);
+ PEFileName := ScanPath+ScanSaveFilename;
+ BarStr := '';
+ for i := 1 to MpsBarCodeinf.Count do
+ begin
+ BarStr := BarStr + MpsBarCodeinf.Text[i];
+ end;
+ Showmessage(_Msg('辨識到的BarCode:')+#13+BarStr);
+ end;
+ end;
+ smRTS:
+ begin
+
+ end;
+ end;
+ Application.ProcessMessages;
+
+end;
+
+
+
+{ ==============================================================================
+ 方法名稱:R_W_Scanini
+ 引用相依:Scanner
+ 方法描述:讀取或寫入 FBScan.ini。處理包含空白頁刪除、影像反向、清黑邊、旋轉、去偏斜
+ 、亮度對比及顯示模式等掃描參數。
+============================================================================== }
+Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'讀取;'W'寫入
+var
+ ini : Tinifile;
+begin
+ ini := Tinifile.Create(ScaniniPath+'FBScan.ini');
+ try
+ case Mode of
+ 'R':begin
+ DeviceDelete := ini.ReadBool('DeviceDelete','Mode',Def_DeviceDelete);
+ 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);
+ //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說掃瞄器廠商有調設定要新增此選項是否啟動
+ 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.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說掃瞄器廠商有調設定要新增此選項是否啟動
+ end;
+ end;
+
+ finally
+ ini.Free;
+ end;
+end;
+
+
+{ ==============================================================================
+ 方法名稱:GetDefScanIni
+ 引用相依:FJpgCompression, Rotate, Scanner
+ 方法描述:從資料庫參數清單初始化掃描預設值。設定 DPI、雙面模式、旋轉角度、路徑、導
+ 引頁及分案頁代碼等關鍵系統變數。
+============================================================================== }
+Procedure TCB_IMGPSScanX.GetDefScanIni; //取得掃瞄的預設值
+var
+ i : Integer;
+ PARA_NO,PARA_CONTENT: String;
+begin
+ Def_DeviceDelete := True;
+ Def_DeviceDeleteSize := 3072; //20120821 改成3000(出現)
+ Def_ScannerReverse := False;
+ Def_BoardClear := False;
+ Def_ScanDpi := 300;
+ Def_ScanDuplex := True;
+ Def_ScanRotate := 0;
+ Def_ScanDeskew := False;
+ Def_ScanImgSetUse := False;
+ Def_ScanBright := 0;
+ Def_ScanContrast := 0;
+ Def_ScanImgShowMode := 2;
+
+ for i := 0 to WORK_INF_List.Count - 1 do
+ begin
+ 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
+ Def_DeviceDelete := True
+ Else
+ Def_DeviceDelete := False;
+ end
+ 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
+ Def_DeviceDeleteSize := 0
+ Else
+ Def_DeviceDeleteSize := Strtoint(PARA_CONTENT);
+
+ end
+ 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
+ Def_ScannerReverse := True
+ Else
+ Def_ScannerReverse := False;
+ end
+ 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
+ Def_BoardClear := True
+ Else
+ Def_BoardClear := False;
+ end
+ 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
+ Def_ScanDpi := 300
+ else
+ Def_ScanDpi := Strtoint(PARA_CONTENT);
+ end
+ 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
+ Def_ScanDuplex := True
+ Else
+ Def_ScanDuplex := False;
+
+ end
+ 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
+ Def_ScanRotate := 0
+ Else if PARA_CONTENT = '1' then
+ Def_ScanRotate := 270
+ Else if PARA_CONTENT = '2' then
+ Def_ScanRotate := 180
+ Else if PARA_CONTENT = '3' then
+ Def_ScanRotate := 90
+ Else
+ Def_ScanRotate := 0;
+ end
+ 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
+ Def_ScanDeskew := True
+ Else
+ Def_ScanDeskew := False;
+ end
+ 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
+ Def_ScanImgSetUse := True
+ else
+ Def_ScanImgSetUse := False;
+ end
+ 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
+ Def_ScanBright := 0
+ Else
+ Def_ScanBright := strtoint(PARA_CONTENT);
+ if (Def_ScanBright > 255) or (Def_ScanBright < -255) then
+ Def_ScanBright := 0;
+
+ end
+ 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
+ Def_ScanContrast := 0
+ Else
+ Def_ScanContrast := strtoint(PARA_CONTENT);
+ if (Def_ScanContrast > 255) or (Def_ScanContrast < -255) then
+ Def_ScanContrast := 0;
+ end
+ Else if GetSQLData(WORK_INF_List,'PARA_NO',i) = 'SCAN_SHOW_MODE' Then
+ begin
+ PARA_CONTENT := GetSQLData(WORK_INF_List,'PARA_CONTENT',i);
+ if PARA_CONTENT = '0' then
+ Def_ScanImgShowMode := 0
+ Else if PARA_CONTENT = '1' then
+ Def_ScanImgShowMode := 1
+ Else if PARA_CONTENT = '2' then
+ Def_ScanImgShowMode := 2
+ Else
+ Def_ScanImgShowMode := 0;
+ end
+ 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 //掃描提示字串
+ 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 //掃描不存檔之表單代號
+ 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 //本機端路徑
+ 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 //當導引頁的表單
+ 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;
+end;
+
+
+{ ==============================================================================
+ 方法名稱:initkscan
+ 引用相依:Scanner, Scanner.CloseSource, Scanner.OpenSource, initkscan
+ 方法描述:偵測掃描器硬體能力。嘗試開啟掃描來源以檢查是否支援雙面掃描 (DuplexCap
+ ),並據此啟用 UI 控制項。
+============================================================================== }
+procedure TCB_IMGPSScanX.initkscan;
+begin
+ ScanDuplexCB.Enabled := False;
+ if Scanner.IsConfigured then
+ begin
+ try
+ Scanner.OpenSource;
+ IF Scanner.DuplexCap > 0 Then
+ begin
+ ScanDuplexCB.Enabled := True;
+ end;
+ {IF Scanner.FEEDERCAP Then
+ ScanFlatCB.Enabled := True; }
+ Except
+ DataLoading(False,True);
+ Exit;
+ end;
+ Scanner.CloseSource;
+ end;
+end;
+
+
--
Gitblit v1.8.0