{ ==============================================================================
方法名稱:Initialize
引用相依:TDibGraphic
方法描述:初始化元件狀態。註冊各類視窗與滑鼠事件處理函式(如 OnActivate, OnClick
, OnCreate 等),並設定多項預設參數,包含 MpsKey、瀏覽窗邊界、檔案副檔名、
案件與表單編號長度、去直線容忍值及切圖條碼類型。
============================================================================== }
procedure TCB_IMGPSScanX.Initialize;
begin
inherited Initialize;
OnActivate := ActivateEvent;
OnClick := ClickEvent;
OnCreate := CreateEvent;
OnDblClick := DblClickEvent;
OnDeactivate := DeactivateEvent;
OnDestroy := DestroyEvent;
OnKeyPress := KeyPressEvent;
OnMouseEnter := MouseEnterEvent;
OnMouseLeave := MouseLeaveEvent;
OnPaint := PaintEvent;
MpsKey := 'fbim';
Seg := 3; //瀏覽窗的邊界
Ext := '.tif';
SafePixel := 20;
CaseIDLength := 16; //案件編號長度 16碼 20170222 在用網頁參數來取代
FormIDLength := 15; //FormID長度 15碼 20170222 發現是用來辨識條碼用的
///DocNoLength := 8; //DocNo長度 8碼 (1~8) //20170222 發現沒用到就註解吧
Bt :=4; //去直線時橫線判斷的容忍值
CropBarcode := 'CC';//要切影像的條碼
end;
{ ==============================================================================
方法名稱:Get_Active
引用相依:
方法描述:獲取元件的 Active 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_Active: WordBool;
begin
Result := Active;
end;
{ ==============================================================================
方法名稱:Get_AlignDisabled
引用相依:
方法描述:獲取元件的 AlignDisabled 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_AlignDisabled: WordBool;
begin
Result := AlignDisabled;
end;
{ ==============================================================================
方法名稱:Get_AlignWithMargins
引用相依:
方法描述:獲取元件的 AlignWithMargins 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_AlignWithMargins: WordBool;
begin
Result := AlignWithMargins;
end;
{ ==============================================================================
方法名稱:Get_AutoScroll
引用相依:
方法描述:獲取元件的 AutoScroll 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_AutoScroll: WordBool;
begin
Result := AutoScroll;
end;
{ ==============================================================================
方法名稱:Get_AutoSize
引用相依:
方法描述:獲取元件的 AutoSize 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_AutoSize: WordBool;
begin
Result := AutoSize;
end;
{ ==============================================================================
方法名稱:Get_AxBorderStyle
引用相依:
方法描述:獲取元件的 AxBorderStyle 邊框樣式。
============================================================================== }
function TCB_IMGPSScanX.Get_AxBorderStyle: TxActiveFormBorderStyle;
begin
Result := Ord(AxBorderStyle);
end;
{ ==============================================================================
方法名稱:Get_Caption
引用相依:
方法描述:獲取元件的標題文字。
============================================================================== }
function TCB_IMGPSScanX.Get_Caption: WideString;
begin
Result := WideString(Caption);
end;
{ ==============================================================================
方法名稱:Get_Color
引用相依:
方法描述:獲取元件的背景顏色。
============================================================================== }
function TCB_IMGPSScanX.Get_Color: OLE_COLOR;
begin
Result := OLE_COLOR(Color);
end;
{ ==============================================================================
方法名稱:Get_DockSite
引用相依:
方法描述:獲取元件的 DockSite 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_DockSite: WordBool;
begin
Result := DockSite;
end;
{ ==============================================================================
方法名稱:Get_DoubleBuffered
引用相依:
方法描述:獲獲取元件的 DoubleBuffered 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_DoubleBuffered: WordBool;
begin
Result := DoubleBuffered;
end;
{ ==============================================================================
方法名稱:Get_DropTarget
引用相依:
方法描述:獲取元件的 DropTarget 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_DropTarget: WordBool;
begin
Result := DropTarget;
end;
{ ==============================================================================
方法名稱:Get_Enabled
引用相依:
方法描述:獲取元件的啟用狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_Enabled: WordBool;
begin
Result := Enabled;
end;
{ ==============================================================================
方法名稱:Get_ExplicitHeight
引用相依:
方法描述:獲取元件的明確高度。
============================================================================== }
function TCB_IMGPSScanX.Get_ExplicitHeight: Integer;
begin
Result := ExplicitHeight;
end;
{ ==============================================================================
方法名稱:Get_ExplicitLeft
引用相依:
方法描述:獲取元件的明確左座標。
============================================================================== }
function TCB_IMGPSScanX.Get_ExplicitLeft: Integer;
begin
Result := ExplicitLeft;
end;
{ ==============================================================================
方法名稱:Get_ExplicitTop
引用相依:
方法描述:獲取元件的明確頂座標。
============================================================================== }
function TCB_IMGPSScanX.Get_ExplicitTop: Integer;
begin
Result := ExplicitTop;
end;
{ ==============================================================================
方法名稱:Get_ExplicitWidth
引用相依:
方法描述:獲取元件的明確寬度。
============================================================================== }
function TCB_IMGPSScanX.Get_ExplicitWidth: Integer;
begin
Result := ExplicitWidth;
end;
{ ==============================================================================
方法名稱:Get_Font
引用相依:
方法描述:獲取元件的字型。
============================================================================== }
function TCB_IMGPSScanX.Get_Font: IFontDisp;
begin
GetOleFont(Font, Result);
end;
{ ==============================================================================
方法名稱:Get_HelpFile
引用相依:
方法描述:獲取元件的說明檔路徑。
============================================================================== }
function TCB_IMGPSScanX.Get_HelpFile: WideString;
begin
Result := WideString(HelpFile);
end;
{ ==============================================================================
方法名稱:Get_KeyPreview
引用相依:
方法描述:獲取元件的鍵盤預覽狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_KeyPreview: WordBool;
begin
Result := KeyPreview;
end;
{ ==============================================================================
方法名稱:Get_MouseInClient
引用相依:
方法描述:獲取滑鼠是否在元件內部區域。
============================================================================== }
function TCB_IMGPSScanX.Get_MouseInClient: WordBool;
begin
Result := MouseInClient;
end;
{ ==============================================================================
方法名稱:Get_ParentCustomHint
引用相依:
方法描述:獲取元件的 ParentCustomHint 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_ParentCustomHint: WordBool;
begin
Result := ParentCustomHint;
end;
{ ==============================================================================
方法名稱:Get_ParentDoubleBuffered
引用相依:
方法描述:獲取元件的 ParentDoubleBuffered 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_ParentDoubleBuffered: WordBool;
begin
Result := ParentDoubleBuffered;
end;
{ ==============================================================================
方法名稱:Get_PixelsPerInch
引用相依:
方法描述:獲取元件的 PixelsPerInch 設定。
============================================================================== }
function TCB_IMGPSScanX.Get_PixelsPerInch: Integer;
begin
Result := PixelsPerInch;
end;
{ ==============================================================================
方法名稱:Get_PopupMode
引用相依:
方法描述:獲取元件的彈出視窗模式。
============================================================================== }
function TCB_IMGPSScanX.Get_PopupMode: TxPopupMode;
begin
Result := Ord(PopupMode);
end;
{ ==============================================================================
方法名稱:Get_PrintScale
引用相依:
方法描述:獲取元件的列印縮放比例。
============================================================================== }
function TCB_IMGPSScanX.Get_PrintScale: TxPrintScale;
begin
Result := Ord(PrintScale);
end;
{ ==============================================================================
方法名稱:Get_Scaled
引用相依:
方法描述:獲取元件的 Scaled 縮放狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_Scaled: WordBool;
begin
Result := Scaled;
end;
{ ==============================================================================
方法名稱:Get_ScreenSnap
引用相依:
方法描述:獲取元件的 ScreenSnap 狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_ScreenSnap: WordBool;
begin
Result := ScreenSnap;
end;
{ ==============================================================================
方法名稱:Get_SnapBuffer
引用相依:
方法描述:獲取元件的 SnapBuffer 設定。
============================================================================== }
function TCB_IMGPSScanX.Get_SnapBuffer: Integer;
begin
Result := SnapBuffer;
end;
{ ==============================================================================
方法名稱:Get_UseDockManager
引用相依:
方法描述:獲取元件是否使用 Dock 管理。
============================================================================== }
function TCB_IMGPSScanX.Get_UseDockManager: WordBool;
begin
Result := UseDockManager;
end;
{ ==============================================================================
方法名稱:Get_Visible
引用相依:
方法描述:獲取元件的顯示狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_Visible: WordBool;
begin
Result := Visible;
end;
{ ==============================================================================
方法名稱:Get_VisibleDockClientCount
引用相依:
方法描述:獲取元件的可見 Dock 客戶端數量。
============================================================================== }
function TCB_IMGPSScanX.Get_VisibleDockClientCount: Integer;
begin
Result := VisibleDockClientCount;
end;
{ ==============================================================================
方法名稱:_Set_Font
引用相依:
方法描述:設定元件的字型。
============================================================================== }
procedure TCB_IMGPSScanX._Set_Font(var Value: IFontDisp);
begin
SetOleFont(Font, Value);
end;
{ ==============================================================================
方法名稱:mode1Click
引用相依:
方法描述:切換至檢視模式 0(單頁顯示),呼叫 GoViewMode 更新佈局,並隱藏 Panel14
控制面版。
============================================================================== }
procedure TCB_IMGPSScanX.mode1Click(Sender: TObject);
begin
VMode := 0;
GoViewMode;
//ScrollBar1Change(Self);
Panel14.Visible := False;
end;
{ ==============================================================================
方法名稱:mode2Click
引用相依:
方法描述:切換至檢視模式 1(兩頁顯示),呼叫 GoViewMode 更新佈局,並顯示 Panel14
控制面版。
============================================================================== }
procedure TCB_IMGPSScanX.mode2Click(Sender: TObject);
begin
VMode := 1;
GoViewMode;
//ScrollBar1Change(Self);
Panel14.Visible := True;
end;
{ ==============================================================================
方法名稱:mode3Click
引用相依:
方法描述:切換至檢視模式 2(多頁網格顯示),呼叫 GoViewMode 更新佈局,並觸發捲軸變
動以重新載入影像。
============================================================================== }
procedure TCB_IMGPSScanX.mode3Click(Sender: TObject);
begin
VMode := 2;
GoViewMode;
ScrollBar1Change(Self);
end;
{ ==============================================================================
方法名稱:mode4Click
引用相依:
方法描述:切換至檢視模式 3(自定義檢視模式),呼叫 GoViewMode 更新佈局,並觸發捲軸
變動以重新載入影像。
============================================================================== }
procedure TCB_IMGPSScanX.mode4Click(Sender: TObject);
begin
VMode := 3;
GoViewMode;
ScrollBar1Change(Self);
end;
{ ==============================================================================
方法名稱:Set_AlignWithMargins
引用相依:
方法描述:設定元件的 AlignWithMargins 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_AlignWithMargins(Value: WordBool);
begin
AlignWithMargins := Value;
end;
{ ==============================================================================
方法名稱:Set_AutoScroll
引用相依:
方法描述:設定元件的 AutoScroll 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_AutoScroll(Value: WordBool);
begin
AutoScroll := Value;
end;
{ ==============================================================================
方法名稱:Set_AutoSize
引用相依:
方法描述:設定元件的 AutoSize 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_AutoSize(Value: WordBool);
begin
AutoSize := Value;
end;
{ ==============================================================================
方法名稱:Set_AxBorderStyle
引用相依:
方法描述:設定元件的 AxBorderStyle 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_AxBorderStyle(Value: TxActiveFormBorderStyle);
begin
AxBorderStyle := TActiveFormBorderStyle(Value);
end;
{ ==============================================================================
方法名稱:Set_Caption
引用相依:
方法描述:設定元件的標題文字。
============================================================================== }
procedure TCB_IMGPSScanX.Set_Caption(const Value: WideString);
begin
Caption := TCaption(Value);
end;
{ ==============================================================================
方法名稱:Set_Color
引用相依:
方法描述:設定元件的背景顏色。
============================================================================== }
procedure TCB_IMGPSScanX.Set_Color(Value: OLE_COLOR);
begin
Color := TColor(Value);
end;
{ ==============================================================================
方法名稱:Set_DockSite
引用相依:
方法描述:設定元件的 DockSite 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_DockSite(Value: WordBool);
begin
DockSite := Value;
end;
{ ==============================================================================
方法名稱:Set_DoubleBuffered
引用相依:
方法描述:設定元件的 DoubleBuffered 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_DoubleBuffered(Value: WordBool);
begin
DoubleBuffered := Value;
end;
{ ==============================================================================
方法名稱:Set_DropTarget
引用相依:
方法描述:設定元件的 DropTarget 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_DropTarget(Value: WordBool);
begin
DropTarget := Value;
end;
{ ==============================================================================
方法名稱:Set_Enabled
引用相依:
方法描述:設定元件的啟用狀態。
============================================================================== }
procedure TCB_IMGPSScanX.Set_Enabled(Value: WordBool);
begin
Enabled := Value;
end;
{ ==============================================================================
方法名稱:Set_Font
引用相依:
方法描述:設定元件的字型。
============================================================================== }
procedure TCB_IMGPSScanX.Set_Font(const Value: IFontDisp);
begin
SetOleFont(Font, Value);
end;
{ ==============================================================================
方法名稱:Set_HelpFile
引用相依:
方法描述:設定元件的說明檔路徑。
============================================================================== }
procedure TCB_IMGPSScanX.Set_HelpFile(const Value: WideString);
begin
HelpFile := string(Value);
end;
{ ==============================================================================
方法名稱:Set_KeyPreview
引用相依:
方法描述:設定元件的鍵盤預覽狀態。
============================================================================== }
procedure TCB_IMGPSScanX.Set_KeyPreview(Value: WordBool);
begin
KeyPreview := Value;
end;
{ ==============================================================================
方法名稱:Set_ParentCustomHint
引用相依:
方法描述:設定元件的 ParentCustomHint 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_ParentCustomHint(Value: WordBool);
begin
ParentCustomHint := Value;
end;
{ ==============================================================================
方法名稱:Set_ParentDoubleBuffered
引用相依:
方法描述:設定元件的 ParentDoubleBuffered 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_ParentDoubleBuffered(Value: WordBool);
begin
ParentDoubleBuffered := Value;
end;
{ ==============================================================================
方法名稱:Set_PixelsPerInch
引用相依:
方法描述:設定元件的 PixelsPerInch 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_PixelsPerInch(Value: Integer);
begin
PixelsPerInch := Value;
end;
{ ==============================================================================
方法名稱:Set_PopupMode
引用相依:
方法描述:設定元件的彈出視窗模式。
============================================================================== }
procedure TCB_IMGPSScanX.Set_PopupMode(Value: TxPopupMode);
begin
PopupMode := TPopupMode(Value);
end;
{ ==============================================================================
方法名稱:Set_PrintScale
引用相依:
方法描述:設定元件的列印縮放比例。
============================================================================== }
procedure TCB_IMGPSScanX.Set_PrintScale(Value: TxPrintScale);
begin
PrintScale := TPrintScale(Value);
end;
{ ==============================================================================
方法名稱:Set_Scaled
引用相依:
方法描述:設定元件的 Scaled 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_Scaled(Value: WordBool);
begin
Scaled := Value;
end;
{ ==============================================================================
方法名稱:Set_ScreenSnap
引用相依:
方法描述:設定元件的 ScreenSnap 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_ScreenSnap(Value: WordBool);
begin
ScreenSnap := Value;
end;
{ ==============================================================================
方法名稱:Set_SnapBuffer
引用相依:
方法描述:設定元件的 SnapBuffer 屬性。
============================================================================== }
procedure TCB_IMGPSScanX.Set_SnapBuffer(Value: Integer);
begin
SnapBuffer := Value;
end;
{ ==============================================================================
方法名稱:Set_UseDockManager
引用相依:
方法描述:設定元件是否使用 Dock 管理。
============================================================================== }
procedure TCB_IMGPSScanX.Set_UseDockManager(Value: WordBool);
begin
UseDockManager := Value;
end;
{ ==============================================================================
方法名稱:Set_Visible
引用相依:
方法描述:設定元件的顯示狀態。
============================================================================== }
procedure TCB_IMGPSScanX.Set_Visible(Value: WordBool);
begin
Visible := Value;
end;
{ ==============================================================================
方法名稱:N1Click
引用相依:
方法描述:彈出對話框要求使用者輸入目標頁碼,呼叫 MoveImage 將當前顯示的影像移動
到指定的位置。
============================================================================== }
procedure TCB_IMGPSScanX.N1Click(Sender: TObject);
var
mp:string;
begin
mp := InputBox(_Msg('移動頁數'),_Msg('請輸入移入頁碼'),'');
if (mp <> '') then
begin
MoveImage(DisplayPath+NowDocDir+'\',strtoint(mp));
end;
end;
{ ==============================================================================
方法名稱:N51Click
引用相依:
方法描述:切換至檢視模式 4,呼叫 GoViewMode 更新佈局,並觸發捲軸變動以重新載入影
像。
============================================================================== }
procedure TCB_IMGPSScanX.N51Click(Sender: TObject);
begin
VMode := 4;
GoViewMode;
ScrollBar1Change(Self);
end;
{ ==============================================================================
方法名稱:Panel11DblClick
引用相依:
方法描述:Panel11 的連按兩下事件,目前實作已註解掉。
============================================================================== }
procedure TCB_IMGPSScanX.Panel11DblClick(Sender: TObject);
begin
// Button3.Visible := not Button3.Visible;
//Button4.Visible := not Button4.Visible;
//self.FCustDocYN := 'N';
end;
{ ==============================================================================
方法名稱:Panel1DblClick
引用相依:
方法描述:Panel1 的連按兩下事件,用於切換 Button1 與 Button2 的顯示狀態。
============================================================================== }
procedure TCB_IMGPSScanX.Panel1DblClick(Sender: TObject);
begin
Button1.Visible := not Button1.Visible;
Button2.Visible := not Button2.Visible;
end;
{ ==============================================================================
方法名稱:Panel9Resize
引用相依:
方法描述:當 Panel9 大小改變時,呼叫 GoViewMode 重新調整影像佈局。
============================================================================== }
procedure TCB_IMGPSScanX.Panel9Resize(Sender: TObject);
begin
GoViewMode;
end;
{ ==============================================================================
方法名稱:DocNoIsExistImg
引用相依:FileExists, LoadFromFile
方法描述:檢查指定的文件目錄路徑下是否存在影像檔案。首先讀取目錄中的 Context.da
t 檔案,接著遍歷清單中的所有檔名並檢查實際檔案是否存在。若發現任何一個
影像檔案存在則回傳 False(表示非空),否則回傳 True。
============================================================================== }
function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean;
var
i:integer;
ST:TStringList;
begin
Result:=False;
ST:=TStringList.Create;
if FileExists(DocNopath+'\Context.dat') then /////20190319 Hong 當有空的Docno目錄時會掛掉,增加這行
ST.loadFromfile(DocNopath+'\Context.dat');
for I := 0 to ST.Count - 1 do
begin
if ISExistImg(DocNopath+ST.Strings[i]) then
begin
Result:=False;
Exit;
Break;
end;
end;
Result:=True;
end;
{ ==============================================================================
方法名稱:_DelTreeForExistImg
引用相依:_DelTree
方法描述:存根方法,目前未包含具體實作邏輯。
============================================================================== }
procedure TCB_IMGPSScanX._DelTreeForExistImg(ASourceDir:String);
var
i:integer;
ST:TStringList;
begin
end;
{ ==============================================================================
方法名稱:ScrollBar1Change
引用相依:
方法描述:捲軸變動處理,目前實作已透過 Exit 暫時停用。
============================================================================== }
procedure TCB_IMGPSScanX.ScrollBar1Change(Sender: TObject);
begin
Exit;
If (TreeView1.Selected = MyTreenode1) or (TreeView1.Selected.ImageIndex = 6) Then
begin
view_image_FormCode(DisplayPath,'ShowAll',ScrollBar1.Position,1);
end
Else IF (TreeView1.Selected = MyTreenode2) then
begin
view_image_FormCode(DisplayPath,NowDocNo,ScrollBar1.Position,1);
end
Else if (TreeView1.Selected = MyTreenode3) then
begin
view_image_FormCode(DisplayPath,NowFormCode,ScrollBar1.Position,1);
end;
end;
{ ==============================================================================
方法名稱:ActiveFormKeyUp
引用相依:
方法描述:處理 ActiveForm 按鍵放開事件。當文字輸入框取得焦點且有選取影像時,攔截
上下方向鍵並將其轉化為 PriorPage 或 NextPage 翻頁操作,並同步滾動捲軸
。
============================================================================== }
procedure TCB_IMGPSScanX.ActiveFormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Edit1.Focused then
begin
if selectISB = nil then Exit;
if (Key =VK_UP) then
begin
PriorPage(SelectPage);
if (SelectISB.Parent.Top-4) < 0 then
scrollBox1.VertScrollBar.Position := scrollBox1.VertScrollBar.Position + SelectISB.Parent.Top-4;
//ISBClick(TImageScrollBox(FindComponent(ISBName+'1')));
end;
if (Key =VK_Down) then
begin
NextPage(SelectPage);
if SelectISB.Parent.Top+SelectISB.Parent.Height+4 > scrollBox1.Height then
ScrollBox1.VertScrollBar.Position := scrollBox1.VertScrollBar.Position + (SelectISB.Parent.Top+SelectISB.Parent.Height-ScrollBox1.Height+8);
//scrollBox1.VertScrollBar.ScrollPos := SelectISB.Parent.Top+SelectISB.Parent.Height;
//ISBClick(TImageScrollBox(FindComponent(ISBName+'2')));
end;
end;
end;
{ ==============================================================================
方法名稱:AddAttFileLBClick
引用相依:CopyFile, FileExists
方法描述:處理「加入附加電子檔」按鈕點擊。開啟檔案對話框選取多個 PDF 檔案,支援覆
蓋檢查。執行 CopyFile 將檔案複製到案件目錄下,並呼叫 SetAttContextList
更新附加檔案清單後載入顯示。
============================================================================== }
procedure TCB_IMGPSScanX.AddAttFileLBClick(Sender: TObject);
var
i : Integer;
Addfile : String;
begin
OpenDialog1.Filter := 'PDF files|*.pdf';
OpenDialog1.Options := [ofAllowMultiSelect];
if OpenDialog1.Execute then
begin
ShowText :=_Msg('檔案加入中,請稍候');
DataLoading(True,True);
for i := 0 to OpenDialog1.Files.Count - 1 do
begin
AddFile := HTTPEncode(UTF8Encode(ExtractFileName(OpenDialog1.Files.Strings[i])));
if FileExists(ImageSavePath+NowCaseno+'\'+AddFile) then
begin
if Messagedlg(Format(_Msg('%s己存在,是否覆蓋??'),[Addfile]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel Then
Continue;
SetAttContextList('D',-1,NowCaseno,AddFile);
end;
// AttFileGB.Visible := True; //附加電子檔窗 //20120207楊玉說不在這加電子檔先拿掉
// Splitter2.Visible := True;
CopyFile(Pchar(OpenDialog1.Files.Strings[i]),Pchar(ImageSavePath+NowCaseno+'\'+AddFile),False);
SetAttContextList('A',-1,NowCaseno,AddFile);
LoadAttFile(NowCaseno);
end;
end;
DataLoading(False,False);
end;
{ ==============================================================================
方法名稱:AddCredit1RGClick
引用相依:
方法描述:處理信用註記點擊,更新 Case_loandoc 狀態並寫入索引檔。
============================================================================== }
procedure TCB_IMGPSScanX.AddCredit1RGClick(Sender: TObject);
begin
if DisplayPath <> '' then
begin
Case AddCredit1RG.ItemIndex of
-1:Case_loandoc := '';
0:Case_loandoc := 'Y';
1:Case_loandoc := 'N';
end;
WriteCaseIndex(DisplayPath);
end;
end;
{ ==============================================================================
方法名稱:BtnMouseEnter
引用相依:
方法描述:當滑鼠進入按鈕區域時,顯示該按鈕的 Hint 文字提示。
============================================================================== }
procedure TCB_IMGPSScanX.BtnMouseEnter(Sender: TObject);
begin
AddToolTip(TBitBtn(Sender).Handle,nil,0,Pchar(TBitBtn(Sender).Hint),nil,0,0);
end;
{ ==============================================================================
方法名稱:Button3Click
引用相依:initkscan
方法描述:工程師測試用按鈕。用於顯示當前系統環境變數與參數狀態,包含伺服器 URL、
案件資訊、權限、DPI 設定及各類長度限制,最後重新載入影像檔案。
============================================================================== }
procedure TCB_IMGPSScanX.Button3Click(Sender: TObject);
begin
//Showmessage(CreateDocNo_Info(NowCaseNo)+#13+'******'+#13+CreateCustDocNo_Info(NowCaseNo));
//Showmessage(NowSelectFileList.Text);
//SetIn_WH_DocNo;
//CreateIn_WH(self.NowCaseno);
//Create_Cust_DocDir(NowCaseNo);
//Showmessage(self.GetDocNoDir(self.DisplayPath,'111'));
//Case2upload(NowCaseNo);
//mkdir(DisplayPath+'Test\');
//Download2Case(DisplayPath+'Upload\',DisplayPath+'Test\');
//CreateFormID_FormName(DisplayPath); //產生FormID_FormName.dat
//CreateDocNo_DocName(DisplayPath); //產生DocNo_Name.dat
//Showmessage(CreateDocNo_Info(DisplayPath)); //產生 Docno,份數,頁數;Docno,份數,頁數 的回傳字串
//lb1.Caption:='AAAAAAAAAAA';
//Showmessage(CreateDocnoFrom_Info(NowCaseno));
//Showmessage(self.CreateCustDocNoFrom_Info(NowCaseno));
//ShowMessage('FMaxUploadSize='+FMaxUploadSize);
//initkscan;
showmessage('FUrl='+FUrl+#10#13+
'FCaseID='+FCaseID+#10#13+
'FMode='+FMode+#10#13+
'FModeName='+FModeName+#10#13+
'FWork_no='+FWork_no+#10#13+
'FUserID='+FUserID+#10#13+
'FUserName='+FUserName+#10#13+
'FUserUnit='+FUserUnit+#10#13+
'FData='+FData+#10#13+
'FVerify='+FVerify+#10#13+
'FReWrite='+FReWrite+#10#13+
'FLanguage='+FLanguage+#10#13+
'FLoanDoc_Value='+FLoanDoc_Value+#10#13+
'FLoanDoc_Enable='+FLoanDoc_Enable+#10#13+
'FUseProxy='+FUseProxy+#10#13+
'FC_DocNoList='+FC_DocNoList+#10#13+
'FC_DocNameList='+FC_DocNameList+#10#13+
'FFixFileList='+FFixFileList+#10#13+
'FIs_In_Wh='+FIs_In_Wh+#10#13+
'FOldCaseInfo='+FOldCaseInfo+#10#13+
'FPrintyn='+FPrintyn+#10#13+
'FIs_OldCase='+FIs_OldCase+#10#13+
'FCustDocYN='+FCustDocYN);
ShowMessage('FImgDPI='+IntToStr(FImgDPI)+#10#13+
'FScanColor='+ IntToStr(FScanColor)+#10#13+
'FFileSizeLimit='+ IntToStr(FFileSizeLimit) +#10#13+
'FCaseNoLength='+ IntToStr(FCaseNoLength) +#10#13+
'FImgDelete='+ FImgDelete+#10#13+
'FIsExternal='+ FIsExternal+#10#13+
'FWH_category='+FWH_category+
'FCheck_main_form='+ FCheck_main_form+#10#13+
'FMaxUploadSize='+FMaxUploadSize);
//FImgDelete:='Y';
LoadImgFile;
{ ShowMessage('UpLPoint='+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+#10#13+
'UpRPoint='+IntToStr(UpRPoint.X)+','+IntToStr(UpRPoint.Y)+#10#13+
'DownLPoint='+IntToStr(DownLPoint.X)+','+IntToStr(DownLPoint.Y)+#10#13+
'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y));
}
end;
{ ==============================================================================
方法名稱:Button4Click
引用相依:
方法描述:工程師測試用按鈕。用於傾印內部多個 TStringList 與 Record 資料,包含 OM
R 錯誤資訊、表單與檢核規則清單、範本與已存在影像清單等,用於除錯。
============================================================================== }
procedure TCB_IMGPSScanX.Button4Click(Sender: TObject);
var
i:integer;
str:String;
begin
//Showmessage(self.Doc_Inf_List.Text);
//LoadImgFile;
//LoadImgFile1;
//ISB1.MouseMode:=mmAmplifier;
str:='';
for I := 1 to 11 do // 看 OMRErrInfo 的內容
begin
str:=str+BoolToStr(OMRErrInfo[i].Display,true)+','
+BoolToStr(OMRErrInfo[i].Ignore,true)+','+OMRErrInfo[i].Info+','
+OMRErrInfo[i].Mode+#10#13;
end;
ShowMessage('OMRErrInfo='+str);
ShowMessage('Doc_Inf_List='+Doc_Inf_List.Text);
ShowMessage('DM_FORM_INF_List='+DM_FORM_INF_List.Text) ;
ShowMessage('FORM_INF_List='+FORM_INF_List.Text) ;
ShowMessage('CHECK_RULE_INF_List='+CHECK_RULE_INF_List.Text) ;
ShowMessage('MEMO_INF_List='+MEMO_INF_List.Text) ;
ShowMessage('WORK_INF_List='+WORK_INF_List.Text) ;
ShowMessage('LASTEST_FORM_INF_List='+LASTEST_FORM_INF_List.Text) ;
ShowMessage('SampleFormIDList='+SampleFormIDList.Text);
ShowMessage('ExistImgList='+ExistImgList.Text);
ShowMessage('LastInitFormidList='+LastInitFormidList.Text);
ShowMessage('IN_WH_DocNoList='+IN_WH_DocNoList.Text);
// SampleFormIDList.Add('31A00101011706A');
// SampleFormIDList.Add('31A00101021706A');
// SampleFormIDList.Add('31A00101031706A');
end;
{ ==============================================================================
方法名稱:Button5Click
引用相依:IIS_Ftp, SetFtpInfo
方法描述:測試 FTP 上傳功能。連線 FTP 後嘗試將特定的 PDF 檔案上傳至伺服器路徑。
============================================================================== }
procedure TCB_IMGPSScanX.Button5Click(Sender: TObject);
begin
GetftpInfo(NowCaseno,'upload');
SetFtpInfo;
IIS_Ftp.FtpsConnect;
IIS_Ftp.FtpsToMain(FFtpExtraPath,NowCaseno+'.pdf','d:\1.pdf',display1);
end;
{ ==============================================================================
方法名稱:Button6Click
引用相依:FJpgCompression, IIS_Ftp, Rotate, Scanner, SetFtpInfo
方法描述:測試 FTP 下載功能。連線 FTP 後嘗試從伺服器下載 ZIP 案件檔至本地。
============================================================================== }
procedure TCB_IMGPSScanX.Button6Click(Sender: TObject);
begin
GetftpInfo(NowCaseno,'download');
SetFtpInfo;
IIS_Ftp.FtpsConnect;
IIS_Ftp.FtpsCWD(IIS_Ftp.FtpPath);
IIS_Ftp.FtpsReceive(NowCaseNo+'.zip','d:\'+NowCaseNo+'.zip');
end;
{ ==============================================================================
方法名稱:ExportBtClick
引用相依:En_DecryptionStr_Base64, FileExists, SaveToFile, dnFile, dnFile_Get
方法描述:處理「匯出授權檔」按鈕點擊。透過 HTTPS 下載掃瞄與檢視用的 .lic 授權檔案
。將授權檔連同加密的 mps.dat 檔案打包成帶有密碼保護的 mps.zip 壓縮包,
完成後清理暫存檔並提示路徑。
============================================================================== }
procedure TCB_IMGPSScanX.ExportBtClick(Sender: TObject);
var
SendData : String;
EnCodeDateTime : String;
S : TStringlist;
SFileName,VFileName : String;
begin
SFileName := En_DecryptionStr_Base64('E','MPSLIC_SCAN.lic','9338430');
VFileName := En_DecryptionStr_Base64('E','MPSLIC_VIEW.lic','9338430');
IIS_File2Web.S_LicEnName := SFileName;
IIS_File2Web.V_LicEnName := VFileName;
/////下載MPSLIC_SCAN.lic //////
EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
//SendData := 'checktime='+EnCodeDateTime+'&workno=CW&formid=MPSLIC_SCAN.lic'+'&mode=sample';
//if not dnFile(HTTPSClient,Furl,'servlet/CWC03',SendData,LngPath+SFileName,FReWrite,Memo1,False,DownImgStatus) then
SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_SCAN.lic';
if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+SFileName,FReWrite,Memo1,False,DownImgStatus) then
begin
Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
Exit;
end;
/////下載MPSLIC_SCAN.lic /////
/////下載MPSLIC_VIEW.lic //////
EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
//SendData := 'checktime='+EnCodeDateTime+'&workno=CW&formid=MPSLIC_VIEW.lic'+'&mode=sample'; //這裡改成必傳CW 20121212
//if not dnFile(HTTPSClient,Furl,'service/slic/SLIC04/sample',SendData,LngPath+VFileName,FReWrite,Memo1,False,DownImgStatus) then
SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_VIEW.lic';
if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+VFileName,FReWrite,Memo1,False,DownImgStatus) then
begin
Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
Exit;
end;
/////下載MPSLIC_VIEW.lic /////
////壓zip/////
S := TStringlist.Create;
try
S.Add(En_DecryptionStr_Base64('E',GetDate,'9338430'));
S.Add(SFileName);
S.Add(VFileName);
S.SaveToFile(LngPath+'mps.dat');
S.Clear;
S.Add(LngPath+'mps.dat');
S.Add(LngPath+SFileName);
S.Add(LngPath+VFileName);
if FileExists(LngPath+'mps.zip') then
DeleteFile(LngPath+'mps.zip');
ExecuteZip_Pwd(LngPath+'mps.zip',LngPath,S,False,False,'9338430');
finally
S.Free;
DeleteFile(LngPath+SFileName);
DeleteFile(LngPath+VFileName);
DeleteFile(LngPath+'mps.dat');
end;
////壓zip//////
Showmessage(_Msg('匯出完成,匯出檔案:')+LngPath+'mps.zip');
end;
{ ==============================================================================
方法名稱:ImportBtClick
引用相依:En_DecryptionStr_Base64, FileExists, LoadFromFile, RenameFile, Str2D
ir, _DelTree, upFile
方法描述:處理「匯入授權檔」按鈕點擊。選取 mps.zip 授權包後進行解壓與過期驗證。驗
證通過後對授權檔執行重新命名,並透過 upFile 函式逐一上傳至伺服器範本
目錄,過程中會嚴格檢查 Session 與回傳狀態。
============================================================================== }
procedure TCB_IMGPSScanX.ImportBtClick(Sender: TObject);
var
SendData : String;
EnCodeDateTime : String;
S : TStringlist;
SFileName,VFileName : String;
OpenDialog1 : TOpenDialog;
ZipPath : String;
ZipFile,ZipName : String;
LicName : String;
i : Integer;
begin
OpenDialog1 := TOpenDialog.Create(self);
S := TStringlist.Create;
try
OpenDialog1.Filter := 'Zip files (*.zip)|*.ZIP';
if OpenDialog1.Execute then
begin
ZipFile:= ExtractFileName(OpenDialog1.FileName);
ZipName := Copy(ZipFile,1,length(ZipFile)-length(ExtractFileExt(OpenDialog1.FileName)));
ZipPath := LngPath+ZipName+'\';
str2dir(ZipPath);
if not ExecuteUnZip_Pwd(OpenDialog1.FileName,ZipPath,False,'9338430') then
Showmessage(_Msg('無法解壓縮'));
if not FileExists(ZipPath+'mps.dat') then
begin
Showmessage(_Msg('格式不符,無法匯入'));
Exit;
end;
S.LoadFromFile(ZipPath+'mps.dat');
if (En_DecryptionStr_Base64('D',S.Strings[0],'9338430')<> ServerDate) then
begin
Showmessage(_Msg('檔案過期,無法匯入'));
Exit;
end;
for i := 1 to S.Count -1 do
begin
LicName := En_DecryptionStr_Base64('D',S.Strings[i],'9338430');
RenameFile(ZipPath+S.Strings[i],ZipPath+LicName);
if (LicName = 'MPSLIC_SCAN.lic') or (LicName = 'MPSLIC_VIEW.lic') then
/////上傳MPSLICXXXX.lic ////
//if not upFile(HTTPSClient,FUrl,'servlet/CWC04','formid='+LicName+'@workno=CW@mode=sample','file',ZipPath+LicName,FReWrite,Memo1,False) then
//begin
SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file_name='+LicName;
if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',ZipPath+LicName,FReWrite,Memo1,False) then
begin
Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
DataLoading(False,False);
Exit;
end;
if memo1.Lines.Strings[0] = '1' then
begin
Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
DataLoading(False,False);
Exit;
end
Else if Pos('',Memo1.Lines.Text) > 0 then
begin
Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
DataLoading(False,False);
Exit;
end;
/////上傳MPSLICXXXX.lic /////
end;
end;
Finally
OpenDialog1.Free;
S.Free;
_DelTree(ZipPath);
end;
Showmessage(_Msg('匯入完成'));
end;
{ ==============================================================================
方法名稱:HTTPSClientCertificateValidate
引用相依:HTTPSClientCertificateValidate
方法描述:HTTPS 用戶端憑證驗證回呼函數,預設直接將 Validate 設為 True,以接受所
有伺服器憑證。
============================================================================== }
procedure TCB_IMGPSScanX.HTTPSClientCertificateValidate(Sender: TObject;
X509Certificate: TElX509Certificate; var Validate: Boolean);
begin
Validate := True;
end;
{ ==============================================================================
方法名稱:HTTPSClientRedirection
引用相依:
方法描述:處理 HTTPS 客戶端的重導向事件,目前為空實作。
============================================================================== }
procedure TCB_IMGPSScanX.HTTPSClientRedirection(Sender: TObject;
const OldURL: string; var NewURL: string; var AllowRedirection: Boolean);
begin
AllowRedirection := True;
end;
{ ==============================================================================
方法名稱:EnableImage
引用相依:
方法描述:啟用滑鼠工具列功能,更新按鈕圖示並切換滑鼠模式。
============================================================================== }
procedure TCB_IMGPSScanX.EnableImage(v:integer;Sender : TObject);
var bmp : Tbitmap;
begin
DesableImage;
bmp := TBitmap.Create;
try
ImageList3.GetBitmap(v,bmp);
TBitBtn(Sender).Glyph.Assign(bmp);
finally
bmp.Free;
end;
ViewMouseMode(v);
end;
{ ==============================================================================
方法名稱:DesableImage
引用相依:
方法描述:停用所有工具列功能。重置點選狀態,將所有功能按鈕(FC0-FC6)圖示切換為灰
階,並將所有影像捲軸盒的滑鼠模式切換回一般使用者模式。
============================================================================== }
procedure TCB_IMGPSScanX.DesableImage;
var bmp : Tbitmap;
i : integer;
begin
NowClick := -1;
bmp := Tbitmap.Create;
try
For i:= 0 to 6 do
begin
ImageList4.GetBitmap(i,bmp);
TBitBtn(FindComponent('FC'+IntToStr(i))).Glyph.Assign(bmp);
bmp.Width:=0;
bmp.Handle:=0;
end;
finally
bmp.Free;
end;
ViewMouseMode(NowClick);
end;
{ ==============================================================================
方法名稱:ViewMouseMode
引用相依:
方法描述:設定全域的滑鼠作業模式。根據參數對應至放大鏡、縮放、拖曳、旋轉或刪除等模
式,並同步更新所有影像捲軸盒(ISB1-ISB8)的屬性,確保行為一致。
============================================================================== }
Procedure TCB_IMGPSScanX.ViewMouseMode(v:Integer);
var
i : Integer;
Md : TMouseMode;
ISB : TImageScrollBox;
begin
//ShowMessage(IntToStr(v));
case v of
-1 : Md := TMouseMode(mmUser);
0 : Md := TMouseMode(mmAmplifier);
1 : Md := TMouseMode(mmZoom);
2 : Md := TMouseMode(mmDrag);
3 : Md := TMouseMode(mmR270);
4 : Md := TMouseMode(mmR180);
5 : Md := TMouseMode(mmR90);
6 : Md := TMouseMode(mmDelete);
end;
for i := 1 to 8 do
begin
ISB := TImageScrollBox(FindComponent('ISB'+inttostr(i)));
ISB.MouseMode := TMouseMode(Md);
//Label3.Caption:='v='+IntToStr(v)+' time'+FormatDateTime('yyyy/mm/dd HH:MM:SS', now);
end;
end;
{ ==============================================================================
方法名稱:GoViewMode
引用相依:
方法描述:依檢視模式索引 VMode,呼叫 DisplayMode 來調整佈局。
============================================================================== }
Procedure TCB_IMGPSScanX.GoViewMode;
begin
case VMode of
0: DisplayMode(VMode,1,1,Panel9);
1: DisplayMode(VMode,1,1,Panel9);
2: DisplayMode(VMode,2,2,Panel9);
3: DisplayMode(VMode,2,3,Panel9);
4: DisplayMode(VMode,2,4,Panel9);
end;
end;
{ ==============================================================================
方法名稱:DisplayMode
引用相依:
方法描述:調整影像視窗的網格佈局(1x1, 2x2 等)。隱藏所有影像面板後,根據行數與列
數計算面板寬高與位置,重新排列並顯示。同時調整標記框 Shape1 的大小,最
後更新模式圖示並初始化首個視窗。
============================================================================== }
Procedure TCB_IMGPSScanX.DisplayMode(index,H_Count,W_Count:Integer;BasePanel:TPanel);
Var
W,H,T,L:Integer;
i,n,Count: Integer;
Pl :TPanel;
bmp : TBitmap;
begin
for i := 1 to 8 do
begin
TPanel(Findcomponent('imgp'+inttostr(i))).Visible := False;
end;
W := Round((BasePanel.Width - ((W_Count+1) * Seg)) / W_Count);
H := Round((BasePanel.Height -((H_Count+1) * Seg)) / H_Count);
Count := 1;
for i := 1 to H_Count do
begin
T := i * Seg + H * (i-1);
for n := 1 to W_Count do
begin
L := n * Seg + W * (n-1);
Pl := TPanel(Findcomponent('imgp'+inttostr(Count)));
Pl.Visible := True;
Pl.Left := L;
Pl.Top := T;
Pl.Width := W;
Pl.Height := H;
inc(Count);
end;
end;
Shape1.Width := W + (Seg * 2);
Shape1.Height := H + (Seg * 2);
Shape1.Visible := True;
bmp := Tbitmap.Create;
try
ImageList2.GetBitmap(index,bmp);
ViewModeBtn.Glyph.Assign(bmp);
finally
bmp.Free;
end;
ISB1Click(ISB1);
end;
{ ==============================================================================
方法名稱:CheckRequiredColumnValues
引用相依:
方法描述:檢查特定業務邏輯下的必填欄位。針對特定的 workno 與案號格式(caseno[9])
判斷是否符合要求。
============================================================================== }
function TCB_IMGPSScanX.CheckRequiredColumnValues(workno, caseno:String): Boolean;
begin
//
Result:=False;
if (workno='HLN') and (caseno[9]='3') then
Result:=True;
if (workno='HLN') and (caseno[9]='4') then
Result:=True;
end;
{ ==============================================================================
方法名稱:CaseReSize
引用相依:FileExists, ImageReSize_FormID, ImageResize, LoadFromFile
方法描述:對案件執行影像縮放處理。清空舊有的檢核與定位錯誤記錄,隨後遍歷影像清單
,對每個檔案執行 ImageReSize_FormID 處理。
============================================================================== }
Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //案件的影像縮放
var
S : TStringlist;
FileName : String;
i : Integer;
begin
{if FileExists(ImageSavePath+CaseID+'\ReSize.dat') then
DeleteFile(ImageSavePath+CaseID+'\ReSize.dat');}
if FileExists(ImageSavePath+CaseID+'\Upload\AnchorError.dat') then
DeleteFile(ImageSavePath+CaseID+'\Upload\AnchorError.dat');
S := TStringlist.Create;
try
S.LoadFromFile(ImageSavePath+CaseID+'\Upload\Context.dat');
For i := 0 to S.Count -1 do
begin
FileName := S.Strings[i];
ImageReSize_FormID(CaseID,FileName); //依十字定位點做縮放
end;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:TransCaseID
引用相依:CopyFile, FileExists, FindFirst, FtpCaseComplete, IIS_Ftp, LoadFromF
ile, SetFtpInfo, _DelTree, upFile
方法描述:傳送案件核心程序。包含排序影像、產生描述檔(FormID/DocNo對照、OMR資訊、附
件狀態等)、建立 ZIP 壓縮包(含主圖與遮罩)並檢查大小。最後根據 HTTP 或 F
TP 模式上傳至伺服器。上傳完成後針對異動模式處理舊件引入,並在最後清理
本地暫存目錄。
============================================================================== }
Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件
Var
i,n,v: Integer;
ZipFileList : TStringlist;
UpFormID:String;
pages : Integer;
TransName : String;
MaskPath : String;
HaveMask : Boolean;
S : String;
SendData:String;
Doc_Data,Doc_Data1 : String;
In_Doc1,In_Doc2 : String;
AttachYN : String; //是否有附件 Y:有 N:沒有
ST1,ST2,ST3:TStringList;
str1,str2:String;
must_formidStr :string;
last_add_formidstr :string;
ScanListStr:String;
casepath:String;
filesizeInt:integer;
case_page:string;
Fname:String;
FileRec:TSearchrec;
begin
Result := True;
TransName := CaseID;
MaskPath := Path+'MaskImg\';
if fileExists(Path+'Context.dat') then
begin
ContextList.LoadFromFile(Path+'Context.dat');
Context_DocnoList.LoadFromFile(Path+'Context_DocNo.dat');
end;
if FileExists(Path+'CustomDocNo.dat') then
Cust_DocNoList.LoadFromFile(Path+'CustomDocNo.dat');
Pages := ContextList.Count;
case_page:=IntToStr(pages);
if (FMode = 'NSCAN') or (FMode = 'ESCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'RSCAN') then
begin
//Showmessage('1');
UpformID := GetCaseFormID(Path);
{if UpformID = '' then //20131213 yuu說不管主form
begin
Showmessage(_msg('取不到主FormID!!'));
Result := False;
DataLoading(False,False);
Exit;
end;}
end;
CaseResort2Scanlist(Path); //檔名照設定排序產生scanlist.dat
//CaseResort(Path); //檔名照設定排序
CreateFormID_FormName(Path,CaseID); //產生FormID_FormName.dat
CreateDocNo_DocName(Path,CaseID); //產生DocNo_Name.dat
Doc_Data := CreateDocNo_Info(CaseID); //產生保管袋文件 Docno,份數,頁數;Docno,份數,頁數 的回傳字串
Doc_Data1 := CreateCustDocNo_Info(CaseID); //產生自定文件 Docname,份數,頁數;Docno,份數,頁數 的回傳字串
In_Doc1 := CreateDocnoFrom_Info(CaseID); //產生被引進的保管袋文件資訊 Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
In_Doc2 := CreateCustDocNoFrom_Info(CaseID); //產生被引進的自定文件資訊 Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號
AttachYN := CreateAttach_Info(CaseID); //是否還有附件 Y:有 N:沒有
ReadCaseIndex(Path);
//LoanDoc := 'Y';
//產生遮罩影像
// if FWork_No = 'CW' then
// HaveMask := Case2Mask(Path,MaskPath);
//產生遮罩影像
// S := S +#13+'5-->'+ Timetostr(now);
///////必要formid 20170315 start //////////////////////////////
must_formidStr:='';
last_add_formidstr:='';
ST1:=TStringList.Create;
ST1.LoadFromFile(path+'FormCode_Name.dat');
//ShowMessage(ST1.Text);
//ShowMessage(LastInitFormidList.Text);
ST2:=TStringList.Create;
ST3:=TStringlist.Create;
for I := 0 to ST1.Count - 1 do
begin
if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-1) then
begin
str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1);
ST2.Add(str1);
must_formidStr:= must_formidStr+str1+'@#,';
end;
end;
must_formidStr:=Copy(must_formidStr,1,Length(must_formidStr)-3) ;
//ShowMessage('must_formidStr='+must_formidStr);
//ShowMessage('AST2='+ST2.Text);
for I := 0 to LastInitFormidList.Count - 1 do
begin
if ST2.IndexOf(LastInitFormidList.Strings[i]) <> -1 then
begin
ST2.Delete(ST2.IndexOf(LastInitFormidList.Strings[i]));
end;
end;
//ShowMessage('BST2='+ST2.Text);
for I := 0 to ST2.Count - 1 do
begin
last_add_formidstr:=last_add_formidstr+ST2.Strings[i]+'@#,';
end;
last_add_formidstr:=Copy(last_add_formidstr,1,Length(last_add_formidstr)-3) ;
ST3.LoadFromFile(path+'scanlist.dat');
for I := 0 to ST3.Count - 1 do
begin
if ScanListStr = '' then
ScanListStr := FileName2FormCode(ST3.Strings[i])
else
ScanListStr := Format('%s,%s',[ScanListStr,FileName2FormCode(ST3.Strings[i])]);
end;
ST1.Free;
ST2.Free;
ST3.Free;
//ShowMessage('last_add_formidstr='+last_add_formidstr);
///////必要formid 20170315 end //////////////////////////
///保留外部影像 start///////////////////////////////
casepath:= Copy(Path,1,pos('Upload',path)-1);
//ShowMessage('casepath='+casepath);
//FIsExternal:='Y';
if (FMode='ESCAN') and (FIsExternal='Y') then
begin
if FileExists(casepath+'Download\FirstImg.zip') then
begin
CopyFile(PWChar(casepath+'Download\FirstImg.zip'),PWChar(path+'FirstImg.zip'),false);
end
else
begin
CopyFile(PWChar(casepath+'Download\'+CaseID+'.zip'),PWChar(path+'FirstImg.zip'),false);
end;
end;
///保留外部影像 end///////////////////////////////
//file_size 計算 就先不做 20170316
filesizeInt:=0;
//////壓檔/////
ZipMainFile(Path,Path,'Img.zip');
if HaveMask then
ZipMaskFile(Path,MaskPath,Path,'MaskImg.zip'); //有遮罩設定的才產生
/////壓檔////
///檢查上傳的zip大小////
FName :=Path+ 'Img.zip';
FindFirst(FName, faAnyfile, FileRec);
//FMaxUploadSize
//ShowMessage(IntToStr(FileRec.Size));
//Result:=False;
//exit; //目前上傳檔案大小為xxMB,已超過50MB,無法上傳 %.3f ,[FileRec.Size / 1048576]
If FileRec.Size > StrtoInt(FMaxUploadSize) * 1048576 Then // 檢查檔案大小
Begin
ShowMessage(Format(_Msg('%s目前上傳檔案大小為%.3fMB,已超過%sMB,無法上傳'),[caseid,FileRec.Size / 1048576,FMaxUploadSize]));
//ShowMessage(Format('%s目前上傳檔案大小為%.3fMB,已超過'+FMaxUploadSize+'MB,無法上傳',[caseid,FileRec.Size / 1048576]) );
FindClose(FileRec);
Result := False;
Exit;
End;
FindClose(FileRec);
///檢查上傳的zip大小////
//ShowMessage('last_add_formidstr='+last_add_formidstr);
if not GetftpInfo(CaseID,'upload') then //取案件上傳方式
begin
//Showmessage(_Msg()Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+'.');
DownFileErrStr := _Msg('取案件上傳資訊失敗!!')+HttpErrStr;
Result := False;
Exit;
end;
SendData:='data='+HTTPEncode(UTF8Encode(FData))
+'&verify='+FVerify
+'&form_id='+UpformID
+'&loan_doc='+Case_loandoc
+'&case_no='+TransName
+'&doc_data='+HTTPEncode(UTF8Encode(Doc_Data))
+'&doc_data1='+HTTPEncode(UTF8Encode(Doc_Data1))
+'&attach='+AttachYN
+'&case_page='+case_page
+'&file_size='+IntToStr(filesizeInt)
+'&must_formid='+must_formidStr //擁有的 formid
+'&last_add_formid='+last_add_formidstr //當次新加的 formid
+'&form_code='+ScanListStr //scanlist.dat 表單代號
+'&ftp_image_path='+FFtpExtraPath //加傳FTP目錄 HTTP上傳時會是空白
+'&in_doc1='+HTTPEncode(UTF8Encode(In_Doc1))
+'&in_doc2='+HTTPEncode(UTF8Encode(In_Doc2));
case TransMode of
tsHttp :
begin
////上傳/////
ShowText := CaseID+_Msg('資料上傳中(Http),請稍候');
DataLoading(True,True);
if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/caseupload',SendData,'file',Path+'Img.zip',FReWrite,Memo1,False) then
begin
Showmessage(Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+'.');
Result := False;
Exit;
end;
if memo1.Lines.Strings[0] = '1' then
begin
Showmessage(Format(_Msg('')+_Msg(''),[CaseID])+memo1.Lines.Strings[1]+'。');
Result := False;
Exit;
end
Else if Pos('',Memo1.Lines.Text) > 0 then
begin
Showmessage(Format(_Msg('')+_Msg('')+_Msg('閒置過久或被登出,請重新登入'),[CaseID]));
Result := False;
Exit;
end;
////上傳////
end;
tsFtp :
begin
ShowText := CaseID+_Msg('資料上傳中(Ftp),請稍候');
DataLoading(True,True);
SetFtpInfo;
try
if not IIS_Ftp.FtpsConnect then
begin
Showmessage(Format('無法連上Ftp主機,錯誤原因:%s',[FtpErrReason]));
Result := False;
Exit;
end;
if not IIS_Ftp.FtpsToMain(FFtpExtraPath,CaseID+'.zip',Path+'Img.zip',display1) then
begin
Showmessage(Format(_msg('上傳案件(%s)時,發生錯誤,錯誤原因:%s'),[CaseID,FtpErrStr]));
Result := False;
Exit;
end;
if not FtpCaseComplete(SendData) then //Ftp上傳後通知完成
begin
Showmessage(Format(_Msg('通知案件(%s)Ftp上傳完成時,發生錯誤!!'),[CaseID])+HttpErrStr);
Result := False;
Exit;
end;
finally
IIS_Ftp.FtpsClose;
end;
end;
end;
if FMode = 'ESCAN' then //上傳舊件引入檔案 //20140616 原本先搬舊件再搬新件,改為先搬新件再搬舊件
begin
if not TransOldCaseFile(ImageSavePath+CaseID+'\') then
begin
Result := False;
Exit;
end;
end;
// 呼叫Server完成 /////
{If not CaseComplete(Path,CaseID,MainCase) Then
begin
Showmessage(_Msg('通知案件傳送完成時,網路發生錯誤!!')+HttpErrStr);
DataLoading(False,False);
Result := False;
Exit;
end; }
/// 呼叫Server完成////
////刪檔////
//_DelTree(Path); //會只刪TransPath
//ShowMessage('STOP');
_DelTree(ImageSavePath+CaseID);
SetCaseList('D',-1,CaseID);
////刪檔////
end;
{ ==============================================================================
方法名稱:NewTreeNodeRefresh
引用相依:
方法描述:更新樹狀結構根節點文字,顯示總案件筆數與總頁數。
============================================================================== }
Procedure TCB_IMGPSScanX.NewTreeNodeRefresh;
var
v : Integer;
begin
//v := Pos('-',NewTreeNode.Text);
//NewTreeNode.Text := Copy(NewTreeNode.Text,1,v-1)+'-共'+inttostr(NewTreeNode.Count)+'筆';
GetCase_PageCount(CaseCount,PageCount);
v := Pos('-',NewTreeNode.Text);
NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
end;
{ ==============================================================================
方法名稱:MyTreeNode1Refresh
引用相依:
方法描述:更新樹狀結構案件層級節點文字,顯示該層下的項目數量。
============================================================================== }
Procedure TCB_IMGPSScanX.MyTreeNode1Refresh;
var
v : Integer;
begin
v := Pos('-',MyTreeNode1.Text);
MyTreeNode1.Text := Format(_Msg('%s-%d筆'),[Copy(MyTreeNode1.Text,1,v-1),MyTreeNode1.Count]);
end;
{ ==============================================================================
方法名稱:MyTreeNode2ReFresh
引用相依:
方法描述:重新整理並繪製指定案件的文件層級樹狀結構。
============================================================================== }
Procedure TCB_IMGPSScanX.MyTreeNode2ReFresh(CaseID:String);
var
P : Integer;
begin
//p:= ContextList.Count;
//MytreeNode1.Text := Format(_Msg('%s-%d頁'),[CaseID,p]);
DrawDocItem2(MytreeNode1,CaseID);
//DrawDocItem(MytreeNode1,FORM_INF_List,CaseID);
end;
{ ==============================================================================
方法名稱:MyTreeNode3ReFresh
引用相依:
方法描述:重新整理並繪製指定案件的表單層級樹狀結構。
============================================================================== }
Procedure TCB_IMGPSScanX.MyTreeNode3ReFresh(CaseID:String);
begin
//DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID); //201408280改
DrawDocItem2(MytreeNode1,CaseID);
//DrawDocItem(MytreeNode1,FORM_INF_List,CaseID);
end;
{ ==============================================================================
方法名稱:Node3FormID
引用相依:
方法描述:從樹狀結構節點 3(表單層)的文字中解析並提取表單 ID(FormID)。
============================================================================== }
Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String; //MyTreeNode3取FormCode出來
var
v,v1,v2 : Integer;
begin
v := Pos('{',Node3.Text);
v1 := Pos('}',Node3.Text);
v2 := Posend('-',Node3.Text);
Result := Copy(Node3.Text,v+1,v1-v-1);
IF v1 = 0 Then
begin
Result := '';
end;
end;
{ ==============================================================================
方法名稱:GetNode2Name
引用相依:CopyFile, DeleteDocNoFile, DirectoryExists, En_DecryptionStr_Base64,
FileExists, LoadFromFile, SaveToFile, Str2Dir, dnFile
方法描述:提取文件層級節點的識別名稱字串,用於記錄與恢復節點選取狀態。
============================================================================== }
Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String; //取MyTreeNode2的識別字出來(記之前點選用)
var
v : Integer;
begin
v := Posend('-',Node2.Text);
Result := Copy(Node2.Text,1,v-1);
end;
{Function TCB_IMGPSScanX.Down_Replace_Img(SPath,DPath,CaseID:String):Boolean;
var
EnCodeDateTime : String;
DownUrl : String;
SC,Main_C : TStringlist;
i,n : Integer;
FormID,DocNo,Version : String;
OldFName,NewMainFName,NewSubFName : String;
AttPath : String;
begin
SC := TStringlist.Create;
Main_C := TStringlist.Create;
try
Result := True;
HaveAppDoc := False;
EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
DownUrl := FUrl+CaseID+'&checktime='+EnCodeDateTime;
if not dnFile(HTTPSClient,DownUrl,'','',DPath+CaseID+'.zip',FReWrite,Memo1,False,DownImgStatus) then
begin
HttpErrStr := _Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason;
Result := False;
Exit;
end;
if Memo1.Lines.Strings[0] = '1' then
begin
HttpErrStr :=_Msg('錯誤原因:')+memo1.Lines.Strings[1];
Result := False;
Exit;
end
Else if Pos('',Memo1.Lines.Text) > 0 then
begin
HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
Result := False;
Exit;
end;
AttPath := DPath + 'AttFile\';
if FileExists(DPath+CaseID+'.zip') then
begin
ExecuteUnZip(DPath+CaseID+'.zip',DPath,True);
if FileExists(DPath+'img.zip') then
begin
ExecuteUnZip(DPath+'img.zip',DPath,False);
end;
if FileExists(DPath+'att.zip') then
begin
Str2Dir(AttPath);
ExecuteUnZip(DPath+'att.zip',AttPath,False);
end;
end
Else
begin
if ((FMode = 'FSCAN') or (FMode = 'ISCAN')) and (Memo1.Lines.Strings[0] ='NO_FILE') then //FGIS前台匯入件沒有影像是對的
begin
SC.Clear;
SC.SaveToFile(DPath+'Context.dat');
end
Else
begin
HttpErrStr := _Msg('找不到影像');
Result := False;
Exit;
end;
end;
if FileExists(SPath+'Context.dat') then
SC.LoadFromFile(SPath+'Context.dat');
for I := 0 to SC.Count - 1 do
begin
FormID := FileName2FormCode(SC.Strings[i]);
DocNo := FormCode2DocNo(FormID);
Version := FormCode2Version(FormID);
If FindSQLData(Doc_Inf_List,'ADD_SCAN_RULE','DOC_NO,DOC_VERSION',DocNo+','+Version,0,FindResult) Then
begin
if GetFindResult('ADD_SCAN_RULE') = 'R' then //替換的先刪再加 20101026 User由刪FormCode改刪DocNo
begin
//DeleteFormCodeFile(DPath,FormID);
ContextList.LoadFromFile(DPath+'Context.dat');
DeleteDocNoFile(DPath,DocNo);
end;
end;
end;
for I := 0 to SC.Count - 1 do //複製補充進來的影像
begin
OldFName := SC.Strings[i];
Main_C.LoadFromFile(DPath+'Context.dat');
//NewMainFName:= Add_Zoo(Main_C.Count+1,3)+Copy(OldFName,4,length(OldFName)-3);
NewMainFName:= Add_Zoo(Main_C.Count+1,3)+FileName2NoQuene_Filename(OldFName);
FormID := FileName2FormCode(OldFName);
DocNo := FormCode2DocNo(FormID);
Version := FormCode2Version(FormID);
If FindSQLData(Doc_Inf_List,'ADD_SCAN_RULE','DOC_NO,DOC_VERSION',DocNo+','+Version,0,FindResult) Then
begin
CopyFile(PWideChar(SPath+OldFName),PWideChar(DPath+NewMainFName),False);
end;
if FormID = '' then //附件
begin
CopyFile(PWideChar(SPath+OldFName),PWideChar(DPath+NewMainFName),False);
end;
Main_C.Add(NewMainFName);
Main_C.SaveToFile(DPath+'Context.dat');
end;
finally
SC.Free;
Main_C.Free;
end;
///加入的電子檔匯入案件裡
if DirectoryExists(SPath+'AttFile\') then
AttFile_Arrange(SPath+'AttFile\',DPath+'AttFile\');
end;}
{ ==============================================================================
方法名稱:DownLoadImage
引用相依:IIS_Ftp, SetFtpInfo
方法描述:處理影像下載流程。根據案件上傳/下載方式(HTTP 或 FTP),從伺服器下載對應
的 ZIP 檔案並解壓縮至本地案件目錄,供後續異動或補件使用。
============================================================================== }
Function TCB_IMGPSScanX.DownLoadImage(Path,CaseID:String):Boolean;
begin
Result := True;
if not GetftpInfo(CaseID,'download') then //取案件下載方式
begin
DownFileErrStr := _Msg('取案件下載資訊失敗,')+HttpErrStr;
Result := False;
Exit;
end;
case TransMode of
tsHttp:
begin
ShowText := _Msg('案件下載中(Http),請稍候');
DataLoading(True,True);
If not Down_Img(ImageSavePath+FCaseID+'\Download\',FCaseID) then
begin
Showmessage(FCaseID+_msg('載入異動影像時,網路發生錯誤')+HttpErrStr);
DataLoading(False,False);
Exit;
end;
end;
tsFtp:
begin
ShowText := _Msg('案件下載中(Ftp),請稍候');
DataLoading(True,True);
SetFtpInfo;
if not IIS_Ftp.FtpsConnect then
begin
DownFileErrStr := Format(_Msg('無法連上Ftp主機,錯誤原因:%s')+#13+'%s',[FtpErrReason,FTPSClient1.LastReceivedReply]);
Result := False;
Exit;
end;
if not IIS_Ftp.FtpsDownloadFile(FFtpExtraPath,CaseID+'.zip',Path+CaseID+'.zip',display1) then
begin
DownFileErrStr := Format(_Msg('錯誤原因:%s'),[FtpErrStr]);
Result := False;
Exit;
end;
ExecuteUnZip(Path+CaseID+'.zip',Path,False);
DeleteFile(Path+CaseID+'.zip');
end;
end;
end;
{ ==============================================================================
方法名稱:Down_Img
引用相依:En_DecryptionStr_Base64, FileExists, Str2Dir, dnFile, dnFile_Get
方法描述:透過 HTTPS 從伺服器下載案件影像。下載 ZIP 檔案(含 img.zip 與 att.zip)
後執行本地解壓縮,將主影像與附件部署至指定目錄。
============================================================================== }
Function TCB_IMGPSScanX.Down_Img(Path,CaseID:String):Boolean;
var
EnCodeDateTime : String;
SendData : String;
AttPath : String;
begin
Result := True;
EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey);
///service/slic/SLIC04/case?data=&verify=&case_no=&file=
SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID+'&file=';
//ShowMessage(SendData);
if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/case',SendData,Path+CaseID+'.zip',FReWrite,Memo1,False,DownImgStatus) then
begin
HttpErrStr := _Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason;
Result := False;
Exit;
end;
if Memo1.Lines.Strings[0] = '1' then
begin
HttpErrStr :=_Msg('錯誤原因:')+memo1.Lines.Strings[1]+'。';
Result := False;
Exit;
end
Else if Pos('',Memo1.Lines.Text) > 0 then
begin
HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入');
Result := False;
Exit;
end;
//ShowMessage('替換zip');
AttPath := Path + 'AttFile\';
if FileExists(Path+CaseID+'.zip') then
begin
ExecuteUnZip(Path+CaseID+'.zip',Path,True);
if FileExists(Path+'img.zip') then
begin
ExecuteUnZip(Path+'img.zip',Path,False);
end;
if FileExists(Path+'att.zip') then
begin
Str2Dir(AttPath);
ExecuteUnZip(Path+'att.zip',AttPath,False);
end;
end
Else
begin
HttpErrStr := _Msg('找不到影像');
Result := True;
Exit;
end;
end;
{ ==============================================================================
方法名稱:GetNoNameCase
引用相依:DirectoryExists, GetNoNameCase
方法描述:在指定的本地路徑中尋找尚未被佔用的「未配號XXXX」目錄名稱。
============================================================================== }
Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //取未配號XXXX
var
i : Integer;
begin
for i := 1 to 9999 do
begin
if Not DirectoryExists(Path+_Msg('未配號')+Add_Zoo(i,4)) then
begin
Result := _Msg('未配號')+Add_Zoo(i,4);
Break;
end;
end;
end;
{ ==============================================================================
方法名稱:CaseResort
引用相依:FileExists, LoadFromFile, ReSortFileName, RenameFile, SaveToFile
方法描述:對案件檔案進行實體重新排序。依據文件清單(Doc_Inf_List)的順序,對主文件
與次文件進行更名與重新編號,確保檔名序號符合業務邏輯。
============================================================================== }
Procedure TCB_IMGPSScanX.CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno排)
var
i,n,v,v1 : Integer;
S,S1 : TStringlist;
FormID,OldName,NewName,DocNo,Doc_Type:String;
x : Integer;
begin
S := TStringlist.Create;
S1 := TStringlist.Create;
try
S.LoadFromFile(Path+'Context.dat');
X := 0;
{for I := 1 to FORM_INF_List.Count - 1 do //在FormID有設定的 //主文件 照SQL排 20101028改
begin
FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
if FormCode2FileName(FormID,S) = '' then
Continue;
Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
for n := 0 to S.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='1') then
begin
Inc(X);
OldName := S.Strings[n];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;}
{for I := 0 to FORM_INF_List.Count - 1 do //次文件 照FormID 1~8碼+掃瞄順序排 20110512為了某個文件要先打的原因要求改
begin
for n := 0 to S.Count - 1 do
begin
FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
if (S.Strings[n][1] <> '*') and (Copy(FileName2FormCode(S.Strings[n]),1,8) = Copy(FormID,1,8)) and (Doc_Type='2') then
begin
Inc(X);
OldName := S.Strings[n];
NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;}
for I := 0 to Doc_Inf_List.Count - 1 do //主文件 照文件代碼+掃瞄順序排 20101101改 20110512晚上又說改回來
begin
DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i);
if DocNo2FileName(DocNo,S) = '' then
Continue;
Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i);
for n := 0 to S.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FormCode2DocNo(FileName2FormCode(S.Strings[n])) = DocNo) and (Doc_Type='1') then
begin
Inc(X);
OldName := S.Strings[n];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;
for I := 0 to Doc_Inf_List.Count - 1 do //次文件 照文件代碼+掃瞄順序排 20101101改 20110512晚上又說改回來
begin
DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i);
if DocNo2FileName(DocNo,S) = '' then
Continue;
Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i);
for n := 0 to S.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FormCode2DocNo(FileName2FormCode(S.Strings[n])) = DocNo) and (Doc_Type='2') then
begin
Inc(X);
OldName := S.Strings[n];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;
{for n := 0 to S.Count - 1 do //次文件 照掃瞄順序排 20101028改
begin
FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
for i := 0 to FORM_INF_List.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='2') then
begin
Inc(X);
OldName := S.Strings[n];
NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;}
for i := 0 to S.Count - 1 do //FormID沒設定的或附件
begin
if S.Strings[i][1] <> '*' then
begin
Inc(X);
OldName := S.Strings[i];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3);
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName);
S.Strings[i] := '*'+S.Strings[i];
S1.Add(OldName+','+NewName);
end;
end;
S.Clear;
for i := 0 to S1.Count - 1 do //開始轉換檔名
begin
v := Pos(',',S1.Strings[i]);
v1 := length(S1.Strings[i]);
OldName := copy(S1.Strings[i],1,v-1);
NewName := copy(S1.Strings[i],v+1,v1-v);
if FileExists(Path+OldName) then
begin
ReNameFile(Path+OldName,Path+NewName);
S.Add(NewName);
S.SaveToFile(Path+'Context.dat');
end;
end;
ReSortFileName(Path);
finally
S.Free;
S1.Free;
end;
end;
{ ==============================================================================
方法名稱:CaseResort2Scanlist
引用相依:FileExists, LoadFromFile, ReSortFileName, RenameFile, SaveToFile
方法描述:產生依表單代號排序的影像清單(scanlist.dat),用於上傳。
============================================================================== }
Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排)
var
i,n,v,v1 : Integer;
S,S1 : TStringlist;
FormID,OldName,NewName,DocNo,Doc_Type:String;
x : Integer;
begin
S := TStringlist.Create;
S1 := TStringlist.Create;
try
if FileExists(Path+'Context.dat') then
S.LoadFromFile(Path+'Context.dat');
X := 0;
for I := 1 to FORM_INF_List.Count - 1 do //在FormID有設定的 //主文件 照SQL排 20101028改
begin
FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
if FormCode2FileName(FormID,S) = '' then
Continue;
Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
for n := 0 to S.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='1') then
begin
Inc(X);
OldName := S.Strings[n];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;
for I := 0 to FORM_INF_List.Count - 1 do //次文件 照SQL排 20110512為了某個文件要先打的原因要求改
begin
FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
if FormCode2FileName(FormID,S) = '' then
Continue;
Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
for n := 0 to S.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='2') then
begin
Inc(X);
OldName := S.Strings[n];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;
{for I := 0 to Doc_Inf_List.Count - 1 do //次文件 照文件代碼+掃瞄順序排 20101101改 20110512晚上又說改回來
begin
DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i);
Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i);
for n := 0 to S.Count - 1 do
begin
if (S.Strings[n][1] <> '*') and (FormCode2DocNo(FileName2FormCode(S.Strings[n])) = DocNo) and (Doc_Type='2') then
begin
Inc(X);
OldName := S.Strings[n];
NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;}
{for n := 0 to S.Count - 1 do //次文件 照掃瞄順序排 20101028改
begin
for i := 0 to FORM_INF_List.Count - 1 do
begin
FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i);
if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='2') then
begin
Inc(X);
OldName := S.Strings[n];
NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編
S.Strings[n] := '*'+S.Strings[n];
S1.Add(OldName+','+NewName);
end;
end;
end;}
for i := 0 to S.Count - 1 do //FormID沒設定的或附件
begin
if S.Strings[i][1] <> '*' then
begin
Inc(X);
OldName := S.Strings[i];
//NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3);
NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName);
S.Strings[i] := '*'+S.Strings[i];
S1.Add(OldName+','+NewName);
end;
end;
S.Clear;
for i := 0 to S1.Count - 1 do //開始轉換檔名
begin
v := Pos(',',S1.Strings[i]);
v1 := length(S1.Strings[i]);
OldName := copy(S1.Strings[i],1,v-1);
NewName := copy(S1.Strings[i],v+1,v1-v);
//if FileExists(Path+OldName) then
//begin
//ReNameFile(Path+OldName,Path+NewName);
S.Add(NewName);
S.SaveToFile(Path+'scanlist.dat');
//end;
end;
ReSortFileName2Scanlist(Path);
finally
S.Free;
S1.Free;
end;
end;
{ ==============================================================================
方法名稱:DistinctDocinCase
引用相依:LoadFileGetMD5, LoadFromFile
方法描述:列出案件目錄下所有具備文件編號與版本的唯一組合。
============================================================================== }
Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //列出案件裡的Docno_版本
var
i,n,v : Integer;
S : TStringlist;
FormCode,DocNo,Ver : String;
Doc_Ver : String;
Exists : Boolean;
begin
S := TSTringlist.Create;
try
DocNo_VerinCase.Clear;
S.LoadFromFile(Path+'Context.dat');
for I := 0 to S.Count - 1 do
begin
if FWH_category='N' then
begin
if (ISExistImg(Path+S.Strings[i])) or (reSizeExistImgList.IndexOf(LoadFileGetMD5(Path+S.Strings[i]))<>-1) then
begin
Continue;
end;
end;
FormCode := FileName2FormCode(S.Strings[i]);
DocNo := FormCode2DocNo(FormCode);
Ver := FormCode2Version(FormCode);
if (Docno <> '') and (Ver <> '') then
begin
Doc_Ver := DocNo+'_'+Ver;
Exists := False;
for n := 0 to DocNo_VerinCase.Count-1 do
begin
if Doc_Ver = DocNo_VerinCase.Strings[n] then
begin
Exists := True;
Break;
end;
end;
if not Exists then
DocNo_VerinCase.Add(Doc_Ver);
end;
end;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:DistinctDocNoinCase
引用相依:LoadFromFile
方法描述:列出案件目錄下所有實際存在的文件編號(DocNo)。
============================================================================== }
Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //列出案件裡的Docno
var
i,n,v : Integer;
S : TStringlist;
FormCode,DocNo,Ver : String;
Exists : Boolean;
begin
S := TSTringlist.Create;
try
CaseDocNoList.Clear;
S.LoadFromFile(Path+'Context.dat');
for I := 0 to S.Count - 1 do
begin
FormCode := FileName2FormCode(S.Strings[i]);
DocNo := FormCode2DocNo(FormCode);
if (Docno <> '') then
begin
Exists := False;
for n := 0 to CaseDocNoList.Count-1 do
begin
if DocNo = CaseDocNoList.Strings[n] then
begin
Exists := True;
Break;
end;
end;
if not Exists then
CaseDocNoList.Add(DocNo);
end;
end;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:ClearErrini
引用相依:FileExists
方法描述:清除指定案件的所有檢核輔助檔案(如 Checkerr.ini, OMRCheckOk 等),並將
樹狀節點恢復為預設的影像索引狀態。
============================================================================== }
Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案
var
i : Integer;
begin
if FileExists(ImageSavePath+CaseID+'\Checkerr.ini') then
DeleteFile(ImageSavePath+CaseID+'\Checkerr.ini');
if FileExists(ImageSavePath+CaseID+'\CheckMemo.dat') then
DeleteFile(ImageSavePath+CaseID+'\CheckMemo.dat');
{if FileExists(ImageSavePath+CaseID+'\ReSize.dat') then //20110421拿掉 因為記錄會不見
DeleteFile(ImageSavePath+CaseID+'\ReSize.dat');}
if FileExists(ImageSavePath+CaseID+'\RemoveMemo.dat') then
DeleteFile(ImageSavePath+CaseID+'\RemoveMemo.dat');
if FileExists(ImageSavePath+CaseID+'\OMRCheckOk.dat') then
DeleteFile(ImageSavePath+CaseID+'\OMRCheckOk.dat');
CaseHelpBtn.Visible := False;
CaseNode.ImageIndex := 2;
CaseNode.SelectedIndex := 2;
end;
{ ==============================================================================
方法名稱:SetCaseList
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:維護本地案件清單資料。支援對 CaseList.dat 執行加入、插入、刪除或修改案
號操作,確保本地磁碟目錄與資料清單狀態同步。
============================================================================== }
Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String); //'A:加入,I:插入,D:刪除,E:修改'
var
i : Integer;
begin
CaseList.Clear;
if FileExists(ImageSavePath + 'CaseList.dat') then
CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat');
case Mode of
'A':begin
CaseList.Add(Text);
end;
'I':begin
CaseList.Insert(Index,Text);
end;
'E':begin
CaseList.Strings[Index] := Text;
end;
'D':begin
if Index <> -1 then
CaseList.Delete(Index)
Else if (text <> '') then
begin
for i := 0 to CaseList.Count - 1 do
begin
if Text = CaseList.Strings[i] then
begin
CaseList.Delete(i);
Break;
end;
end;
end;
if CaseList.Count = 0 then
DeleteFile(ImageSavePath + 'CaseList.dat');
end;
end;
if CaseList.Count > 0 then
CaseList.SaveToFile(ImageSavePath+'CaseList.dat');
end;
{ ==============================================================================
方法名稱:SetDocNoList
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:維護案件的文件目錄清單(CaseDocNo.dat)與份數清單(CaseDocNo_Copies.dat
)。根據 Mode 參數執行「加入 (A)」、「插入 (I)」、「修改 (E)」或「刪除 (D)」操作
。刪除時支援透過索引或目錄名稱進行,並會同步更新異動記錄(SetRecordEdit
edDocDir)。最後將更新後的清單存回檔案。
============================================================================== }
Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String); //'A:加入,I:插入,D:刪除,E:修改'
var
i : Integer;
CaseDocNoList : TStringlist;
CaseDocNo_copiesList : TStringlist;
begin
CaseDocNoList := TStringlist.Create;
CaseDocNo_CopiesList := TStringlist.Create;
try
CaseDocNoList.Clear;
if FileExists(ImageSavePath+CaseNo+'\CaseDocNo.dat') then
CaseDocNoList.LoadFromFile(ImageSavePath+CaseNo+'\CaseDocNo.dat');
if FileExists(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat') then
CaseDocNo_CopiesList.LoadFromFile(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat');
case Mode of
'A':begin
CaseDocNoList.Add(DocDir);
CaseDocNo_CopiesList.Add(Copies);
SetRecordEditedDocDir('A',CaseNo,DocDir);
end;
'I':begin
CaseDocNoList.Insert(Index,DocDir);
CaseDocNo_CopiesList.Insert(Index,Copies);
end;
'E':begin
CaseDocNoList.Strings[Index] := DocDir;
CaseDocNo_CopiesList.Strings[Index] := Copies;
end;
'D':begin
if Index <> -1 then
begin
//SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[Index]); //20140624 修改刪除文件時也記一筆異動,刪掉會無法通知前端網頁有異動
SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[Index]); //20170912 要刪除 不然我寫不下去
CaseDocNoList.Delete(Index);
CaseDocNo_CopiesList.Delete(Index);
end
Else if (DocDir <> '') then
begin
for i := 0 to CaseDocNoList.Count - 1 do
begin
if DocDir = CaseDocNoList.Strings[i] then
begin
//SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[i]); //20140624 修改刪除文件時也記一筆異動,刪掉會無法通知前端網頁有異動
SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[i]); //20170912 要刪除 不然我寫不下去
CaseDocNoList.Delete(i);
CaseDocNo_CopiesList.Delete(i);
Break;
end;
end;
end;
if ContextList.Count = 0 then
begin
DeleteFile(ImageSavePath+CaseNo+'\CaseDocNo.dat');
end;
end;
end;
//Showmessage('abc'+#13+ImageSavePath+CaseNo+'\CaseDocNo.dat'+#13+inttostr(CaseDocNoList.Count)+#13+CaseDocNoList.Text);
if CaseDocNoList.Count >= 0 then
begin
CaseDocNoList.SaveToFile(ImageSavePath+CaseNo+'\CaseDocNo.dat');
CaseDocNo_CopiesList.SaveToFile(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat');
//Showmessage('存了');
end;
finally
CaseDocNoList.Free;
CaseDocNo_CopiesList.Free;
end;
end;
{ ==============================================================================
方法名稱:SetContextList
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:維護特定文件目錄下的影像檔案清單(Context.dat)。支援「加入」、「插入」、「修
改」與「刪除」模式。操作前會先從磁碟載入既有的清單,執行變動後再存回,並記
錄該文件目錄已被異動。
============================================================================== }
Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String); //'A:加入,I:插入,D:刪除,E:修改'
var
i : Integer;
//DocNo:String;
begin
//DocNo := FormCode2DocNo(FileName2FormCode(FileName));
//ShowMessage('FileName='+FileName);
if DocDir = '' then
DocDir := AttName ; //附件
ContextList.Clear;
if FileExists(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat') then
ContextList.LoadFromFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat');
SetRecordEditedDocDir('A',CaseNo,DocDir); //記錄文件有異動
case Mode of
'A':begin
ContextList.Add(FileName);
end;
'I':begin
ContextList.Insert(Index,FileName);
end;
'E':begin
ContextList.Strings[Index] := FileName;
end;
'D':begin
if Index <> -1 then
begin
ContextList.Delete(Index);
end
Else if (text <> '') then
begin
for i := 0 to ContextList.Count - 1 do
begin
if FileName = ContextList.Strings[i] then
begin
ContextList.Delete(i);
Break;
end;
end;
end;
if ContextList.Count = 0 then
DeleteFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat');
end;
end;
if ContextList.Count > 0 then
begin
ContextList.SaveToFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat');
end;
end;
{ ==============================================================================
方法名稱:SetAttContextList
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:維護案件的附件檔案清單(AttContext.dat)。邏輯與 SetContextList 相似,針
對附件目錄進行檔案名稱的「加入」、「插入」、「修改」與「刪除」管理,並將結果持
久化至磁碟。
============================================================================== }
Procedure TCB_IMGPSScanX.SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String); //'A:加入,I:插入,D:刪除,E:修改'
var
i : Integer;
begin
AttContextList.Clear;
if FileExists(ImageSavePath+CaseNo+'\AttContext.dat') then
AttContextList.LoadFromFile(ImageSavePath+CaseNo+'\AttContext.dat');
case Mode of
'A':begin
AttContextList.Add(FileName);
end;
'I':begin
AttContextList.Insert(Index,FileName);
end;
'E':begin
AttContextList.Strings[Index] := FileName;
end;
'D':begin
if Index <> -1 then
begin
AttContextList.Delete(Index);
end
Else if (text <> '') then
begin
for i := 0 to AttContextList.Count - 1 do
begin
if FileName = AttContextList.Strings[i] then
begin
AttContextList.Delete(i);
Break;
end;
end;
end;
if AttContextList.Count = 0 then
DeleteFile(ImageSavePath+CaseNo+'\AttContext.dat');
end;
end;
if AttContextList.Count > 0 then
begin
AttContextList.SaveToFile(ImageSavePath+CaseNo+'\AttContext.dat');
end;
end;
{ ==============================================================================
方法名稱:checkCaseOMRDone
引用相依:
方法描述:檢查當前案件是否已完成 OMR 檢核。遍歷 NewTreeNode 中的所有項目,判斷其
ImageIndex 是否皆為 7(代表已檢核通過的圖示索引),若有任何一項未達成
則回傳 False。
============================================================================== }
Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean; //檢查案件是否完成OMR檢核
var
i : Integer;
begin
Result := True;
for I := 0 to NewTreeNode.Count - 1 do
begin
if NewTreeNode.Item[i].ImageIndex <> 7 then
begin
Result := False;
Break;
end;
end;
end;
{ ==============================================================================
方法名稱:checkFormCodeIsCustom
引用相依:
方法描述:檢查指定的表單代碼(FormCode)是否為自定義文件。透過讀取 CustomDocNo.in
i 設定檔中的 FormID 資訊,比對傳入的代碼是否與設定值一致。
============================================================================== }
function TCB_IMGPSScanX.checkFormCodeIsCustom(path, formcode: string): boolean;
var
i:integer;
ini : Tmeminifile;
str1:String;
begin
//ShowMessage(path);
ini := Tmeminifile.Create(Path+'CustomDocNo.ini');
str1:=ini.ReadString(Copy(formcode,1,8),'FormID','');
//ShowMessage('str1'+str1);
if str1 = formcode then
begin
Result:=True;
end
else
begin
Result := False;
end;
end;
{ ==============================================================================
方法名稱:CheckCaseID_OK
引用相依:
方法描述:檢查樹狀結構中是否存在「未配號」的案件。遍歷所有節點,若節點文字包含「未
配號」字樣則回傳 False。
============================================================================== }
Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean; //檢查是否有未配號的案件
var
i,n : Integer;
begin
Result := True;
for i := 0 to NewTreeNode.Count - 1 do
begin
if Pos(_msg('未配號'),NewTreeNode.Item[i].Text) > 0 then
begin
Result := False;
Break;
end;
end;
end;
{ ==============================================================================
方法名稱:CheckCaseAttach_OK
引用相依:
方法描述:檢查樹狀結構中是否存在「未歸類」的文件。遞迴遍歷案件下的所有子節點,若有
任何節點文字包含「未歸類」則回傳 False。
============================================================================== }
Function TCB_IMGPSScanX.CheckCaseAttach_OK:Boolean; //檢查是否有未歸類的案件
var
i,j : Integer;
begin
Result := True;
for i := 0 to NewTreeNode.Count - 1 do
begin
for j := 0 to NewTreeNode.Item[i].Count - 1 do
begin
if Pos(_msg('未歸類'),NewTreeNode.Item[i].Item[j].Text) > 0 then
begin
Result := False;
Break;
end;
end;
end;
end;
{ ==============================================================================
方法名稱:CreateEmptyCase
引用相依:SaveToFile
方法描述:產生一個空白的案件結構,主要用於重掃件。建立必要的目錄,並產生初始的 Co
ntext.dat 與更新 CaseList.dat。
============================================================================== }
Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String); //產生空白案號(重掃件用)
var
S : TStringlist;
begin
S := TStringlist.Create;
try
S.SaveToFile(Path+CaseID+'\Context.dat');
S.Add(FCaseID);
S.SaveToFile(Path+'CaseList.dat')
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:InitScrollRec
引用相依:
方法描述:初始化影像捲軸記錄,將 1 到 8 號影像視窗的水平與垂直捲軸位置重設為 0。
============================================================================== }
Procedure TCB_IMGPSScanX.InitScrollRec;
var i : Integer;
begin
for I := 1 to 8 do
begin
ScrollRec[i].HScroll := 0;
ScrollRec[i].VScroll := 0;
end;
end;
{ ==============================================================================
方法名稱:FormIDReplace
引用相依:CopyFile, DirectoryExists, FileExists, LoadFromFile, RenameFile, Sav
eToFile
方法描述:將指定文件中的舊表單代碼替換為新代碼。首先決定目標目錄(考慮是否分份數
、補件狀況),若目標目錄不存在則建立。接著將符合舊代碼的檔案複製到新目錄
下並重新命名(產生新序號),同時更新新目錄的 Context.dat 與清單。最後刪
除原目錄中的舊代碼檔案。
============================================================================== }
Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID
var
i : Integer;
OldFileList,NewFileList : TStringlist;
NewDocNo,NewDocDir:String;
FormID : String;
OldFile,NewFile:String;
Ext : String;
ST1:TStringList;
begin
ST1:=TStringList.Create;
OldFileList := TStringlist.Create;
NewFileList := TStringlist.Create;
try
NewDocNo := FormCode2DocNo(NewFormID);
NewDocDir := FindLastestDocDir(CaseID,NewDocNo);
/////20190319 Hong 原本的程式判斷怪怪的先Mark在下方,改用這段
if DocNoNeedDiv(NewDocNo) then //要分份數
begin
if ((FormCode2Page(NewFormID) = '01') and (GetDocDir_Page(CaseID,NewDocDir)>0)) or (NewDocDir = '') then
begin
NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo);
end
else
begin //20171016 真對補件影響 所加的判斷
ST1.Clear;
if FileExists(ImageSavePath + CaseID+'\'+NewDocDir+'\Context.dat') then
begin
ST1.LoadFromFile(ImageSavePath + CaseID+'\'+NewDocDir+'\Context.dat');
if (ST1.Count > 0) and ISExistImg(ImageSavePath + CaseID+'\'+NewDocDir+'\'+ST1.Strings[0]) then //20181210 多增加判斷ST1>0 否則會有機會出現List out of bound Hong
begin
NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo);
end;
end;
end;
end
Else //不分份數
begin
if NewDocNo <> '' then
NewDocDir := NewDocNo
else //Attach 附件
NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo);
end;
{if NewDocDir = '' then
begin
if DocNoNeedDiv(NewDocNo) then
begin
NewDocDir:=DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',NewDocNo);
end
else
begin
NewDocDir := NewDocNo;
end;
end;
//ShowMessage('NewDocDir='+NewDocDir);
if DocNoNeedDiv(NewDocNo) and (FormCode2Page(NewFormID)='01') then
begin
NewDocDir := DocNo2DocNoDir(ImageSavePath+CaseID+'\',NewDocNo);
end
else
begin
ST1.Clear;
if FileExists(ImageSavePath + NowCaseno+'\'+NewDocDir+'\Context.dat') then
begin
ST1.LoadFromFile(ImageSavePath + NowCaseno+'\'+NewDocDir+'\Context.dat');
if ISExistImg(ImageSavePath + NowCaseno+'\'+NewDocDir+'\'+ST1.Strings[0]) then
begin
NewDocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',NewDocNo);
end;
end;
end; }
if Not DirectoryExists(ImageSavePath+CaseID+'\'+NewDocDir) then
begin
MkDir(ImageSavePath+CaseID+'\'+NewDocDir);
SetDocNoList('A',-1,CaseID,NewDocDir,'1');
end;
if FileExists(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat') then
OldFileList.LoadFromFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat');
if FileExists(ImageSavePath+CaseID+'\'+NewDocDir+'\Context.dat') then
NewFileList.LoadFromFile(ImageSavePath+CaseID+'\'+NewDocDir+'\Context.dat');
for i := 0 to OldFileList.Count - 1 do
begin
OldFile := OldFileList.Strings[i];
Ext := ExtractFileExt(OldFile);
if FileName2FormCode(OldFile) = OldFormID then
begin
NewFile := Add_Zoo(NewFileList.Count+1,3)+'_'+NewFormID+Ext;
CopyFile(PWideChar(ImageSavePath+CaseID+'\'+DocDir+'\'+OldFile),PWideChar(ImageSavePath+CaseID+'\'+NewDocDir+'\'+NewFile),False);
NewFileList.Add(NewFile);
SetContextList('A',-1,CaseID,NewDocDir,NewFile);
end;
end;
DeleteFormCodeFile(CaseID,DocDir,OldFormID);
{for i := 0 to S.Count - 1 do
begin
FormID := FileName2FormCode(S.Strings[i]);
if FormID = OldFormID then
begin
OldFile := S.Strings[i];
Ext := ExtractFileExt(OldFile);
//NewFile := Copy(S.Strings[i],1,3)+'_'+NewFormID+Ext;
NewFile := Add_Zoo(FileName2ScanPage(S.Strings[i]),3)+'_'+NewFormID+Ext;
ReNameFile(Path+OldFile,Path+NewFile);
S.Strings[i] := NewFile;
end;
end;
S.SaveToFile(Path+'Context.dat');
ContextList.LoadFromFile(Path+'Context.dat'); }
finally
OldFileList.Free;
NewFileList.Free;
ST1.Free;
end;
end;
{ ==============================================================================
方法名稱:ShowFileReplace
引用相依:RenameFile
方法描述:將當前顯示清單(NowShowFileList)中的檔案更名為新的表單代碼。遍歷檔案,
保留原序號但替換 FormID 部分,執行實體更名並同步更新全域的 ContextLis
t 記錄。
============================================================================== }
Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID
var
i,n : Integer;
OldFile,NewFile:String;
Ext : String;
begin
for i := 0 to NowShowFileList.Count - 1 do
begin
OldFile := NowShowFileList.Strings[i];
Ext := ExtractFileExt(OldFile);
NewFile := Add_Zoo(FileName2ScanPage(OldFile),3)+'_'+NewFormID+Ext;
ReNameFile(Path+OldFile,Path+NewFile);
SetContextList('E',FileName2Index(OldFile),NowCaseno,NowDocNo,NewFile);
end;
end;
{ ==============================================================================
方法名稱:PageReplaceFormID
引用相依:LoadFromFile, RenameFile, SaveToFile
方法描述:針對影像列表(PageLV)中選取的頁面進行表單代碼更換。先過濾出符合條件的
檔案,再對選取項執行實體檔案更名(更新 FormID 部分),最後同步更新 Conte
xt.dat 檔案內容。
============================================================================== }
Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID
var
i,n : Integer;
S,S1 : TStringlist;
OldFile,NewFile:String;
Ext : String;
begin
S := TStringlist.Create;
S1 := TStringlist.Create;
try
S.LoadFromFile(Path+'Context.dat');
for i := 0 to S.Count - 1 do
begin
if NowFormID = 'ALL' then
S1.Add(S.Strings[i])
Else if NowFormID = 'Err' then
begin
if not FormIDExists(FileName2FormCode(S.Strings[i]),False,0) then
S1.Add(S.Strings[i])
end
Else
begin
if NowFormID = FileName2FormCode(S.Strings[i]) then
S1.Add(S.Strings[i])
end;
end;
for I := 0 to PageLV.Items.Count - 1 do
begin
if PageLV.Items.Item[i].Selected then
begin
OldFile := S1.Strings[i];
Ext := ExtractFileExt(OldFile);
//NewFile := Copy(S1.Strings[i],1,3)+'_'+NewFormID+Ext;
NewFile := Add_Zoo(FileName2ScanPage(S1.Strings[i]),3)+'_'+NewFormID+Ext;
ReNameFile(Path+OldFile,Path+NewFile);
for n := 0 to S.Count - 1 do
begin
if OldFile = S.Strings[n] then
S.Strings[n] := NewFile;
end;
end;
end;
S.SaveToFile(Path+'Context.dat');
ContextList.LoadFromFile(Path+'Context.dat');
finally
S.Free;
S1.Free;
end;
end;
{ ==============================================================================
方法名稱:ModeNeedCheck
引用相依:
方法描述:判斷目前的掃瞄模式是否需要執行 OMR 檢核。
============================================================================== }
Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核
begin
Result := False;
if Pos(ScanMode,OMRMode) > 0 then
Result := True;
end;
{ ==============================================================================
方法名稱:GetCasePage
引用相依:FileExists, LoadFromFile
方法描述:計算案件的總影像頁數。遍歷案件下所有的文件目錄(CaseDocNo.dat),讀取每
個目錄的 Context.dat 並累加檔案數量。過程中會考慮入庫/非入庫文件的權
限與顯示過濾條件,最後也包含附件目錄的計數。
============================================================================== }
Function TCB_IMGPSScanX.GetCasePage(Path,CaseID:String):Integer;
var
DocDirList,FileList,ST1 :TStringlist;
iDocDir,iDocNo : String;
i,n,Count : Integer;
begin
Count := 0;
DocDirList := TStringlist.Create;
FileList := TStringlist.Create;
ST1:=TStringList.Create;
try
if FileExists(Path+CaseID+'\CaseDocNo.dat') then
DocDirList.LoadFromFile(Path+CaseID+'\CaseDocNo.dat');
//Showmessage(DocDirList.Text);
for i := 0 to DocDirList.Count - 1 do
begin
iDocDir := DocDirList.Strings[i];
iDocno := DocNoDir2DocNo(iDocDir);
{if (((FIs_In_Wh = 'Y') and (not DocNoIs_In_WH(iDocNo))) or //入庫掃描不看非入庫文件
((FIs_In_Wh = 'N') and (DocNoIs_In_WH(iDocNo)))) and
((iDocNo <> 'Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then //非入庫掃描不看入庫文件
begin
Continue;
end;}
//if not DocNoAppear(iDocNo) then Continue; //20170817 先註解
FileList.Clear;
if FileExists(Path+CaseID+'\'+iDocDir+'\Context.dat') then
begin
FileList.LoadFromFile(Path+CaseID+'\'+iDocDir+'\Context.dat');
if (FWH_category='N') and (FIs_In_Wh='Y') then
begin
ST1.Clear;
for n := 0 to FileList.Count - 1 do
begin
if ISExistImg(Path+CaseID+'\'+iDocDir+'\'+FileList.Strings[n]) then
begin
ST1.Add(FileList.Strings[n]);
end;
end;
for n := 0 to ST1.Count - 1 do
begin
if (FileList.IndexOf(ST1.Strings[n])<>-1) and (not DocNoIs_In_WH(iDocNo)) then
begin
FileList.Delete(FileList.IndexOf(ST1.Strings[n]));
end;
end;
end
Else
if not DocNoAppear(iDocNo) then Continue; //20180925 Hong覺得應該要加這段
end;
Count := Count+ FileList.Count;
end;
if FileExists(Path+CaseID+'\'+AttName+'\Context.dat') then
begin
FileList.LoadFromFile(Path+CaseID+'\'+AttName+'\Context.dat');
Count := Count+ FileList.Count;
end;
Result := Count;
finally
DocDirList.Free;
FileList.Free;
ST1.free;
end;
end;
{ ==============================================================================
方法名稱:GetFormIDPage
引用相依:
方法描述:在指定的檔案清單中,計算符合特定表單代碼(FormID)的影像頁數。
============================================================================== }
Function TCB_IMGPSScanX.GetFormIDPage(FileList:TStringlist;FormID:String):Integer;
var
i,Cnt : Integer;
begin
Cnt := 0;
for i := 0 to FileList.Count - 1 do
begin
if FormID = FileName2FormCode(FileList.Strings[i]) then
begin
inc(Cnt);
end;
end;
Result := Cnt;
end;
{ ==============================================================================
方法名稱:SetFile2Case
引用相依:LoadFromFile, SaveToFile
方法描述:將指定的檔案名稱加入到案件的主 Context.dat 清單中。
============================================================================== }
Procedure TCB_IMGPSScanX.SetFile2Case(CaseID,FileName:String);
var
S :TStringlist;
begin
S := TStringlist.Create;
try
S.LoadFromFile(ImageSavePath+CaseID+'\Context.dat');
S.Add(FileName);
S.SaveToFile(ImageSavePath+CaseID+'\Context.dat');
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:WriteResize
引用相依:FileExists, GetTag, LoadFromFile, SaveToFile
方法描述:產生影像縮放記錄檔(Resize.dat)。載入影像後比對原始標記(Tag)中的長寬資
訊與實際 Graphic 的長寬,若有變動則將差異記錄至文字檔中。
============================================================================== }
Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //產生Resize.dat
var
TagTxt : String;
RecHeight,RecWidth : String;
ImgHeight,ImgWidth : String;
S : TStringlist;
v,v1:Integer;
begin
ImageScrollBox1.LoadFromFile(ImgName,1);
ImgHeight := Inttostr(ImageScrollBox1.Graphic.Height);
ImgWidth := Inttostr(ImageScrollBox1.Graphic.Width);
Try
TagTxt := GetTag(ImgName);
Except
TagTxt := '';
End;
if TagTxt <> '' then
begin
S := TStringlist.Create;
try
S.CommaText := TagTxt;
if S.Count = 2 then
begin
v := Pos(':',S.Strings[0]);
v1 := length(S.Strings[0]);
RecHeight := Copy(S.Strings[0],v+1,v1-v);
v := Pos(':',S.Strings[1]);
v1 := length(S.Strings[1]);
RecWidth := Copy(S.Strings[1],v+1,v1-v);
end;
S.Clear;
if FileExists(TxtName) then
S.LoadFromFile(TxtName);
if (RecHeight <> '') and (RecWidth <> '') and ((RecHeight<>ImgHeight) or (RecWidth<>ImgWidth)) then
S.Add(ExtractfileName(ImgName)+',原長:'+RecHeight+',原寬:'+RecWidth+',長變動:'+ImgHeight+',寬變動:'+ImgWidth);
S.SaveToFile(TxtName);
finally
S.Free;
end;
end;
end;
{ ==============================================================================
方法名稱:GetCase_PageCount
引用相依:FileExists, LoadFromFile
方法描述:獲取所有案件的總數量與總頁數。讀取 CaseList.dat 取得案件清單,逐一計算
各案件目錄與附件目錄下的影像檔案數。針對非入庫且當次掃瞄的特殊情況,會
額外檢查 EditedDocDir.dat 以精確計算實際變動的頁數。
============================================================================== }
Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數
var
i,n,k: Integer;
CaseList,DocList,FileList,ST1 : TStringlist;
begin
Result := False;
CaseCount := 0;
PageCount := 0;
CaseList := TStringlist.Create;
DocList := TStringlist.Create;
FileList := TStringlist.Create;
ST1:= TStringlist.Create;
try
ImageSavePath := ImagePath;
CaseList.Clear;
if FileExists(ImageSavePath + 'CaseList.dat') then
CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat');
CaseCount := CaseCount+CaseList.Count;
//ShowMessage('ImageSavePath='+ImageSavePath+#10#13+'CaseList.Count='+IntToStr(CaseList.Count));
for i := 0 to CaseList.Count - 1 do
begin
DocList.Clear;
If FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat') Then
DocList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat');
//ShowMessage('DocList='+DocList.Text);
for n := 0 to DocList.Count - 1 do
begin
//ShowMessage(DocList.Strings[n]+','+BoolToStr(DocNoAppear(DocNoDir2DocNo(DocList.Strings[n])),true));
if not DocNoAppear(DocNoDir2DocNo(DocList.Strings[n])) then Continue;
FileList.Clear;
If FileExists(ImageSavePath+CaseList.Strings[i]+'\'+DocList.Strings[n]+'\Context.dat') Then
FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+DocList.Strings[n]+'\Context.dat');
PageCount := PageCount+FileList.Count;
end;
//Showmessage(inttostr(PageCount));
FileList.Clear;
If FileExists(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat') Then
FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat');
//Showmessage(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat');
//Showmessage('FileList='+FileList.Text);
PageCount := PageCount+FileList.Count;
//Showmessage('PageCount='+inttostr(PageCount));
if (FWH_category='N') and (FIs_In_Wh='Y') then //20170912 針對非入庫並當次掃描做頁數計算
begin
if FileExists(ImageSavePath+NowCaseno+'\EditedDocDir.dat') then
begin
ST1.LoadFromFile(ImageSavePath+NowCaseno+'\EditedDocDir.dat');
for n := 0 to ST1.Count - 1 do
begin
if ST1.Strings[n]=AttName then Continue;
//ShowMessage(ST1.Strings[n]+','+BoolToStr(DocNoIs_In_WH(DocNoDir2DocNo(ST1.Strings[n])),true));
if not DocNoIs_In_WH(DocNoDir2DocNo(ST1.Strings[n])) then
begin
FileList.Clear;
if FileExists(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\Context.dat') then
begin
FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\Context.dat');
for k := 0 to FileList.Count - 1 do
begin
if not ISExistImg(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\'+FileList.Strings[k]) then
PageCount := PageCount+1;
end;
end;
end;
end;
end;
end;
end;
Finally
CaseList.Free;
DocList.Free;
FileList.Free;
ST1.Free
end;
Result := True;
end;
{ ==============================================================================
方法名稱:FindNoSaveBarCode
引用相依:
方法描述:檢查目前的條碼資訊中是否包含被標記為「不儲存影像」的條碼。遍歷所有辨識
到的條碼,並與排除清單(NoSaveBarCodeList)進行比對,若匹配則回傳 True。
============================================================================== }
Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼
var
i,n : Integer;
begin
Result := False;
for i := 1 to MpsBarcodeinf.Count do
begin
for n := 0 to NoSaveBarCodeList.Count - 1 do
begin
if MpsBarcodeinf.Text[i] = NoSaveBarCodeList.Strings[n] then
begin
Result := True;
Break;
end;
end;
if Result then
Break;
end;
end;
{ ==============================================================================
方法名稱:WriteCaseIndex
引用相依:SaveToFile
方法描述:將案件的信用註記狀態(Case_loandoc)寫入到指定路徑下的 CaseIndex.dat
檔案中。
============================================================================== }
Procedure TCB_IMGPSScanX.WriteCaseIndex(Path:String);
Var
S : TStringlist;
begin
if Path = '' then Exit;
S := TStringlist.Create;
try
try
S.Add(Case_loandoc);
S.SaveToFile(Path+'CaseIndex.dat');
except on E: Exception do
end;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:ReadCaseIndex
引用相依:FileExists, LoadFromFile
方法描述:從磁碟讀取案件索引檔(CaseIndex.dat)。載入信用註記狀態,並據此更新畫面
上 AddCredit1RG 選項組的選取狀態(Y 設為第一項,N 設為第二項)。若檔案不
存在但有預設值,則自動建立檔案。
============================================================================== }
Procedure TCB_IMGPSScanX.ReadCaseIndex(Path:String);
Var
S : TStringlist;
begin
AddCredit1RG.ItemIndex := -1;
S := TStringlist.Create;
try
if FileExists(Path+'CaseIndex.dat') then
begin
S.LoadFromFile(Path+'CaseIndex.dat');
Case_loandoc := S.Strings[0];
end;
if (Case_loandoc = '') and (FLoanDoc_Value <> '') then
begin
Case_loandoc := FLoanDoc_Value;
WriteCaseIndex(Path);
end;
if Case_loandoc = 'Y' then
AddCredit1RG.ItemIndex := 0
Else if Case_loandoc = 'N' then
AddCredit1RG.ItemIndex := 1;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:ReduceLogFile
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:防止日誌檔案過大。檢查 IMGPSCheck.log,若行數超過 100,000 行,則自動刪
除最前面的 10,000 行記錄並重新存檔。
============================================================================== }
procedure TCB_IMGPSScanX.ReduceLogFile; //20171011 必免log檔掌太大
var
ST1:TStringlist;
I:integer;
begin
ST1:=TStringList.Create;
if FileExists(LngPath+'IMGPSCheck.log') then
begin
ST1.LoadFromFile(LngPath+'IMGPSCheck.log');
if ST1.count>100000 then
begin
for I := 0 to 10000 do
begin
ST1.Delete(0);
end;
ST1.SaveToFile(LngPath+'IMGPSCheck.log');
end;
end;
ST1.Free;
end;
{ ==============================================================================
方法名稱:ClearCaseIndex
引用相依:
方法描述:重設案件索引相關的 UI 狀態,將信用註記選項設為不可用且取消選取。
============================================================================== }
Procedure TCB_IMGPSScanX.ClearCaseIndex;
begin
AddCredit1RG.Enabled := False;
AddCredit1RG.ItemIndex := -1;
end;
{ ==============================================================================
方法名稱:GetSelectImageFile
引用相依:
方法描述:取得當前所有被選取的影像檔案路徑。遍歷畫面上的 TShape 元件(選取框),透
過名稱關聯找到對應的影像捲軸盒(ISB),並將其載入的檔名加入到 NowSelect
FileList 清單中。
============================================================================== }
Procedure TCB_IMGPSScanX.GetSelectImageFile;
var
i : Integer;
FormID,FormName,DocNo : String;
PreNode2Name : String;
iFormID : String;
iISBName : String;
iISB : TImageScrollBox;
begin
NowSelectFileList.Clear;
for i := 0 to ComponentCount -1 do
begin
if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then
begin
iISBName := ShapeName2PreViewISBName(TShape(Components[i]));
iISB := TImageScrollBox(FindComponent(iISBName));
NowSelectFileList.Add(iISB.FileName);
end;
end;
end;
{ ==============================================================================
方法名稱:GetDocNoDir
引用相依:DirectoryExists
方法描述:根據文件編號產生下一個可用的目錄名稱(用於區分份數)。若文件編號不為空,
會遞增序號並檢查磁碟目錄是否存在,直到找到未使用的名稱(格式如 DocNo_1
);若編號為空則回傳附件目錄名稱。
============================================================================== }
Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數
var
i : Integer;
iDocNo : String;
begin
if (DocNo <> '') then
begin
i := 0;
Repeat
begin
inc(i);
iDocNo := Format('%s_%d',[DocNo,i]);
end;
until not DirectoryExists(Path+iDocNo);
Result := iDocNo;
end
Else
begin
Result := AttName;
end;
end;
{ ==============================================================================
方法名稱:CheckFormIDExists
引用相依:
方法描述:檢查特定的表單代碼(FormID)是否已經存在於樹狀結構中指定文件的子節點中
。
============================================================================== }
Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡
var
i : Integer;
begin
Result := False;
for i := 0 to DocNoNode.Count - 1 do
begin
if FormID = Node3FormID(DocNoNode.Item[i]) then
begin
Result := True;
break;
end;
end;
end;
{ ==============================================================================
方法名稱:DocNo2DocNoDir
引用相依:DirectoryExists
方法描述:類似 GetDocNoDir,但產生的目錄名稱格式為 DocNo(1)。透過循環檢查目錄是
否存在,自動產生下一個可用的份數目錄名稱。
============================================================================== }
Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String; //DocNo轉成DocNo(份數)目錄
var
i : Integer;
iDocNo : String;
begin
if (DocNo <> '') then
begin
i := 0;
Repeat
begin
inc(i);
iDocNo := Format('%s(%d)',[DocNo,i]);
end;
until not DirectoryExists(Path+iDocNo);
Result := iDocNo;
end
Else
begin
Result := AttName;
end;
end;
{ ==============================================================================
方法名稱:DocNoDir2DocNo
引用相依:
方法描述:將包含份數括號的目錄名稱(如 A001(2))還原為原始的文件編號(如 A001)。排
除附件目錄後,尋找左括號的位置並擷取前面的字串。
============================================================================== }
Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo
var
v,ln : Integer;
begin
if (DocNoDir <> 'Attach') and (DocNoDir <> 'S_Attach') then
begin
v := Pos('(',DocNoDir);
if v > 0 then
Result := Copy(DocNoDir,1,v-1)
else
Result := DocNoDir;
end
Else
Result := DocNoDir
end;
{ ==============================================================================
方法名稱:DocNoDir2Index
引用相依:LoadFromFile
方法描述:將文件目錄名稱轉換為其在 CaseDocNo.dat 清單中的索引位置。
============================================================================== }
Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index
var
i : Integer;
CaseNo_List : TStringlist;
begin
Result := -1;
CaseNo_List := TStringlist.Create;
try
CaseNo_List.LoadFromFile(Path+'CaseDocNo.dat');
for i := 0 to CaseNo_List.Count - 1 do
begin
if DocNoDir = CaseNo_List.Strings[i] then
begin
Result := i;
Break;
end;
end;
finally
CaseNo_List.Free;
end;
end;
{ ==============================================================================
方法名稱:ParserPoint
引用相依:
方法描述:解析代表影像十字點座標的字串。將包含四個端點(左上、左下、右上、右下)座標
及長寬資訊的字串拆解,並轉換為 TPoint 結構存入全域變數中,若字串格式不
符則全部重設為 (0,0)。
============================================================================== }
Procedure TCB_IMGPSScanX.ParserPoint(S:String); //解析十字點的字串
var
PointList : TStringlist;
Rect : TRect;
begin
PointList := TStringlist.Create;
try
PointList.Text := S;
IF PointList.Count <> 6 Then
begin
UpLPoint := Str2Point('0,0');
UpRPoint := Str2Point('0,0');
DownLPoint := Str2Point('0,0');
DownRPoint := Str2Point('0,0');
Point_Width := '0';
Point_Height := '0';
end
Else
begin
UpLPoint := Str2Point(PointList[0]);
DownLPoint := Str2Point(PointList[1]);
UpRPoint := Str2Point(PointList[2]);
DownRPoint := Str2Point(PointList[3]);
Point_Width := PointList[4];
Point_Height := PointList[5];
end;
finally
PointList.Free;
end;
end;
{ ==============================================================================
方法名稱:CheckScanDenialTime
引用相依:
方法描述:檢查目前時間是否已超過系統設定的「禁止掃瞄時間」。
============================================================================== }
Function TCB_IMGPSScanX.CheckScanDenialTime:Boolean;
Var
NowTime : String;
begin
NowTime := GetBalance2Time(Balance);
NowTime := Copy(NowTime,1,2)+':'+Copy(NowTime,3,2)+':'+Copy(NowTime,5,2);
Result := True;
if ScanDenialTime <> '' then
begin
if StrtoTime(NowTime) >= StrtoTime(ScanDenialTime) then
Result := False;
end;
end;
{ ==============================================================================
方法名稱:FormID2Anchor
引用相依:
方法描述:根據表單代碼(FormID)從 FORM_INF_List 中查詢對應的定位模式(ANCHOR 模
式),並回傳轉換後的模式字串(NONE/ANCHOR/FRAME)。
============================================================================== }
Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String; //用FormID取出十字模式
var
Anchor : String;
begin
Result := 'NONE';
IF FindSQLData(FORM_INF_List,'T1.ANCHOR','T1.FORM_ID',FormID,0,FindResult) then
begin
ANCHOR := UpperCase(GetFindResult('T1.ANCHOR'));
end;
Result := Index2Anchor(Anchor);
end;
{ ==============================================================================
方法名稱:Index2Anchor
引用相依:
方法描述:將數值型的定位模式索引(0, 1, 2)轉換為易讀的模式名稱字串。
============================================================================== }
Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String; //十字模式 0->NONE;1->ANCHOR;2->FRAME
begin
if Anchor = '0' then
Result := 'NONE'
else if Anchor = '1' then
Result := 'ANCHOR'
else if Anchor = '2' then
Result := 'FRAME';
end;
{ ==============================================================================
方法名稱:ScanDuplexCBClick
引用相依:
方法描述:處理雙面掃瞄勾選框點擊事件,同步更新全域的 ScanDuplex 變數。
============================================================================== }
procedure TCB_IMGPSScanX.ScanDuplexCBClick(Sender: TObject);
begin
ScanDuplex := ScanDuplexCB.Checked;
//R_W_ScanIni('W'); //user要求改成預設後不能改
end;
{ ==============================================================================
方法名稱:ScanGrayCBClick
引用相依:ifBlackWhite, ifGray256, ifTrueColor
方法描述:根據掃瞄勾選框狀態,設定掃瞄色彩模式(灰階、全彩或黑白)。
============================================================================== }
procedure TCB_IMGPSScanX.ScanGrayCBClick(Sender: TObject);
begin
if ScanGrayCB.Checked then
begin
ScanColor:=ifGray256;
end
else
begin
if FScanColor = 0 then
begin
ScanColor := ifBlackWhite;
end;
if FScanColor = 1 then
begin
//ScanColor := ifGray256 ;
ScanColor := ifBlackWhite; //
end;
if FScanColor = 2 then
begin
ScanColor := ifTrueColor ;
end;
end;
end;
{ ==============================================================================
方法名稱:GetFormatID
引用相依:FileExists, LoadFromFile
方法描述:從案件索引檔(CaseIndex.dat)中獲取案件的 FormatID(主鍵值)。目前實作為
存根,包含讀取邏輯但未回傳特定欄位。
============================================================================== }
Function TCB_IMGPSScanX.GetFormatID(CaseID: string):String;
Var
S : TStringlist;
FormatID : String;
begin
Result := '';
S := TStringlist.Create;
try
if FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then
begin
S.LoadFromFile(ImageSavePath+CaseID+'\CaseIndex.dat');
//Format_ID := S.Strings[5]; //主鍵值 (報價單號or續保單號or保單號碼or保險證號or原案件受編)
//Result := Format_ID;
//Handle_No := S.Strings[0]; //經辦代號
//Cen_Uid := S.Strings[1]; //被保人ID
//Cen_Cliname := S.Strings[2]; //被保人姓名
//Cen_Platno := S.Strings[3]; //車號
//Case_Priority := S.Strings[4];//案件等級
end;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:MemoInfoTransfer
引用相依:
方法描述:註記代碼與類別名稱的轉換函數。支援「代碼轉名稱」或「名稱轉代碼」兩種模式,
若無匹配代碼則預設為「自行輸入」。
============================================================================== }
Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String; //註記代碼註記類別轉換 Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼
var
i : Integer;
begin
if Mode = 'ID' then
begin
Result := _Msg('自行輸入');
for i := 0 to ID_S.Count - 1 do
begin
if Str = ID_S.Strings[i] then
begin
Result := Name_S.Strings[i];
Break;
end;
end;
end
else if Mode = 'NAME' then
begin
Result := '00';
for i := 0 to Name_S.Count - 1 do
begin
if Str = Name_S.Strings[i] then
begin
Result := ID_S.Strings[i];
Break;
end;
end;
end;
end;
{ ==============================================================================
方法名稱:SetSQLData
引用相依:
方法描述:將 SQL 查詢結果格式化後塞入目標字串清單。此方法會先清除目標清單 (ToLi
st),第一行加入欄位定義字串 (ColumeStr),隨後將來源清單 (FromList) 中
扣除標題後的資料列依序填入,用於更新系統本地的資料快取。
============================================================================== }
Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入
var
i : Integer;
begin
ToList.Clear;
ToList.Add(ColumeStr);
For i := 1 to FromList.Count -1 do
begin
ToList.Add(FromList.Strings[i]);
end;
end;
{ ==============================================================================
方法名稱:GetSQLData
引用相依:
方法描述:從結構化字串清單中提取特定欄位的值。邏輯如下:
1. 解析 TableList 的第一行(欄位定義)以確定目標欄位 (Colname) 的索引
位置。
2. 讀取指定行 (colNo) 的資料字串,該字串使用 '!@!' 作為欄位分隔符。
3. 透過循環將資料拆分並存入臨時清單,最後返回對應欄位索引位置的數值內
容。若找不到欄位或索引超出範圍,則返回空字串。
============================================================================== }
Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值
var
i,col,v,v1 : Integer;
ColStr,DataStr: TStringList;
TmpStr : String;
P1,p2 : Integer;
begin
Result := '';
ColStr := TStringList.Create;
DataStr := TSTringList.Create;
ColStr.CommaText := TableList.Strings[0];
TmpStr := TableList.Strings[ColNo];
//DataStr.Text:=StringReplace(TmpStr,'!@!',#13,[rfReplaceAll]);
While Length(Tmpstr) > 0 do
begin
v:= Pos('!@!',TmpStr);
v1 := Length(TmpStr);
If v > 0 Then
begin
DataStr.Add(Copy(TmpStr,1,v-1));
TmpStr := Copy(TmpStr,v+3,V1-(V-2));
end
Else
begin
DataStr.Add(TmpStr);
TmpStr := '';
end;
end;
For i := 0 to ColStr.Count-1 do
begin
IF ColStr.Strings[i] = ColName Then
begin
Result := '';
If (DataStr.Count > 0) and (i<=DataStr.Count-1) Then
Result := DataStr.Strings[i];
//If (DataStr.Count > 0) and (i<=DataStr.Count-1) Then
//begin
{if i = 0 then
begin
P1 := 1;
p2 := PosN('!@!',TmpStr,1)-1;
end
else
begin
P1 := PosN('!@!',TmpStr,i)+3;
p2 := PosN('!@!',TmpStr,i+1)-p1;
end;
Result :=Copy(tmpstr,p1,p2);}
//end;
//Result := DataStr.Strings[i];
Break;
end;
end;
ColStr.Free;
DataStr.Free;
end;
{ ==============================================================================
方法名稱:FindSQLData
引用相依:
方法描述:在資料快取清單中搜尋符合鍵值的紀錄。核心邏輯:
1. 支援多個鍵值比對 (KeyColumeStr 與 KeyStr 可包含多個欄位)。
2. 若 ColNo 為 0,則從頭搜尋清單;若非 0 則僅檢查該指定行。
3. 搜尋時會調用 GetSQLData 提取欄位值並與目標鍵值比對。
4. 一旦匹配成功,會將 ColumeStr 中指定的所有欄位名稱及其對應數值(格式
為「欄位名,數值」)填入 ResultList 中並返回 True。若搜尋無結果則返回 Fal
se。
============================================================================== }
Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料
Var i,n,Findindex : Integer;
ColList,KeyColList,KeyList : TStringlist;
Cols,Keycols,keys :String;
Find:Boolean;
begin
ResultList.Clear;
if (KeyStr = '') or (TableList.Count <= 1) then
begin
Result := False;
Exit;
end;
ColList := TStringlist.Create;
KeyColList := TStringlist.Create;
KeyList := TStringlist.Create;
try
ColList.CommaText := ColumeStr;
KeyColList.CommaText := KeyColumeStr;
KeyList.CommaText := KeyStr;
if ColNo = 0 then
begin
for i := 1 to TableList.Count -1 do //找key對不對
begin
Findindex := i;
for n := 0 to KeyColList.Count - 1 do
begin
Find := True;
Keycols := KeyColList.Strings[n];
keys := KeyList.Strings[n];
//Showmessage(keys);
//Showmessage(TableList.Strings[i]);
if GetSQLData(TableList,Keycols,i) = keys then //對.繼續
//if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then //在資料列前後加!@! 用pos的方式來改善速度 //20130521發現找資料會有問題
Continue
Else //不對.離開
begin
Find := False;
Break;
end;
end;
if Find then Break; // 找到了離開
end;
end
Else
begin
i := ColNo;
Findindex := i;
for n := 0 to KeyColList.Count - 1 do
begin
Find := True;
Keycols := KeyColList.Strings[n];
keys := KeyList.Strings[n];
//if GetSQLData(TableList,Keycols,i) = keys then //對.繼續
if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then //在資料列前後加!@! 用pos的方式來改善速度
Continue
Else //不對.離開
begin
Find := False;
Break;
end;
end;
end;
if Find then //有找到key
begin
for n := 0 to ColList.Count -1 do
begin
Cols := ColList.Strings[n];
ResultList.Add(Cols+','+GetSQLData(TableList,Cols,Findindex));
end;
end;
finally
Result := Find;
ColList.Free;
KeyColList.Free;
KeyList.Free;
end;
end;
{ ==============================================================================
方法名稱:GetFindResult
引用相依:
方法描述:從資料查詢結果(FindResult)中,根據指定的欄位名稱(Col)提取對應的值。
============================================================================== }
Function TCB_IMGPSScanX.GetFindResult(Col:String):String;
var
i,v,v1 : Integer;
S,RCol,RValue : String;
begin
Result := '';
for I := 0 to FindResult.Count - 1 do
begin
S := FindResult.Strings[i];
v := Pos(',',S);
v1 := length(S);
RCol := copy(S,1,v-1);
RValue := Copy(S,v+1,v1-v);
if Col =RCol then
Result := RValue;
end;
end;
{ ==============================================================================
方法名稱:ClearView
引用相依:
方法描述:清空指定的影像顯示區域。將索引從 stkv 到 8 的 TImageScrollBox 檔名重
設為空,並清空對應的標籤文字,最後釋放預覽資源並將焦點設回 ISB1。
============================================================================== }
procedure TCB_IMGPSScanX.ClearView(stkv:Integer);
var i:integer;
ISB : TImageScrollBox;
lb : TLabel;
begin
For i:= stkv to 8 do
begin
ISB := TImageScrollBox(FindComponent('ISB'+intToStr(i)));
ISB.FileName := '';
Lb := TLabel(FindComponent('Lb'+intToStr(i)));
Lb.Caption := '';
end;
FreePreViewISB;
ISB1Click(ISB1);
end;
{ ==============================================================================
方法名稱:initParameter
引用相依:ifBlackWhite, ifGray256, ifTrueColor
方法描述:初始化掃瞄相關參數。設定檔案大小限制(預設 5MB)、DPI(預設 300)以及掃瞄
顏色模式(黑白、灰階、全彩),並同步更新 UI 狀態(如 ScanGrayCB)。
============================================================================== }
procedure TCB_IMGPSScanX.initParameter;
begin
// if FCaseNoLength=0 then
// begin
//
// end;
if FFileSizeLimit = 0 then
begin
FFileSizeLimit := 5*1024;
end;
if FImgDPI=0 then
begin
FImgDPI := 300;
ScanDpi := FImgDPI;
end
else
begin
//FImgDPI := StrToInt(Value);
ScanDpi := FImgDPI;
end;
if FScanColor = 0 then
begin
ScanColor := ifBlackWhite;
end;
if FScanColor = 1 then
begin
ScanColor := ifGray256 ;
ScanGrayCB.Checked:=True;
end;
if FScanColor = 2 then
begin
ScanColor := ifTrueColor ;
end;
end;
{ ==============================================================================
方法名稱:PrtLbClick
引用相依:LoadFromFile
方法描述:處理「列印」按鈕點擊。首先產生上傳用的暫存影像結構,接著開啟 TPrintForm
供使用者勾選欲列印的文件。確認後呼叫 PrintImg 進行實體列印,並記錄操作
日誌。
============================================================================== }
procedure TCB_IMGPSScanX.PrtLbClick(Sender: TObject);
var
Width : Double;
Height : Double;
i : Integer;
DocDirList,FileList :TStringlist;
iDocDir,iDocNo : String;
PrtDialog : TPrintDialog;
S : String;
begin
ShowText := _Msg('列印中,請稍候');
DataLoading(True,True);
Case2upload(NowCaseNo); //產生原影像結構
//ontextList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\Context.dat');
PrintForm := TPrintForm.create(Self);
DocDirList := TStringlist.Create;
FileList := TStringlist.Create;
try
FileList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\Context.dat');
DocDirList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\DocDir.dat');
InitialLanguage(PrintForm); //載入多國語言
PrintForm.CheckListBox1.Items.Clear;
For i := 0 to FileList.Count - 1 do
begin
iDocDir := DocDirList.Strings[i];
iDocno := DocNoDir2DocNo(iDocDir);
if not DocNoAppear(iDocNo) then Continue;
PrintForm.CheckListBox1.Items.Add(FileList.Strings[i]);
if CheckFormID_Prt(FileName2FormCode(FileList.Strings[i])) then
PrintForm.CheckListBox1.Checked[i] := True;
PrintForm.ListBox1.Items.Add(Add_Zoo(i+1,3))
end;
If (PrintForm.ShowModal = mrOK) then
begin
S := '';
for I := 0 to PrintForm.CheckListBox1.Count -1 do
begin
if PrintForm.CheckListBox1.Checked[i] then
begin
if S = '' then
S := S+PrintForm.CheckListBox1.Items[i]
Else
S := S+#13+PrintForm.CheckListBox1.Items[i];
end;
end;
if S = '' then
begin
Showmessage(_msg('尚未選擇欲列印文件'));
Exit;
end
Else
begin
PrintImg(S,FUserID,ServerDate,ImageSavePath+NowCaseNo+'\Upload\');
If not Writelog(NowCaseNo) then
begin
//Showmessage('false');
end;
end;
end;
finally
DataLoading(False,False);
PrintForm.Free;
end;
end;
{ ==============================================================================
方法名稱:UseOldCaseLbClick
引用相依:CopyFile, DirectoryExists, FileExists, LoadFromFile, SaveToFile
方法描述:處理「使用舊件」功能。開啟 TOldCaseInfoForm 讓使用者選擇舊有案件的文件。
選定後,將舊件影像複製到新案件目錄下,自動產生新序號檔名,建立關聯記錄(
UseCase.dat),並同步更新新案件的文件清單與樹狀統計。
============================================================================== }
procedure TCB_IMGPSScanX.UseOldCaseLbClick(Sender: TObject);
var
i,n : Integer;
CaseID,Year,BS_No,IS_Old : String;
OldCaseInfoForm : TOldCaseInfoForm;
OldCaseInfoList,Caseinfolist,FileList,DocNoList,iFileList,iDocNoList,iDocNo_CopiesList : TStringlist;
OldDocdir,OldDocNo,OldDocName,NewDocDir,FileName : String;
OldPath,NewPath,OldFile,NewFile:String;
Oldcopies:Integer;
begin
OldCaseInfoForm := TOldCaseInfoForm.Create(Self);
OldCaseInfoList := TStringlist.Create;
Caseinfolist := TStringlist.Create;
FileList := TStringlist.Create;
DocNoList := TStringlist.Create;
iDocNo_CopiesList := TStringlist.Create;
iFileList := TStringlist.Create;
iDocNoList := TStringlist.Create;
OldCaseInfoForm.OldDocDirList := TStringlist.Create;
OldCaseInfoForm.OldDocNameList := TStringlist.Create;
OldCaseInfoForm.IN_WH_DocNoList := TStringlist.Create;
OldCaseInfoForm.OldCopiesList := TStringlist.Create;
try
InitialLanguage(OldCaseInfoForm); //載入多國語言
OldCaseInfoForm.Notebook1.ActivePage := 'CaseInfo';
OldCaseInfoForm.ImageSavePath := ImageSavePath;
OldCaseInfoForm.CaseID := NowCaseNo;
OldCaseInfoForm.Furl := Furl;
OldCaseInfoForm.Fdata := FData;
OldCaseInfoForm.FVerify := FVerify;
OldCaseInfoForm.FReWrite := FReWrite;
OldCaseInfoForm.FOldCaseInfo := FOldCaseInfo;
//OldCaseInfoList 案件編號@#,年度@#,業務別@#,是否舊件@#,文件編號[份數]@#,文件編號[份數] tab 案件編號@#,年度@#,業務別@#,是否舊件@#,文件編號[份數]@#,文件編號[份數]
OldCaseInfoList.StrictDelimiter := true;
OldCaseInfoList.Delimiter := #9;
OldCaseInfoList.DelimitedText := FOldCaseInfo;
//Showmessage(FOldCaseInfo);
//Showmessage(OldCaseInfoList.Text);
OldCaseInfoForm.IN_WH_DocNoList.Assign(IN_WH_DocNoList);
OldCaseInfoForm.FIs_In_Wh := FIs_In_Wh;
for i := 0 to OldCaseInfoList.Count - 1 do
begin
Caseinfolist:=SplitString('@#,',OldCaseInfoList.Strings[i]);
//Caseinfolist.Delimiter := '_';
//Caseinfolist.DelimitedText := OldCaseInfoList.Strings[i];
CaseID := Caseinfolist.Strings[0];
Year := Caseinfolist.Strings[1];
BS_No := Caseinfolist.Strings[2];
IS_Old := Caseinfolist.Strings[3];
With OldCaseInfoForm.OldCaseLV.Items.Add do
begin
Caption := CaseID;
SubItems.Add(Year);
SubItems.Add(BS_No);
SubItems.Add(IS_Old);
end;
end;
if OldCaseInfoForm.ShowModal = MrOk then
begin
OldPath := ImageSavePath+NowCaseNo+'\'+OldCaseInfoForm.UseCaseID+'\';
NewPath := ImageSavePath+NowCaseNo+'\';
iDocNoList.Clear;
if FileExists(NewPath+'CaseDocNo.dat') then
iDocNoList.LoadFromFile(NewPath+'CaseDocNo.dat');
if FileExists(NewPath+'CaseDocNo_Copies.dat') then
iDocNo_CopiesList.LoadFromFile(NewPath+'CaseDocNo_Copies.dat');
for i := 0 to OldCaseInfoForm.OldDocDirList.Count - 1 do
begin
FileList.LoadFromFile(OldPath+'Context.dat');
DocNoList.LoadFromFile(OldPath+'DocDir.dat');
OldDocName := OldCaseInfoForm.OldDocNameList.Strings[i];
OldDocDir := OldCaseInfoForm.OldDocDirList.Strings[i];
OldDocNo := DocNoDir2DocNo(OldDocDir);
if Copy(OldDocNo,1,5)<>'ZZZZZ' then
begin
if DocNoNeedDiv(OldDocNo) then
NewDocDir := DocNo2DocNoDir(NewPath,OldDocNo)
else
NewDocDir := OldDocNo;
end
Else
begin
NewDocDir := GetNewCustomDocNo(NewPath,OldDocName);
end;
SetRecordEditedDocDir('A',NowCaseNo,NewDocDir);
iFileList.Clear;
if FileExists(NewPath+NewDocDir+'\Context.dat') then
iFileList.LoadFromFile(NewPath+NewDocDir+'\Context.dat');
if Not DirectoryExists(NewPath+NewDocDir) then
begin
iDocNoList.Add(NewDocDir);
Oldcopies := GetDocDirCopies(NowCaseNo+'\'+OldCaseInfoForm.UseCaseID,OldDocDir); //舊案的CaseID 放在新案CaseID目錄裡
if FileExists(ImageSavePath+NowCaseNo+'\'+OldCaseInfoForm.UseCaseID+'\CaseDocNo_Copies.dat') then
iDocNo_CopiesList.Add(inttostr(Oldcopies))
else
begin
OldCopies := GetDocDircopies_Rec(OldPath,OldCaseInfoForm.UseCaseID,OldDocDir);
iDocNo_CopiesList.Add(inttostr(Oldcopies));
//iDocNo_CopiesList.Add('1');
end;
MkDir(NewPath+NewDocDir);
end;
SetUseCase('A',NewPath,NewDocDir,OldCaseInfoForm.UseCaseID,''); //NewDocDir 從哪來的
SetUseCase('A',OldPath,OldDocDir,'',NowCaseNo); //OldDocDir 去哪了
StringtoFile('Y',OldPath+'UseCase.dat'); //要上傳
for n := 0 to DocNoList.Count - 1 do
begin
if OldDocDir = DocNoList.Strings[n] then
begin
OldFile := FileList.Strings[n];
if Copy(NewDocDir,1,5)<>'ZZZZZ' then
NewFile := Add_Zoo(iFileList.Count+1,3)+FileName2NoQuene_Filename(OldFile)
Else
NewFile := Add_Zoo(iFileList.Count+1,3)+'_'+GetCustomFormID(NewPath,NewDocDir)+ExtractFileExt(OldFile);
iFileList.Add(NewFile);
CopyFile(PwideChar(OldPath+OldFile),Pwidechar(NewPath+NewDocDir+'\'+NewFile),False);
end;
end;
iFileList.SaveToFile(NewPath+NewDocDir+'\Context.dat');
end;
iDocNoList.SaveToFile(NewPath+'CaseDocNo.dat');
iDocNo_CopiesList.SaveToFile(NewPath+'CaseDocNo_Copies.dat');
DrawDocItem2(MyTreeNode1,NowCaseNo);
//MyTreeNode1.Text := Format('%s-%d'+_Msg('頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
MyTreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
NewTreeNodeRefresh;
ClearErrini(NowCaseno,MyTreeNode1); //清掉檢核記錄
end;
finally
OldCaseInfoForm.OldDocDirList.Free;
OldCaseInfoForm.OldDocNameList.Free;
OldCaseInfoForm.OldCopiesList.Free;
OldCaseInfoList.Free;
Caseinfolist.Free;
FileList.Free;
DocNoList.Free;
iDocNo_CopiesList.Free;
iFileList.Free;
iDocNoList.Free;
OldCaseInfoForm.Free;
end;
end;
{ ==============================================================================
方法名稱:LastInitFormidListCreate
引用相依:LoadFromFile
方法描述:從 FormCode_Name.dat 檔案中提取表單代碼(底線前的部分),並將其加入到 L
astInitFormidList 清單中。
============================================================================== }
procedure TCB_IMGPSScanX.LastInitFormidListCreate(path: string);
var
i:integer;
ST1:TStringList;
str1:string;
begin
//ShowMessage('path='+path);
ST1:=TStringList.Create;
ST1.LoadFromFile(path+'FormCode_Name.dat');
for I := 0 to ST1.Count - 1 do
begin
if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-1) then
begin
str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1);
LastInitFormidList.Add(str1);
end;
end;
ST1.Free;
end;
{ ==============================================================================
方法名稱:LoadFileGetMD5
引用相依:LoadFileGetMD5, TIdHashMessageDigest5
方法描述:計算指定檔案的 MD5 雜湊值。方法會以唯讀模式開啟檔案串流 (TFileStream)
,利用 TIdHashMessageDigest5 元件處理串流內容,並返回以十六進位字串表
示的 MD5 值。此功能主要用於確認影像檔案在傳輸或處理前後的完整性與一致
性,防止資料受損或被重複處理。
============================================================================== }
function TCB_IMGPSScanX.LoadFileGetMD5(const filename: string): string;
var
Stream: TFileStream;
//Buffer: array[0..1023] of AnsiChar;
Buffer: array[0..1023] of AnsiChar;
TempStr: string;
i: Integer;
idmd5:TIdHashMessageDigest5; //import IdHashMessageDigest, idHash
begin
idmd5 := TIdHashMessageDigest5.Create;
try
Stream := TFileStream.Create(filename, fmOpenRead);
Stream.Read(Buffer[0], SizeOf(Buffer));
result := idmd5.HashStreamAsHex(Stream) ;
finally
idmd5.Free;
Stream.Free;
end;
end;
{ ==============================================================================
方法名稱:LoadImgFile
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:載入當前所有的影像案件至樹狀結構。清空舊有節點後,讀取 CaseList.dat,為
每個案件建立父節點,並呼叫 DrawDocItem2 繪製子文件與表單。同時會根據 O
MR 檢核狀態設定對應的案件圖示。
============================================================================== }
procedure TCB_IMGPSScanX.LoadImgFile; //載入新件及替換件
Var
i,v,v1,m : Integer;
CasePage : integer;
TempName : String;
BarName : String;
DocName : String;
//S : String;
begin
ClearView(1);
PageLV.Clear;
AttListBox.Items.Clear;
AddAttFileLB.Enabled := False;
DelAttFileLB.Enabled := False;
DisplayPath := '';
ClearCaseIndex;
CaseHelpBtn.Visible := False;
//Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的
TreeView1.Items.Clear;
NewTreeNode := nil;
MyTreenode1 := nil;
MyTreenode2 := nil;
MyTreenode3 := nil;
NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-共%d筆共%d頁'),[FModeName,0,0]));
NewTreenode.ImageIndex := 0;
NewTreenode.SelectedIndex := 0;
Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的
GetCase_PageCount(CaseCount,PageCount);
CaseList.Clear;
if FileExists(ImageSavePath + 'CaseList.dat') then
CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat');
for i := 0 to CaseList.Count - 1 do
begin
CaseDocNoList.Clear;
if FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat') then
CaseDocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat');
if not FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo_Copies.dat') then
begin
CaseDocNo_CopiesList.Clear;
for m := 0 to CaseDocNoList.Count - 1 do
begin
CaseDocNo_CopiesList.Add('1');
CaseDocNo_CopiesList.SaveToFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo_Copies.dat');
end;
end;
CasePage := GetCasePage(ImageSavePath,CaseList.Strings[i]);
//ShowMessage('CasePage='+IntToStr(CasePage));
MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[i],CasePage]));
MytreeNode1.ImageIndex := 1;
MytreeNode1.SelectedIndex := 1;
DrawDocItem2(MytreeNode1,CaseList.Strings[i]); //長出文件名稱的樹並傳回是否有申請書的影像
if Pos(_Msg('未配號'),CaseList.Strings[i]) > 0 then
begin
MytreeNode1.ImageIndex := 5;
MytreeNode1.SelectedIndex := 5;
end;
If FileExists(ImageSavePath+CaseList.Strings[i]+'\OMRCheckOk.dat') Then
begin
MytreeNode1.ImageIndex := 7;
MytreeNode1.SelectedIndex := 7;
CaseHelpBtn.Visible := False;
end
Else IF FileExists(ImageSavePath+CaseList.Strings[i]+'\Checkerr.ini') Then
begin
MyTreenode1.ImageIndex := 5;
MyTreenode1.SelectedIndex := 5;
//AllEnforceLb.Visible := True; //全部強迫送件
end;
end;
MyTreenode1 := nil;
MyTreenode2 := nil;
If NewTreeNode <> nil Then
begin
TreeView1.Selected := NewTreeNode;
NewTreeNode.Expand(False);
end;
IF (NewTreeNode <> nil) and (NewTreeNode.Count > 0) Then
begin
GetCase_PageCount(CaseCount,PageCount);
v := Pos('-',NewTreeNode.Text);
NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
end;
end;
{ ==============================================================================
方法名稱:LoadImgFile1
引用相依:FileExists, LoadFromFile, SaveToFile
方法描述:載入影像檔案的另一種實作版本。包含更細緻的 Context_DocNo.dat 管理,若
檔案不存在會自動掃描 ContextList 並根據 FormCode 產生對應的文件編號
記錄。主要用於特定的資料結構載入。
============================================================================== }
procedure TCB_IMGPSScanX.LoadImgFile1; //載入新件及替換件
Var
i,n,v,v1,m : Integer;
p : integer;
iCaseNo,iDocNo : String;
TempName : String;
BarName : String;
DocName : String;
//S : String;
begin
ClearView(1);
PageLV.Clear;
DisplayPath := '';
ClearCaseIndex;
CaseHelpBtn.Visible := False;
//Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的
TreeView1.Items.Clear;
NewTreeNode := nil;
MyTreenode1 := nil;
MyTreenode2 := nil;
MyTreenode3 := nil;
NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-共%d筆共%d頁'),[FModeName,0,0]));
NewTreenode.ImageIndex := 0;
NewTreenode.SelectedIndex := 0;
Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的
GetCase_PageCount(CaseCount,PageCount);
CaseList.Clear;
if FileExists(ImageSavePath + 'CaseList.dat') then
CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat');
for n := 0 to CaseList.Count - 1 do
begin
iCaseNo := CaseList.Strings[n];
CaseDocNoList.Clear;
if FileExists(ImageSavePath+CaseList.Strings[n]+'\DocNoList.dat') then
CaseDocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\DocNoList.dat');
for m := 0 to CaseDocNoList.Count - 1 do
begin
iDocNo := CaseDocNoList.Strings[i];
MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[n],p]));
MytreeNode1.ImageIndex := 1;
MytreeNode1.SelectedIndex := 1;
end;
ContextList.Clear;
Context_DocnoList.Clear;
If FileExists(ImageSavePath+CaseList.Strings[n]+'\Context.dat') Then
begin
ContextList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\Context.dat');
if FileExists(ImageSavePath+CaseList.Strings[n]+'\Context_DocNo.dat') then
Context_DocnoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\Context_DocNo.dat')
else
begin
for m := 0 to ContextList.Count - 1 do
begin
Context_DocnoList.Add(FormCode2DocNo(FileName2FormCode(ContextList.Strings[m])));
end;
Context_DocnoList.SaveToFile(ImageSavePath+CaseList.Strings[n]+'\Context_DocNo.dat');
end;
Cust_DocNoList.Clear;
if FileExists(ImageSavePath+CaseList.Strings[n]+'\CustomDocNo.dat') then
Cust_DocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\CustomDocNo.dat');
P := ContextList.Count;
MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[n],p]));
MytreeNode1.ImageIndex := 1;
MytreeNode1.SelectedIndex := 1;
//DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseList.Strings[n]); //長出文件名稱的樹並傳回是否有申請書的影像
DrawDocItem2(MytreeNode1,CaseList.Strings[n]); //長出文件名稱的樹並傳回是否有申請書的影像 20140820改
if Pos(_Msg('未配號'),CaseList.Strings[n]) > 0 then
begin
MytreeNode1.ImageIndex := 5;
MytreeNode1.SelectedIndex := 5;
end;
If FileExists(ImageSavePath+CaseList.Strings[n]+'\OMRCheckOk.dat') Then
begin
MytreeNode1.ImageIndex := 7;
MytreeNode1.SelectedIndex := 7;
CaseHelpBtn.Visible := False;
end
Else IF FileExists(ImageSavePath+CaseList.Strings[n]+'\Checkerr.ini') Then
begin
MyTreenode1.ImageIndex := 5;
MyTreenode1.SelectedIndex := 5;
//AllEnforceLb.Visible := True; //全部強迫送件
end;
end;
end;
MyTreenode1 := nil;
MyTreenode2 := nil;
If NewTreeNode <> nil Then
begin
TreeView1.Selected := NewTreeNode;
NewTreeNode.Expand(False);
end;
ContextList.Clear;
IF (NewTreeNode <> nil) and (NewTreeNode.Count > 0) Then
begin
GetCase_PageCount(CaseCount,PageCount);
v := Pos('-',NewTreeNode.Text);
NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]);
end;
end;
{ ==============================================================================
方法名稱:LoadAttFile
引用相依:FileExists, LoadFromFile
方法描述:載入指定案件的附件檔案。讀取 AttContext.dat,將附件檔名解碼後加入到 At
tListBox 列表中。
============================================================================== }
procedure TCB_IMGPSScanX.LoadAttFile(CaseID:String); //載入附加檔案
var
AttContextList : TStringlist;
i : Integer;
begin
AttListBox.Clear;
AttContextList := TStringlist.Create;
try
if FileExists(ImageSavePath+CaseID+'\AttContext.dat') then
begin
AttContextList.LoadFromFile(ImageSavePath+CaseID+'\AttContext.dat');
end;
for i := 0 to AttContextList.Count - 1 do
begin
AttListBox.Items.Add(UTF8Decode(HTTPDEcode(AttContextList.Strings[i])));
end;
finally
AttContextList.Free;
end;
end;
{ ==============================================================================
方法名稱:logTimeString
引用相依:
方法描述:產生帶有當前日期時間與案件編號的日誌前綴字串。
============================================================================== }
function TCB_IMGPSScanX.logTimeString: String;
begin
Result:=FormatDateTime('yyyymmdd hh:mm:ss',now) +' caseNo='+NowCaseno+' ';
end;
{ ==============================================================================
方法名稱:FindDivFormCode
引用相依:
方法描述:檢查特定的表單代碼是否具有「分案」屬性。從 FORM_INF_List 中查詢該表單的
DIVISION 欄位,判斷是否包含目前的作業模式(如 NSCAN/ISCAN)。
============================================================================== }
Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼
var
i : Integer;
DelBarCode : String;
S : TStringlist;
iMode : String;
begin
Result := False;
iMode := FMode;
S := TStringlist.Create;
try
IF FindSQLData(FORM_INF_List,'T1.FORM_ID,T1.DIVISION','T1.FORM_ID',FormCode,0,FindResult) then
begin
S.CommaText := GetFindResult('T1.DIVISION');
for i := 0 to S.Count - 1 do //可能有多組
begin
if S.Strings[i] = iMode then
begin
Result := True;
Break;
end;
end;
end;
finally
S.Free;
end;
end;
{ ==============================================================================
方法名稱:CheckAvailable
引用相依:FileExists, dnFile, dnFile_Get, upFile
方法描述:檢查元件的使用授權。透過 HTTPS 下載掃瞄授權檔,並驗證 MacID、註冊數量與
使用期限。若尚未註冊且仍有額度,則自動進行註冊並上傳新的授權檔至伺服器
。最後在狀態列顯示註冊資訊。
============================================================================== }
Function TCB_IMGPSScanX.CheckAvailable:Boolean; //檢查是否可使用元件
var
SendData : String;
Msg:String;
Nowcount,Totalcount,Lic_Idx : Integer;
MacID,IPStr,LegalDate :String;
begin
Result := False;
/////下載MPSLIC_SCAN.lic //////
SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_SCAN.lic';
if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+'MPSLIC_SCAN.lic',FReWrite,Memo1,False,DownImgStatus) then
begin
Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason);
Exit;
end;
/////下載MPSLIC_SCAN.lic ///
if CheckLicensebyIP_new(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,LegalDate,Msg,Nowcount,Totalcount,Lic_Idx) then //檢查是否己註冊過
begin
if (LegalDate <> '') and (ServerDate>LegalDate) and (Lic_Idx>(Totalcount)) then
begin
Showmessage(_Msg('已經超過可使用期限及超出授權數請連絡廠商'));
Result := False;
//Exit;
end
else
Result := True;
end
Else
begin
if Msg <> '' then
begin
Showmessage(Format(_Msg('註冊檔有問題,請連絡廠商 錯誤原因:%s'),[Msg]));
Result := false;
Exit;
end
Else
begin
if (LegalDate <> '') and (ServerDate>LegalDate) and (NowCount =0 ) then
begin
Lic_Idx := 0;
Showmessage(_Msg('已經超過可使用期限請連絡廠商'));
Result := False;
//Exit;
end
//else if (LegalDate = '') and (Nowcount >= Totalcount+10) then //超過註冊數量
else if ((LegalDate = '') or ((LegalDate <> '') and (ServerDate>LegalDate)) ) and (Nowcount >= Totalcount) then //超過註冊數量 20150717 yuu說拿掉送的10個
begin
Lic_Idx := 0;
Showmessage(_Msg('已經超過授權數請連絡廠商'));
Result := False;
end
Else //未超過註冊數量要寫入註冊檔
begin
{if Messagedlg(_Msg('您尚未註冊授權是否要進行註冊??'),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then
begin
Result := False;
Exit;
end;}
ShowText := _Msg('授權中,請稍候');
AddLicense(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,Msg);
Nowcount := Nowcount + 1;
DataLoading(True,True);
/////上傳MPSLICSCAN.lic ////
SendData:='data='+HTTPEncode(UTF8Encode(FData))+'@verify='+FVerify+'@work_no=PLN@file_name=MPSLIC_SCAN.lic';
if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',LngPath+'MPSLIC_SCAN.lic',FReWrite,Memo1,False) then
begin
Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')');
DataLoading(False,False);
Exit;
end;
if memo1.Lines.Strings[0] = '1' then
begin
Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]);
DataLoading(False,False);
Exit;
end
Else if Pos('',Memo1.Lines.Text) > 0 then
begin
Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'));
DataLoading(False,False);
Exit;
end;
/////上傳MPSLICSCAN.lic /////
//Sleep(30000); //第一次註冊睡30秒 先不睡
Result := True;
end;
end;
end;
if FileExists(LngPath+'MPSLIC_SCAN.lic') then
DeleteFile(LngPath+'MPSLIC_SCAN.lic');
if LegalDate = '' then
StatusBar1.Panels[4].Text := Format(_Msg('註冊號:%s 剩餘註冊數:%s'),[MacID,inttostr(Totalcount-Nowcount)]);
if LegalDate <> '' then
StatusBar1.Panels[4].Text := '*'+Format(_Msg('註冊號:%s 剩餘註冊數:%s'),[MacID+'('+inttostr(Lic_Idx)+')',inttostr(Totalcount-Nowcount)]);
end;
{ ==============================================================================
方法名稱:SmoothCBClick
引用相依:Image_Smooth
方法描述:處理「影像平滑化」勾選框。若勾選,則對 ISB1 的影像執行平滑化處理並重新繪
製。
============================================================================== }
procedure TCB_IMGPSScanX.SmoothCBClick(Sender: TObject);
begin
if SmoothCB.Checked then
begin
Image_Smooth(ISB1.Graphic);
ISB1.Redraw(True);
end;
end;
{ ==============================================================================
方法名稱:Case2Mask
引用相依:DirectoryExists, FileExists, FindPoint, LoadFromFile, Str2Dir, _DelT
ree
方法描述:產生案件的遮罩影像(用於遮蔽敏感個資)。讀取 Context.dat,針對每張影像尋
找定位點,並依據對應表單的 XML 定義執行區域遮罩,最後存入指定目錄。
============================================================================== }
Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像 20170639 發現沒用到
var
XT : TXMLTool;
i : Integer;
S : TStringlist;
SiteList : TStringlist;
FormID : String;
ColEName : String;
FileName : String;
nodename : String;
Site : String;
Anchor : String;
begin
Result := False;
if DirectoryExists(DePath) then
_DelTree(DePath);
Str2Dir(DePath);
DeleteFile(SoPath+'MaskImg.zip');
SiteList := TStringlist.Create;
S := TStringlist.Create;
XT := TXMLTool.Create;
try
S.LoadFromFile(SoPath+'Context.dat');
for I := 0 to S.Count - 1 do
begin
SiteList.Clear;
ImageScrollBox1.LoadFromFile(SoPath+S.Strings[i],1);
FormID := FileName2FormCode(S.Strings[i]);
Anchor := FormID2Anchor(FormID);
//ParserPoint(CropMpsV.FindPoint(Anchor));
FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,Anchor);
if FileExists(CheckXmlPath+FWork_no+'\'+FormID+'.xml') then //沒有Xml就不用遮罩
begin
XT.LoadFromFile(CheckXmlPath+FWork_no+'\'+FormID+'.xml');
if XT.SubNodes['/form/settype10/'].First then
Repeat
ColEName := XT.SubNodes['/form/settype10/'].NodeName;
if XT.SubNodes['/form/settype10/'+ColEName+'/'].First then
Repeat
nodename := XT.SubNodes['/form/settype10/'+ColEName+'/'].NodeName;
If nodename <> '@coldesc' then
begin
Site := XT.Node['/form/settype10/'+ColEName+'/'+nodename+'/'].Attributes['colxy'];
SiteList.Add(Site);
Result := True; //有設定
end
Else
begin
//ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/'];
end;
Until not XT.SubNodes['/form/settype10/'+ColEName+'/'].Next;
Until not XT.SubNodes['/form/settype10/'].Next ;
FieldMask(ImageScrollBox1,SiteList.Text,'Mask',UpLPoint);
end;
SaveAnnotation(ImageScrollBox1,DePath+S.Strings[i]);
end;
finally
SiteList.Free;
S.Free;
XT.Free;
end;
end;
{ ==============================================================================
方法名稱:DelAttFileLBClick
引用相依:
方法描述:處理「刪除附件電子檔」點擊。確認使用者選取的檔案後,從磁碟刪除實體檔案並
呼叫 SetAttContextList 移除清單記錄。完成後重新載入附件清單並提示。
============================================================================== }
procedure TCB_IMGPSScanX.DelAttFileLBClick(Sender: TObject);
var
AttFile : String;
SelectCount : Integer;
i : Integer;
begin
SelectCount := 0;
for i := 0 to AttListBox.Items.Count - 1 do
begin
if AttListBox.Selected[i] then
inc(SelectCount);
end;
if SelectCount = 0 then
begin
Showmessage(_Msg('請選擇要刪除的電子檔'));
Exit;
end;
if SelectCount > 0 then
begin
if Messagedlg(Format(_Msg('是否刪除這%d筆??'),[SelectCount]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
for i := 0 to AttListBox.Items.Count - 1 do
begin
if AttListBox.Selected[i] then
begin
AttFile := HTTPEncode(UTF8Encode(AttListBox.Items.Strings[i]));
DeleteFile(ImageSavePath+NowCaseNo+'\'+AttFile);
SetAttContextList('D',-1,NowCaseno,AttFile);
end;
end;
end;
LoadAttFile(NowCaseNo);
Showmessage(_msg('刪除完成'));
end;
{ ==============================================================================
方法名稱:CheckFormID_Prt
引用相依:
方法描述:查詢指定表單(FormID)是否被設定為預設列印。透過 FORM_INF_List 檢核 IS_
PRINT 欄位是否為 'Y'。
============================================================================== }
Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印
begin
Result := False;
If FindSQLData(FORM_INF_List,'T1.IS_PRINT','T1.FORM_ID',FormID,0,FindResult) Then
begin
if GetFindResult('T1.IS_PRINT') = 'Y' Then
Result := True;
end;
end;
{ ==============================================================================
方法名稱:PrintImg
引用相依:TDibGraphic
方法描述:執行影像列印的核心程序。開啟列印對話框供選擇印表機,隨後遍歷檔案清單,
逐一載入影像、套用浮水印後發送至印表機。支援多頁列印於同一個任務或分頁
處理。
============================================================================== }
procedure TCB_IMGPSScanX.PrintImg(FileName, LoginID, Datetime,
Path: WideString);
var
PrintMode : TEnvisionPrintMode;
GraphicPrinter : TDibGraphicPrinter;
PrtDialog : TPrintDialog;
S : TStringlist;
i,Pages,Page : Integer;
Prt_String : String;
Prt_H : Integer;
procedure PrintWithManualPrintJob(LoginID,DateTime:String;Pages,Page:Integer);
begin
If Page = 1 Then
begin
{ if UsePrintJob is False, Printer.BeginDoc and Printer.EndDoc must be
called by the user. This allows printing multiple images in the
same job (or page). }
GraphicPrinter.UsePrintJob := False;
{ if UsePrintJob is False, the print job name that appears in the
print manager must be specified in using the Title property of the
Printer object. Otherwise, if UsePrintJob is True, the Title
property of the TDibGraphicPrinter object is used to specify the
job name. }
Printer.Title := _Msg('影像列印');
end;
IF (Page mod 2) = 1 Then
Printer.BeginDoc
Else
Printer.NewPage;
ImageScrollBox1.DisplayedGraphic.Canvas.Font.Size := 24;
//ImageScrollBox1.DisplayedGraphic.Canvas.TextOut(20,20, _Msg('列印人員:')+LoginID+' '+_Msg('列印分行:')+FUserUnit+' '+_Msg('列印日期:')+DateTime);
GraphicPrinter.Print(ImageScrollBox1.DisplayedGraphic);
{ this shows how to print text on a page.
Printer.Canvas.TextOut(10,10, 'Envision Image Library');
}
If ((Page mod 2) = 0) or (Page = pages) Then
Printer.EndDoc;
end;
procedure PrintWithAutoPrintJob;
begin
GraphicPrinter.UsePrintJob := True;
GraphicPrinter.Title := _Msg('影像列印');
GraphicPrinter.Print(ImageScrollBox1.Graphic);
end;
begin
S := TStringlist.Create;
GraphicPrinter := TDibGraphicPrinter.Create;
PrtDialog := TPrintDialog.Create(self);
//PrtDialog.Copies:=99;
try
IF PrtDialog.Execute Then
begin
S.Text := FileName;
Pages := S.Count;
for i := 0 to S.Count -1 do
begin
ImageScrollBox1.LoadFromFile(Path+S.Strings[i],1);
watermark2(Image1.Picture.Bitmap,70,'',ImageScrollBox1.DisplayedGraphic);
PrintWithManualPrintJob(LoginID,DateTime,Pages,i+1);
end;
end;
Finally
PrtDialog.Free;
GraphicPrinter.Free;
S.Free;
end;
end;
{ ==============================================================================
方法名稱:FindLastestDocDir
引用相依:FileExists, LoadFromFile
方法描述:針對指定的文件編號,從 CaseDocNo.dat 中反向尋找最新的份數目錄名稱(例
如 A001(2))。
============================================================================== }
Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir
var
i : Integer;
DocNoList,FileList : TStringlist;
begin
Result := '';
DocNoList := TStringlist.Create;
FileList := TStringlist.Create;
try
if FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then
DocNoList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
for i := DocNoList.Count-1 downto 0 do
begin
if Copy(DocNoList.Strings[i],1,length(DocNo)) = DocNo then
begin
Result := DocNoList.Strings[i];
Break;
end;
end;
finally
DocNoList.Free;
FileList.Free;
end;
end;
{ ==============================================================================
方法名稱:FindLastestDocDirForPage
引用相依:FileExists, LoadFromFile
方法描述:類似 FindLastestDocDir,但額外呼叫 DocNoIsExistImg 確保該目錄下確實存
在影像檔案,若為空目錄則不視為有效結果。
============================================================================== }
Function TCB_IMGPSScanX.FindLastestDocDirForPage(CaseID,DocNo,formid:String):String; //找出最新的DocDir 20180207 排除隱藏的資料夾
var
i,j:integer;
DocNoList,FileList : TStringlist;
Imglist: TStringlist;
DirIsHide:Boolean;
begin
Result := '';
DocNoList := TStringlist.Create;
FileList := TStringlist.Create;
imglist := TStringlist.Create;
try
if FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then
DocNoList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat');
for i := DocNoList.Count-1 downto 0 do
begin
if Copy(DocNoList.Strings[i],1,length(DocNo)) = DocNo then
begin
//ShowMessage(ImageSavePath+CaseID+'\'+DocNoList.Strings[i]);
if not DocNoIsExistImg(ImageSavePath+CaseID+'\'+DocNoList.Strings[i]+'\') then
begin
//ShowMessage('DDDDD');
Result := '';
Break;
end
else
begin
Result := DocNoList.Strings[i];
Break;
end;
end;
end;
finally
DocNoList.Free;
FileList.Free;
imglist.Free;
end;
end;
{ ==============================================================================
方法名稱:SortDocDir_FormID
引用相依:FileExists, LoadFromFile, RenameFile, SaveToFile
方法描述:對文件目錄內的影像檔案依表單代碼(FormID)進行重新排序。先提取所有檔案
的 FormID 並排序,依序產生新檔名進行更名,最後更新 Context.dat 檔案順
序。
============================================================================== }
Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序
var
i,n,v,ln : Integer;
Exists:Boolean;
FileList,SortFileList,FormIDList : TStringlist;
FormID,iFormID:String;
OldName,NewName : String;
begin
FileList := TStringlist.Create;
SortFileList := TStringlist.Create;
FormIDList := TStringlist.Create;
try
if FileExists(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat') then
begin
FileList.LoadFromFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat');
////取出FormID/////
for i := 0 to FileList.Count - 1 do
begin
FormID := FileName2FormCode(FileList.Strings[i]);
if (FormID = 'Attach') or (FormID = 'S_Attach') then Continue; //附件離開
Exists := False;
for n := 0 to FormIDList.Count - 1 do //查一下FORMID是否已經存在了
begin
if FormID = FormIDList.Strings[n] then
begin
Exists := True;
Break;
end;
end;
if not Exists then
FormIDList.Add(FormID);
end;
FormIDList.Sort;
//排序後產要更名的清單
for i := 0 to FormIDList.Count - 1 do
begin
iFormID := FormIDList.Strings[i];
for n := 0 to FileList.Count - 1 do
begin
if FileName2FormCode(FileList.Strings[n]) = iFormID then
begin
SortFileList.Add(FileList.Strings[n]+','+'@'+Add_Zoo(SortFileList.Count+1,3)+'_'+iFormID+ExtractFileExt(FileList.Strings[n]));
end;
end;
end;
FileList.Clear;
//更名成新順序的檔名
for i := 0 to SortFileList.Count - 1 do
begin
v := Pos(',',SortFileList.Strings[i]);
ln := Length(SortFileList.Strings[i]);
OldName := Copy(SortFileList.Strings[i],1,v-1);
NewName := Copy(SortFileList.Strings[i],v+1,ln-v);
RenameFile(ImageSavePath+CaseID+'\'+DocDir+'\'+OldName,ImageSavePath+CaseID+'\'+DocDir+'\'+NewName);
FileList.Add(NewName);
end;
//去掉@開頭
for i := 0 to FileList.Count - 1 do
begin
OldName := FileList.Strings[i];
NewName := StringReplace(OldName,'@','',[rfReplaceAll]);
ReNameFile(ImageSavePath+CaseID+'\'+DocDir+'\'+OldName,ImageSavePath+CaseID+'\'+DocDir+'\'+NewName);
FileList.Strings[i] := NewName;
end;
FileList.SaveToFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat');
end;
finally
FileList.Free;
SortFileList.Free;
FormIDList.Free;
end;
end;
{ ==============================================================================
方法名稱:GotoAttach
引用相依:
方法描述:將樹狀結構的焦點跳轉至案件的附件節點。
============================================================================== }
Procedure TCB_IMGPSScanX.GotoAttach(OldLevel:Integer);
var
i : Integer;
begin
for i := 0 to MyTreeNode1.Count - 1 do
begin
if Pos('Attach',MyTreeNode1.Item[i].Text) > 0 then
begin
if OldLevel = 2 then
begin
TreeView1.Selected := MyTreeNode1.Item[i];
end
else if OldLevel = 3 then
begin
TreeView1.Selected := MyTreeNode1.Item[i].Item[0];
end;
Break;
end;
end;
//TreeView1click(nil);
end;
{ ==============================================================================
方法名稱:SetDocDirtoSelected
引用相依:
方法描述:在樹狀結構中自動選取符合指定目錄名稱的節點。
============================================================================== }
Procedure TCB_IMGPSScanX.SetDocDirtoSelected(CaseNode:TTreeNode;DocDir:String);
var
i : Integer;
begin
for i := 0 to CaseNode.Count - 1 do
begin
if Pos(DocDir+'{',CaseNode.Item[i].Text) > 0 then
begin
TreeView1.Selected := CaseNode.Item[i];
end;
end;
end;
{ ==============================================================================
方法名稱:CheckSelectImg_UseCase
引用相依:
方法描述:檢查當前選取的影像所在的文件目錄是否已被其他程序引用(UseKey 標記為 '
T')。
============================================================================== }
Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像
var
i : Integer;
iISBName : String;
iISB : TImageScrollBox;
ImgPath,DocDir : String;
begin
Result := False;
for i := 0 to ComponentCount -1 do
begin
if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then
begin
//Showmessage(Components[i].Name);
iISBName := ShapeName2PreViewISBName(TShape(Components[i]));
iISB := TImageScrollBox(FindComponent(iISBName));
ImgPath := ExtractFilePath(iISB.FileName);
DocDir := Path2DocDir(ImgPath,CaseID);
if GetUseCase('T',Path,DocDir) <> '' then
Result := True;
end;
end;
end;
{ ==============================================================================
方法名稱:ISExistImg
引用相依:LoadFileGetMD5
方法描述:透過 MD5 雜湊值比對,檢查指定的影像檔案是否已存在於 ExistImgList 清單
中。
============================================================================== }
function TCB_IMGPSScanX.ISExistImg(const filename: string): boolean;
begin
if ExistImgList.IndexOf(LoadFileGetMD5(filename))<>-1 then
begin
Result:=True;
end
else
begin
Result:=False;
end;
end;
{ ==============================================================================
方法名稱:MoveImage
引用相依:LoadFromFile, ReSortFileName, RenameFile, SaveToFile
方法描述:執行影像頁面的位置移動。先對目錄下所有檔案進行臨時更名(加上 @ 標記),
根據選取狀態重新排列清單順序,最後更新 Context.dat 並重新排序實體檔案
。
============================================================================== }
Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //移動頁數
var
i,n,inx:Integer;
FList,D_Flist:TStringlist;
begin
FList := TStringlist.Create;
D_Flist := TStringlist.Create;
try
FList.LoadFromFile(Path+'Context.dat');
//Showmessage(Path);
//Showmessage(Flist.Text);
for i := 0 to FList.Count - 1 do
begin
Renamefile(Path+Flist.Strings[i],path+'@'+Flist.Strings[i]);
Flist.Strings[i]:= '@'+Flist.Strings[i];
end;
for i := 0 to ComponentCount -1 do
begin
if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then
begin
inx := strtoint(Copy(TShape(Components[i]).Name,3,length(TShape(Components[i]).Name)-2));
D_Flist.Add(Flist.Strings[inx-1]);
//Renamefile(Path+Flist.Strings[inx-1],path+'@'+Flist.Strings[inx-1]);
end;
end;
//Showmessage('aa');
for i := 0 to D_Flist.Count -1 do
begin
for n := 0 to FList.Count - 1 do
begin
//if Flist.Strings[n]=StringReplace(D_Flist.Strings[i],'@','',[rfReplaceAll]) then
if Flist.Strings[n]=D_Flist.Strings[i] then
begin
Flist.Delete(n);
Break;
end;
end;
end;
//Showmessage('bb');
for i := 0 to D_Flist.Count - 1 do
begin
Flist.Insert(mp-1+i,D_Flist.Strings[i]);
end;
Flist.SaveToFile(Path+'Context.dat');
//Showmessage(Flist.Text);
//Showmessage('CC');
ReSortFileName(Path);
TreeView1click(self);
finally
FList.Free;
D_Flist.Free;
end;
end;
{ ==============================================================================
方法名稱:MoveImage_Drag
引用相依:LoadFromFile, ReSortFileName, RenameFile, SaveToFile
方法描述:處理影像拖拉移動。邏輯與 MoveImage 相似,但針對單一來源索引移動至目標
索引的情境進行排列。
============================================================================== }
Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數
var
i,n,inx:Integer;
FList,D_Flist:TStringlist;
begin
FList := TStringlist.Create;
D_Flist := TStringlist.Create;
try
FList.LoadFromFile(Path+'Context.dat');
for i := 0 to FList.Count - 1 do
begin
Renamefile(Path+Flist.Strings[i],path+'@'+Flist.Strings[i]);
Flist.Strings[i]:= '@'+Flist.Strings[i];
end;
D_Flist.Add(Flist.Strings[fp-1]);
{for i := 0 to ComponentCount -1 do
begin
if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then
begin
inx := strtoint(Copy(TShape(Components[i]).Name,3,length(TShape(Components[i]).Name)-2));
D_Flist.Add(Flist.Strings[inx-1]);
//Renamefile(Path+Flist.Strings[inx-1],path+'@'+Flist.Strings[inx-1]);
end;
end;}
//Showmessage('aa');
for i := 0 to D_Flist.Count -1 do
begin
for n := 0 to FList.Count - 1 do
begin
//if Flist.Strings[n]=StringReplace(D_Flist.Strings[i],'@','',[rfReplaceAll]) then
if Flist.Strings[n]=D_Flist.Strings[i] then
begin
Flist.Delete(n);
Break;
end;
end;
end;
//Showmessage('bb');
for i := 0 to D_Flist.Count - 1 do
begin
Flist.Insert(tp-1+i,D_Flist.Strings[i]);
end;
Flist.SaveToFile(Path+'Context.dat');
//Showmessage(Flist.Text);
//Showmessage('CC');
ReSortFileName(Path);
TreeView1click(self);
finally
FList.Free;
D_Flist.Free;
end;
end;
{ ==============================================================================
方法名稱:PriorPage
引用相依:
方法描述:跳轉至上一頁影像。根據當前頁碼尋找前一個影像捲軸盒組件(ISB),若存在則
觸發其點擊事件。
============================================================================== }
Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //上一頁
var
iISB : TImageScrollBox;
begin
iISB := TImageScrollBox(FindComponent(ISBName+inttostr(Page-1)));
if iISB <> nil then
begin
ISBClick(iISB);
end;
end;
{ ==============================================================================
方法名稱:NextPage
引用相依:
方法描述:跳轉至下一頁影像。根據當前頁碼尋找下一個影像捲軸盒組件(ISB),若存在則
觸發其點擊事件。
============================================================================== }
Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //下一頁
var
iISB : TImageScrollBox;
begin
iISB := TImageScrollBox(FindComponent(ISBName+inttostr(Page+1)));
if iISB <> nil then
begin
ISBClick(iISB);
end;
end;
{ ==============================================================================
方法名稱:view_image_FormCode
引用相依:LoadFromFile
方法描述:根據表單代碼(FormCode)顯示對應的影像。支援顯示全部影像(ShowAll)或指定
表單的影像。若是顯示全部,會重置視窗並建立縮圖;若指定特定表單,則遍歷 C
ontextList 尋找匹配的檔案,載入至影像捲軸盒(ISB),並設定縮放模式(zmFit
toPage 或指定百分比)與捲軸位置,最後更新頁碼標籤資訊。
============================================================================== }
procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像
var i,p:integer;
ISB : TImageScrollBox;
lb : TLabel;
v ,v1 : Integer;
page : Integer;
List_FormCode,Err_FormCode: String;
iFormID : String;
begin
ShowText := _Msg('影像顯示中,請稍候');
DataLoading(True,True);
IF FormCode = 'ShowAll' then //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll)
begin
ClearView(1);
CreatePreViewISB(ContextList.Count);
For i := Stpage-1 to ContextList.Count -1 do
begin
ISB := TImageScrollBox(FindComponent(ISBName+intToStr(stview+i)));
ISB.AntiAliased := True;
if ISB.ZoomPercent > 100 then
ISB.AntiAliased := False;
ISB.LoadFromFile(Path+ContextList.Strings[i],1);
{GetScrollData(ISB,HS,VS,iRate);
if iRate = 0 then
ISB.ZoomMode := zmFittoPage
Else
ISB.ZoomPercent := iRate;
ISB.HorzScrollBar.Position := HS;
ISB.VertScrollBar.Position := VS;
List_FormCode := FileName2FormCode(ContextList.Strings[i]);
lb := TLabel(FindComponent('lb'+intToStr(stview)));
lb.Caption := Format(_Msg('第%s頁'),[Add_Zoo(i+1,3)]);
If List_FormCode = '' Then
lb.Caption := lb.Caption+'('+FormCode2FormName(List_FormCode)+')'
Else
lb.Caption := lb.Caption+'('+FormCode2FormName(List_FormCode)+'-'+List_FormCode+')';
Inc(Stview);
If ((VMode = 0) and (Stview>1))
or ((VMode = 1) and ((Stview>2)))
or ((VMode = 2) and ((Stview>4)))
or ((VMode = 3) and ((Stview>6)))
or ((VMode = 4) and ((Stview>8))) Then
break;
}
end;
FitPreViewISB;
end
Else //顯示指定FormCode的影像
begin
If (TreeView1.Selected <> nil) Then
begin
If Stpage = 0 Then
Stpage := 1;
Page := 0;
ClearView(stview);
If Stpage > ContextList.Count Then Exit;
For i := 0 to ContextList.Count -1 do
begin
List_FormCode := FileName2FormCode(ContextList.Strings[i]);
{iFormID := GetMainFormID(List_FormCode);
if iFormID <> '' then
List_FormCode := iFormID;}
Err_FormCode := 'NoCode';
if (List_Formcode <> '') and (not FormIDExists(List_Formcode,False,0)) then
Err_FormCode := 'Err';
IF (List_FormCode = FormCode) or (Err_FormCode=Formcode) or (FormCode2DocNo(List_FormCode) = FormCode) Then
begin
Inc(Page);
IF Page< Stpage Then
Continue;
ISB := TImageScrollBox(FindComponent('ISB'+intToStr(stview)));
ISB.AntiAliased := True;
if ISB.ZoomPercent > 100 then
ISB.AntiAliased := False;
ISB.LoadFromFile(Path+ContextList.Strings[i],1);
GetScrollData(ISB,HS,VS,iRate);
if iRate = 0 then
ISB.ZoomMode := zmFittoPage
Else
ISB.ZoomPercent := iRate;
ISB.HorzScrollBar.Position := HS;
ISB.VertScrollBar.Position := VS;
{if not SortMode then
begin
SetScrollData(MPSViewX,MPSViewX.HorzScrollBarPos,MPSViewX.VertScrollBarPos,MPSViewX.ZoomPercent);
end;}
//MPSViewX.ImageZoomMode := zmFullpage;
//MPSViewX.AntiAliased := True;
lb := TLabel(FindComponent('lb'+intToStr(stview)));
lb.Caption := Format(_Msg('第%s頁'),[Add_Zoo(i+1,3)]);
If List_FormCode = '' Then
lb.Caption := lb.Caption+'('+FormCode2FormName(NowCaseno,List_FormCode)+')'
Else
lb.Caption := lb.Caption+'('+FormCode2FormName(NowCaseNo,List_FormCode)+'-'+List_FormCode+')';
Inc(Stview);
end;
If ((VMode = 0) and (Stview>1))
or ((VMode = 1) and ((Stview>2)))
or ((VMode = 2) and ((Stview>4)))
or ((VMode = 3) and ((Stview>6)))
or ((VMode = 4) and ((Stview>8))) Then
break;
end;
end;
end;
ISB1Click(ISB1);
DataLoading(False,False);
end;
{ ==============================================================================
方法名稱:view_image_DocNo
引用相依:DirectoryExists, DpiResize, FileExists, LoadFromFile
方法描述:根據文件代號(DocNo)或表單代號(FormID)顯示影像。函式包含三種模式:顯示
案件內所有影像(ShowAll)、顯示指定文件夾(如 Attach)下的影像,以及顯示指
定文件代號下特定表單的影像。處理過程中會檢查在席狀態(In_WH)、執行影像
DPI 調整、建立縮圖預覽視窗,並逐一載入檔案至對應的 ISB 元件中,最後自動
點擊首張影像以進行預覽。
============================================================================== }
procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像
var i,n,p:integer;
ISB : TImageScrollBox;
lb : TLabel;
v ,v1 : Integer;
List_DocNo,Trans_DocNo,List_FormCode,Form_Page: String;
iDocNo : String;
iGroupNo,page,Ct,int1 : Integer;
ST1:TStringList;
begin
ShowText := _Msg('影像顯示中,請稍候');
DataLoading(True,True);
ST1:=TStringList.Create;
//Display1.Lines.Clear;
IF DocNo = 'ShowAll' then //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll)
begin
ClearView(1);
if GetCasePage(ImageSavePath,NowCaseno) > 30 then
begin
DataLoading(False,False);
Exit;
end;
CreatePreViewISB(GetCasePage(ImageSavePath,NowCaseno));
//Showmessage(inttostr(GetCasePage(ImageSavePath,NowCaseno)));
Ct := 0;
For i := 0 to CaseDocNoList.Count-1 do
begin
if (FWH_category='N') and (FIs_In_Wh='Y') then
begin
if FileExists(ImageSavePath+NowCaseno+'\EditedDocDir.dat') then
begin
ST1.LoadFromFile(ImageSavePath+NowCaseno+'\EditedDocDir.dat');
end;
end;
iDocNo := CaseDocNoList.Strings[i];
//ShowMessage('ST1.Count='+IntToStr(ST1.Count));
if ST1.Count<>0 then
begin
if ST1.IndexOf(iDocNo)<>-1 then
begin
end
else
begin
if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue; //20170817 這不能被註解
end;
end
else
begin
if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue; //20170817 這不能被註解
end;
ContextList.Clear;
if FileExists(Path+iDocNo+'\Context.dat') then
ContextList.LoadFromFile(Path+iDocNo+'\Context.dat');
//ShowMessage('ContextList='+ContextList.Text);
for n := 0 to ContextList.Count - 1 do
begin
if (FWH_category='N') and (FIs_In_Wh='Y') then
begin
if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[n]) then
begin
if not DocNoIs_In_WH(Copy(iDocNo,1,8)) then
begin
Continue;
end;
end;
end;
inc(Ct);
ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct)));
ISB.AntiAliased := True;
if ISB.ZoomPercent > 100 then
ISB.AntiAliased := False;
ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1);
DpiResize(ISB.Graphic,36,False);
ISB.Redraw(true);
end;
end;
//if DirectoryExists(Path+'Attach') then
if DirectoryExists(Path+AttName) then
begin
//iDocNo := 'Attach';
iDocNo := AttName;
ContextList.Clear;
if FileExists(Path+iDocNo+'\Context.dat') then
ContextList.LoadFromFile(Path+iDocNo+'\Context.dat');
for n := 0 to ContextList.Count - 1 do
begin
inc(Ct);
ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct)));
ISB.AntiAliased := True;
if ISB.ZoomPercent > 100 then
ISB.AntiAliased := False;
ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1);
end;
end;
FitPreViewISB;
end
Else if (DocNo <> '') and (FormID = '') then //顯示指定DocNo+組別的影像 附件傳 Attach
begin //顯示 文件層下的影像
iDocNo := DocNo;
ContextList.Clear;
if FileExists(Path+iDocNo+'\Context.dat') then
ContextList.LoadFromFile(Path+iDocNo+'\Context.dat');
//ShowMessage('ContextList.Count='+IntToStr(ContextList.Count));
CreatePreViewISB(ContextList.Count);
//ShowMessage(IntToStr(ContextList.Count));
int1:=0;
//ShowMessage(BoolToStr(DocNoIs_In_WH(Copy(iDocNo,1,8)),true));
For i := 0 to ContextList.Count -1 do
begin
if (FWH_category='N') and (FIs_In_Wh='Y') then
begin
if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]) then
begin
if not DocNoIs_In_WH(Copy(iDocNo,1,8)) and ( iDocNo<>'Attach') then
begin
inc(int1);
Continue;
end;
end;
end;
//ShowMessage(Path+iDocNo+'\'+ContextList.Strings[i]);
ISB := TImageScrollBox(FindComponent(ISBName+intToStr(i+1-int1)));
ISB.AntiAliased := True;
if ISB.ZoomPercent > 100 then
ISB.AntiAliased := False;
ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[i],1);
DpiResize(ISB.Graphic,36,False);
ISB.Redraw(true);
end;
FitPreViewISB;
end
Else if (FormID <> '') {and (FormID <> 'Attach')} then //顯示指定FormID的影像
begin
If (TreeView1.Selected <> nil) Then
begin
iDocNo := DocNo;
ContextList.Clear;
if FileExists(Path+iDocNo+'\Context.dat') then
ContextList.LoadFromFile(Path+iDocNo+'\Context.dat');
iGroupNo := 0;
page := 0;
Ct := 0;
CreatePreViewISB(Pages);
//ShowMessage('formID page'+IntToStr(Pages)+', ContextList='+ContextList.Text);
For i := 0 to ContextList.Count -1 do
begin
if FileName2FormCode(ContextList.Strings[i]) = FormID then
begin
if (FWH_category='N') and (FIs_In_Wh='Y') then
begin
//ShowMessage(Path+iDocNo+'\'+ContextList.Strings[i]);
//ShowMessage(BoolToStr(ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]),true));
if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]) then
begin
if not DocNoIs_In_WH(FormCode2DocNo(FormID)) then
Continue;
end;
end;
inc(Ct);
ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct)));
//ShowMessage(ISB.Name);
ISB.AntiAliased := True;
if ISB.ZoomPercent > 100 then
ISB.AntiAliased := False;
ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[i],1);
DpiResize(ISB.Graphic,36,False);
ISB.Redraw(true);
//NowShowFileList.Add(ContextList.Strings[i]);
end;
end;
FitPreViewISB;
end;
end;
if FindComponent(ISBName+'1') <> nil then
begin
ISBClick(TImageScrollBox(FindComponent(ISBName+'1')));
end;
ISB1Click(ISB1);
DataLoading(False,False);
end;
{ ==============================================================================
方法名稱:CB1Click
引用相依:
方法描述:處理核取方塊點擊,設定是否要在掃描時顯示 TWAIN 使用者介面(TwainShowUI
)。
============================================================================== }
procedure TCB_IMGPSScanX.CB1Click(Sender: TObject);
begin
TwainShowUI := CB1.Checked;
end;
{ ==============================================================================
方法名稱:ViewModeBtnMouseEnter
引用相依:
方法描述:當滑鼠進入檢視模式按鈕時,顯示該按鈕的 Hint 文字作為工具提示(Tooltip)
。
============================================================================== }
procedure TCB_IMGPSScanX.ViewModeBtnMouseEnter(Sender: TObject);
begin
AddToolTip(TBitBtn(Sender).Parent.Handle,nil,0,Pchar(TBitBtn(Sender).Hint),nil,0,0);
end;
{ ==============================================================================
方法名稱:Set_caseid
引用相依:
方法描述:設定內部變數 FCaseID 的值。
============================================================================== }
procedure TCB_IMGPSScanX.Set_caseid(const Value: WideString);
begin
FCaseID := Value;
end;
{ ==============================================================================
方法名稱:Set_data
引用相依:
方法描述:設定內部變數 FData 的值。
============================================================================== }
procedure TCB_IMGPSScanX.Set_data(const Value: WideString);
begin
FData := Value;
end;
{ ==============================================================================
方法名稱:Set_mode
引用相依:
方法描述:設定作業模式(FMode),並將傳入的字串轉換為大寫。
============================================================================== }
procedure TCB_IMGPSScanX.Set_mode(const Value: WideString);
begin
FMode := UpperCase(Value);
end;
{ ==============================================================================
方法名稱:Set_rewrite
引用相依:
方法描述:設定是否強制覆蓋檔案的標記(FReWrite)。
============================================================================== }
procedure TCB_IMGPSScanX.Set_rewrite(const Value: WideString);
begin
FReWrite := Value;
end;
{ ==============================================================================
方法名稱:Set_url
引用相依:
方法描述:設定後端伺服器的基礎 URL 路徑。
============================================================================== }
procedure TCB_IMGPSScanX.Set_url(const Value: WideString);
begin
FUrl := Value;
end;
{ ==============================================================================
方法名稱:Set_userid
引用相依:
方法描述:設定當前登入的使用者代號。
============================================================================== }
procedure TCB_IMGPSScanX.Set_userid(const Value: WideString);
begin
FUserID := Value;
end;
{ ==============================================================================
方法名稱:Set_username
引用相依:
方法描述:設定當前登入的使用者名稱。
============================================================================== }
procedure TCB_IMGPSScanX.Set_username(const Value: WideString);
begin
FUserName := Value;
end;
{ ==============================================================================
方法名稱:Set_verify
引用相依:
方法描述:設定 API 呼叫所需的驗證字串。
============================================================================== }
procedure TCB_IMGPSScanX.Set_verify(const Value: WideString);
begin
FVerify := Value;
end;
{ ==============================================================================
方法名稱:Set_language
引用相依:FileExists
方法描述:設定語系代碼並執行初始化。會自動修正語系格式(如 zh-tw 轉 zh_tw),若語
言檔存在則觸發介面語系切換。
============================================================================== }
procedure TCB_IMGPSScanX.Set_language(const Value: WideString);
begin
FLanguage := lowercase(Value);
if FLanguage='zh-tw' then
begin
FLanguage:='zh_tw'
end;
if FileExists(LngPath+'Language.lng') then
begin
InitialLanguage(Self); //載入多國語言
end;
end;
{ ==============================================================================
方法名稱:Set_modename
引用相依:
方法描述:設定作業模式的顯示名稱。
============================================================================== }
procedure TCB_IMGPSScanX.Set_modename(const Value: WideString);
begin
FModeName := Value;
end;
{ ==============================================================================
方法名稱:Set_userunit
引用相依:
方法描述:設定使用者所屬的單位代碼。
============================================================================== }
procedure TCB_IMGPSScanX.Set_userunit(const Value: WideString);
begin
FUserUnit := Value;
end;
{ ==============================================================================
方法名稱:Set_work_no
引用相依:
方法描述:設定當前的業務別(WORK_NO)。
============================================================================== }
procedure TCB_IMGPSScanX.Set_work_no(const Value: WideString);
begin
FWork_no := Value;
end;
{ ==============================================================================
方法名稱:Set_loandoc_enable
引用相依:
方法描述:設定信用註記功能是否啟用。根據參數(Y/I)動態切換 AddCredit1RG 元件的可
用性與可見度。
============================================================================== }
procedure TCB_IMGPSScanX.Set_loandoc_enable(const Value: WideString);
begin
FLoanDoc_Enable := Value;
if FLoanDoc_Enable = 'Y' then
AddCredit1RG.Enabled := True;
if FLoanDoc_Enable = 'I' then
begin
AddCredit1RG.Visible := False;
Panel5.Visible := False;
end;
end;
{ ==============================================================================
方法名稱:Set_loandoc_value
引用相依:
方法描述:設定信用註記的具體數值。
============================================================================== }
procedure TCB_IMGPSScanX.Set_loandoc_value(const Value: WideString);
begin
FLoanDoc_Value := Value;
end;
{ ==============================================================================
方法名稱:Set_useproxy
引用相依:
方法描述:設定系統是否使用 Proxy 代理伺服器進行網路連線。
============================================================================== }
procedure TCB_IMGPSScanX.Set_useproxy(const Value: WideString);
begin
FUseProxy := UpperCase(Value);
if FUseProxy = 'Y' then
UseProxy := True; //要不要用Proxy
end;
{ ==============================================================================
方法名稱:Set_c_docnamelist
引用相依:
方法描述:設定預設的文件名稱清單。
============================================================================== }
procedure TCB_IMGPSScanX.Set_c_docnamelist(const Value: WideString);
begin
FC_DocNameList := Value;
end;
{ ==============================================================================
方法名稱:Set_c_docnolist
引用相依:
方法描述:設定預設的文件代號清單。
============================================================================== }
procedure TCB_IMGPSScanX.Set_c_docnolist(const Value: WideString);
begin
FC_DocNoList := Value;
end;
{ ==============================================================================
方法名稱:Set_fixfilelist
引用相依:
方法描述:設定固定的檔案清單字串。
============================================================================== }
procedure TCB_IMGPSScanX.Set_fixfilelist(const Value: WideString);
begin
FFixFileList := Value;
end;
{ ==============================================================================
方法名稱:Set_is_in_wh
引用相依:
方法描述:設定是否為在席(In-Warehouse)作業模式。
============================================================================== }
procedure TCB_IMGPSScanX.Set_is_in_wh(const Value: WideString);
begin
FIs_In_Wh := UpperCase(Value);
end;
{ ==============================================================================
方法名稱:Set_oldcaseinfo
引用相依:
方法描述:設定舊案件的相關資訊字串。
============================================================================== }
procedure TCB_IMGPSScanX.Set_oldcaseinfo(const Value: WideString);
begin
FOldCaseInfo := Value;
end;
{ ==============================================================================
方法名稱:Get_c_docnamelist
引用相依:
方法描述:獲取預設文件名稱清單的存根函式,目前未實作回傳內容。
============================================================================== }
function TCB_IMGPSScanX.Get_c_docnamelist: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_c_docnolist
引用相依:
方法描述:獲取預設文件代號清單的存根函式,目前未實作回傳內容。
============================================================================== }
function TCB_IMGPSScanX.Get_c_docnolist: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_caseid
引用相依:
方法描述:獲取內部案件編號(FCaseID)。
============================================================================== }
function TCB_IMGPSScanX.Get_caseid: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_data
引用相依:
方法描述:獲取內部資料字串(FData)。
============================================================================== }
function TCB_IMGPSScanX.Get_data: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_fixfilelist
引用相依:
方法描述:獲取固定的檔案清單字串(FFixFileList)。
============================================================================== }
function TCB_IMGPSScanX.Get_fixfilelist: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_is_in_wh
引用相依:
方法描述:獲取是否為在席作業模式的標記(FIs_In_WH)。
============================================================================== }
function TCB_IMGPSScanX.Get_is_in_wh: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_language
引用相依:
方法描述:獲取當前設定的語系代碼(FLanguage)。
============================================================================== }
function TCB_IMGPSScanX.Get_language: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_loandoc_enable
引用相依:
方法描述:獲取信用註記功能是否啟用的狀態。
============================================================================== }
function TCB_IMGPSScanX.Get_loandoc_enable: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_loandoc_value
引用相依:
方法描述:獲取當前設定的信用註記數值。
============================================================================== }
function TCB_IMGPSScanX.Get_loandoc_value: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_mode
引用相依:
方法描述:獲取當前作業模式(FMode)。
============================================================================== }
function TCB_IMGPSScanX.Get_mode: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_modename
引用相依:
方法描述:獲取作業模式的顯示名稱(FModeName)。
============================================================================== }
function TCB_IMGPSScanX.Get_modename: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_oldcaseinfo
引用相依:
方法描述:獲取舊案件的相關資訊字串(FOldCaseInfo)。
============================================================================== }
function TCB_IMGPSScanX.Get_oldcaseinfo: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_rewrite
引用相依:
方法描述:獲取是否強制覆蓋檔案的標記(FReWrite)。
============================================================================== }
function TCB_IMGPSScanX.Get_rewrite: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_url
引用相依:
方法描述:獲取後端伺服器的基礎 URL(FUrl)。
============================================================================== }
function TCB_IMGPSScanX.Get_url: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_useproxy
引用相依:
方法描述:獲取是否使用 Proxy 代理伺服器的設定。
============================================================================== }
function TCB_IMGPSScanX.Get_useproxy: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_userid
引用相依:
方法描述:獲取當前登入的使用者代號(FUserID)。
============================================================================== }
function TCB_IMGPSScanX.Get_userid: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_username
引用相依:
方法描述:獲取當前登入的使用者名稱(FUserName)。
============================================================================== }
function TCB_IMGPSScanX.Get_username: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_userunit
引用相依:
方法描述:獲取使用者所屬的單位代碼(FUserUnit)。
============================================================================== }
function TCB_IMGPSScanX.Get_userunit: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_verify
引用相依:
方法描述:獲取 API 驗證字串(FVerify)。
============================================================================== }
function TCB_IMGPSScanX.Get_verify: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_work_no
引用相依:
方法描述:獲取當前的業務別代碼(FWork_No)。
============================================================================== }
function TCB_IMGPSScanX.Get_work_no: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_printyn
引用相依:
方法描述:獲取是否預設列印的標記(FPrintyn)。
============================================================================== }
function TCB_IMGPSScanX.Get_printyn: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_printyn
引用相依:
方法描述:設定是否預設列印的標記,並將傳入值轉換為大寫。
============================================================================== }
procedure TCB_IMGPSScanX.Set_printyn(const Value: WideString);
begin
FPrintyn := UpperCase(Value);
end;
{ ==============================================================================
方法名稱:Get_is_oldcase
引用相依:
方法描述:獲取是否為舊件處理模式的標記(FIs_OldCase)。
============================================================================== }
function TCB_IMGPSScanX.Get_is_oldcase: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_is_oldcase
引用相依:
方法描述:設定是否為舊件處理模式,並將傳入值轉換為大寫。
============================================================================== }
procedure TCB_IMGPSScanX.Set_is_oldcase(const Value: WideString);
begin
FIs_OldCase := UpperCase(Value);
end;
{ ==============================================================================
方法名稱:Get_custdocyn
引用相依:
方法描述:獲取是否支援自定義文件的標記(FCustDocYN)。
============================================================================== }
function TCB_IMGPSScanX.Get_custdocyn: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_custdocyn
引用相依:
方法描述:設定是否支援自定義文件,並將傳入值轉換為大寫。
============================================================================== }
procedure TCB_IMGPSScanX.Set_custdocyn(const Value: WideString);
begin
FCustDocYN := UpperCase(Value);
end;
{ ==============================================================================
方法名稱:Get_casenolength
引用相依:
方法描述:獲取案件編號的長度限制。
============================================================================== }
function TCB_IMGPSScanX.Get_casenolength: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_filesizelimit
引用相依:
方法描述:獲取單一影像檔案的大小限制(KB)。
============================================================================== }
function TCB_IMGPSScanX.Get_filesizelimit: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_imgdpi
引用相依:
方法描述:獲取掃描影像的 DPI 設定值。
============================================================================== }
function TCB_IMGPSScanX.Get_imgdpi: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_scancolor
引用相依:
方法描述:獲取掃描顏色模式的索引值。
============================================================================== }
function TCB_IMGPSScanX.Get_scancolor: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_casenolength
引用相依:
方法描述:設定案件編號的長度限制。若傳入值為空字串則設為 0;否則將字串轉換為整數
後賦值給 FCaseNoLength 與全域變數 CaseIDLength。
============================================================================== }
procedure TCB_IMGPSScanX.Set_casenolength(const Value: WideString);
begin
if Value ='' then
begin
FCaseNoLength := 0 ;
CaseIDLength := FCaseNoLength;
end
else
begin
FCaseNoLength := StrToInt(Value) ;
CaseIDLength := FCaseNoLength;
end;
end;
{ ==============================================================================
方法名稱:Set_filesizelimit
引用相依:
方法描述:設定影像檔案的大小限制(KB)。若傳入值為空,則預設為 5120 KB (5MB);否則
將字串轉換為整數後賦值給 FFileSizeLimit。
============================================================================== }
procedure TCB_IMGPSScanX.Set_filesizelimit(const Value: WideString);
begin
//ShowMessage(Value);
FFileSizeLimit:=0;
if Value ='' then
begin
FFileSizeLimit := 5*1024;
end
else
begin
FFileSizeLimit := StrToInt(Value);
end;
end;
{ ==============================================================================
方法名稱:Set_imgdpi
引用相依:
方法描述:設定掃描 DPI。若傳入值為空,則預設為 300 DPI;否則將字串轉整數後賦值給
FImgDPI,並同步更新全域變數 ScanDpi 與 Def_ScanDpi。
============================================================================== }
procedure TCB_IMGPSScanX.Set_imgdpi(const Value: WideString);
begin
if Value ='' then
begin
FImgDPI := 300;
ScanDpi := FImgDPI;
end
else
begin
FImgDPI := StrToInt(Value);
ScanDpi := FImgDPI;
Def_ScanDpi := FImgDPI;
end;
end;
{ ==============================================================================
方法名稱:Set_scancolor
引用相依:ifBlackWhite, ifGray256, ifTrueColor
方法描述:設定掃描色彩模式。將傳入的數值字串轉為整數。0 代表黑白(ifBlackWhite),1
代表灰階(ifGray256),2 代表全彩(ifTrueColor)。此函式會同步更新 FScanC
olor 與全域變數 ScanColor,確保掃描器使用正確的色彩模式。
============================================================================== }
procedure TCB_IMGPSScanX.Set_scancolor(const Value: WideString);
begin
if value='' then
begin
FScanColor := 0;
ScanColor := ifBlackWhite;
end
else
begin
FScanColor := StrToInt(Value);
ScanColor := ifBlackWhite;
end;
if FScanColor = 1 then
begin
ScanColor := ifGray256 ;
end;
if FScanColor = 2 then
begin
ScanColor := ifTrueColor ;
end;
end;
{ ==============================================================================
方法名稱:Get_imgdelete
引用相依:
方法描述:獲取影像刪除權限的標記(FImgDelete)。
============================================================================== }
function TCB_IMGPSScanX.Get_imgdelete: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_imgdelete
引用相依:
方法描述:設定影像刪除權限。
============================================================================== }
procedure TCB_IMGPSScanX.Set_imgdelete(const Value: WideString);
begin
FImgDelete:=Value;
end;
{ ==============================================================================
方法名稱:Get_check_main_form
引用相依:
方法描述:獲取是否檢查主表單的標記(FCheck_main_form)。
============================================================================== }
function TCB_IMGPSScanX.Get_check_main_form: WideString;
begin
end;
{ ==============================================================================
方法名稱:Get_isExternal
引用相依:
方法描述:獲取是否為外部呼叫模式的標記(FIsExternal)。
============================================================================== }
function TCB_IMGPSScanX.Get_isExternal: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_check_main_form
引用相依:
方法描述:設定是否檢查主表單。
============================================================================== }
procedure TCB_IMGPSScanX.Set_check_main_form(const Value: WideString);
begin
FCheck_main_form := Value;
end;
{ ==============================================================================
方法名稱:Set_isExternal
引用相依:
方法描述:設定是否為外部呼叫模式。
============================================================================== }
procedure TCB_IMGPSScanX.Set_isExternal(const Value: WideString);
begin
FIsExternal:=Value;
end;
{ ==============================================================================
方法名稱:Get_WH_CATEGORY
引用相依:
方法描述:獲取倉庫類別資訊(FWH_category)。
============================================================================== }
function TCB_IMGPSScanX.Get_WH_CATEGORY: WideString;
begin
end;
{ ==============================================================================
方法名稱:Set_WH_CATEGORY
引用相依:
方法描述:設定倉庫類別(WH_CATEGORY)。此範圍除包含 setter 實作外,亦涵蓋了組件的
initialization 初始區段,負責註冊 ActiveForm 工廠並設定多組授權金鑰(L
icenseKey),確保 OCX 運作環境與權限正確初始化。
============================================================================== }
procedure TCB_IMGPSScanX.Set_WH_CATEGORY(const Value: WideString);
begin
FWH_category:=Value;
end;
initialization
TActiveFormFactory.Create(
ComServer,
TActiveFormControl,
TCB_IMGPSScanX,
Class_CB_IMGPSScanX,
1,
'',
OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
tmApartment);
{SetLicenseKey('5B4451E676A1D2976FBB0F3BB18341336AF114C80B5ABAE7F6926B1CAF671F44' +
'BD2F098CCEDA922F6389BFAE398DA6AEE67F97EEA0C17234C20D75C12173DBDA' +
'594924D56DD8E342F454389C836AD880BB4352CA3BE62C4933B1BA3828E7462C' +
'60514F2ECDAD322E6128D841F12D24DA00B623106D3F08EBCAA917D8A97CAA34' +
'3D65F2DA567316457395BF9123EE53DF235D181F191A5712DBB27735284AA92D' +
'5DFA0C8308308505F384707E900C6063F53F1BFF4C6972607955D1AE517B19D0' +
'82CDD16301885403AD229D57BAEF98C056F31430861E5F68F339D658D72E1F92' +
'63899412EC2D07891FE3AFD35F3E4A4390B2F0A8A1BF1B7D6160E5F1CC009B17'); }
SetLicenseKey('4B2CF65E8C2A86CE8A0DD0F6A7DB03BC0B0126168B48AE4C27EBD78CAE75CF0F' +
'A612190861E0D99F6FAE3ED97AC1941B5E97843CFFCF705A3787989072D4EB2C' +
'AE6CAB3F5B69B86616ACC8A37AD6A2AB21C7BDD5C9AE1EDF9E4193D353805C9A' +
'403631CE8A3D0803FEBB1BE4C209CE7A63B1298EF080EB34B8628CED567D2B68' +
'E777FAC58E2E32B7411FC217A04336231D1E861A93474759DAA6EDF53F6EB632' +
'A3055229A52F3053FB844754741409022DDE3DFB19473510F2BE63328E74BE20' +
'A6A29AA24878F91ADA9DF8CE1F320AF4DAF58EBF95D9BE761D70EEA274E19475' +
'1C15948B184264C5C49E60493F3BCD2FFAE2CA8B021D00B96F45550C5F050D8A');
SetLicenseKey('A6A94A8D91B08A9D58F300C0573EA9EF1B9DB0BF69B90E13B958DB4CB6B44F5A' +
'4EE9CB22C9A68C2D07ED52ED4D13C755D890E4074996755361E6CDE2A6F1B563' +
'5DDC8999AC4D71FB092EA9F1F87BFA25694FBF0D6D250087D2B39629713FCCB0' +
'D0A83135BC14FC63A4E8331CFF9E24C45C2D9CFD837EB70BAFDB79A75B7B97D5' +
'E9EB271685118C29D90A7C85E7793908989E295DA50021C795A448366026E975' +
'F49EA75B721B80427B99E5CF24A225FB498C07946ED7B806B483654C00D85C66' +
'E34215CA3EDEF1D4C3F5896090E97E1E2C9752BA2D5B49EE58CF19A0D374077F' +
'6D13B90B6FED22D9EBC3AD6CDC76E595E08725BF2E12B8EF30A524A2E00504DF');
end.