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

---
 reassemble/CB_IMGPSScanImp.preview.pas |  467 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 467 insertions(+), 0 deletions(-)

diff --git a/reassemble/CB_IMGPSScanImp.preview.pas b/reassemble/CB_IMGPSScanImp.preview.pas
new file mode 100644
index 0000000..083a906
--- /dev/null
+++ b/reassemble/CB_IMGPSScanImp.preview.pas
@@ -0,0 +1,467 @@
+{ ==============================================================================
+  方法名稱:ShapeName2PreViewISBName
+  引用相依:
+  方法描述:將 TShape 元件的名稱轉換為對應的預覽影像捲軸盒(PreViewISB)名稱。
+============================================================================== }
+Function TCB_IMGPSScanX.ShapeName2PreViewISBName(SP:TShape):String; //轉出指定PreViewISBName
+begin
+  Result := ISBName+Copy(SP.Name,3,length(SP.Name)-2);
+end;
+
+
+{ ==============================================================================
+  方法名稱:CreatePreViewISB
+  引用相依:
+  方法描述:動態建立指定數量的縮圖預覽組件。首先清空既有的預覽組件,接著在 ScrollB
+            ox1 中為每個縮圖建立一個 TPanel 作為容器,並在其內嵌入一個 TImageScro
+            llBox。設定組件的對齊方式、預設縮放模式及多項事件處理函式(如 Click, Mo
+            useMove, DragDrop 等),並掛載右鍵選單。
+============================================================================== }
+Procedure TCB_IMGPSScanX.CreatePreViewISB(Count:Integer);
+var
+  ISB : TImageScrollBox;
+  Panel : TPanel;
+  i,W,H : Integer;
+  myDate : TDateTime;
+begin
+  FreePreViewISB;
+  ScrollBox1.HorzScrollBar.Visible := False;
+  W := 150;
+  H := 250;
+  for I := 1 to Count do
+  begin
+
+    if FindComponent('M_Pl'+inttostr(i))=nil then
+    begin
+      Panel := TPanel.Create(Self);
+      Panel.Name := 'M_Pl'+inttostr(i);//FormatDateTime('yyyymmddhhnnsszzz', now)
+      Panel.Left := 4;
+      Panel.Top := (i-1)*H+(6*i);
+      Panel.Height := H;
+      Panel.Width := W;
+      Panel.Parent := ScrollBox1;
+      Panel.Caption :='';
+
+      if FindComponent(ISBName+inttostr(i))=nil then
+      begin
+        ISB := TImageScrollBox.Create(Self);
+        ISB.Name := ISBName+inttostr(i);
+        ISB.Parent := Panel;
+        ISB.Align := alClient;
+        ISB.ZoomMode := zmFullPage;
+        ISB.DragMode := dmAutomatic;
+        ISB.MouseMode := mmuser;
+        ISB.OnImageClick := ISBClick;
+        ISB.OnImageMouseMove := ISBMouseMove;
+        ISB.PopupMenu := PopupMenu6;
+        ISB.OnImageMouseDown := ISBImageMouseDown;
+        ISB.OnImageMouseUp := ISBImageMouseUp;
+        ISB.OnEndDrag := ISBEndDrag;
+        ISB.OnDragDrop := ISBDragDrop;
+        ISB.OnDragOver := ISBDragOver;
+      end;
+    end;
+
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:FreePreViewISB
+  引用相依:
+  方法描述:釋放所有與縮圖預覽相關的動態組件。遍歷所有組件,尋找名稱中包含特定前綴
+            (如 ISBName, M_Pl, SP)的 TImageScrollBox、TPanel 與 TShape 並執行 Fre
+            e 動作。最後呼叫 ProcessMessages 確保 UI 資源正確釋放。
+============================================================================== }
+Procedure TCB_IMGPSScanX.FreePreViewISB;
+var
+  i : Integer;
+begin
+try
+  For i:= ComponentCount -1 downto 0 do
+  begin
+    IF (Components[i] is TImageScrollBox) and (Components[i]<>nil) Then
+    begin
+      IF Pos(ISBName,Components[i].Name) > 0 Then
+        Components[i].Free;
+    end
+    Else If (Components[i] is TPanel) and  (Components[i]<>nil) Then
+    begin
+      IF Pos('M_Pl',Components[i].Name) > 0  Then
+        Components[i].Free;
+    end
+    Else If (Components[i] is TShape) and (Components[i]<>nil) Then
+    begin
+      IF Pos('SP',Components[i].Name) > 0  Then
+        Components[i].Free;
+    end;
+  end;
+  Application.ProcessMessages;
+except on E: Exception do
+end;
+
+  //showmessage(inttostr(Count));
+end;
+
+
+{ ==============================================================================
+  方法名稱:FitPreViewISB
+  引用相依:
+  方法描述:自動調整所有預覽縮圖面板的高度與位置。遍歷所有已建立的預覽組件(ISB),
+            根據每個影像實際顯示的高度(DisplayedGraphic.Height)動態設定其父面板
+            的高度,並依序由上而下排列,確保縮圖之間緊密銜接。
+============================================================================== }
+Procedure TCB_IMGPSScanX.FitPreViewISB;
+var
+  i : Integer;
+  iISB : TImageScrollBox;
+  iPanel : TPanel;
+  T,H : Integer;
+begin
+  T := 0;
+  i := 1;
+
+  while FindComponent(ISBName+inttostr(i)) <> nil do
+  begin
+    iISB := TImageScrollBox(FindComponent(ISBName+inttostr(i)));
+    iISB.Parent.Height := 250;
+    iISB.Parent.Top := T+4;
+    iISB.Parent.Height := iISB.DisplayedGraphic.Height;
+    H := iISB.Parent.Height;
+    T := iISB.Parent.Top+H;
+    inc(i);
+  end;
+
+
+  {For i:= 1 to Count do
+  begin
+    if TImageScrollBox(FindComponent(ISBName+inttostr(i))) = nil then Break;
+
+
+    iISB := TImageScrollBox(FindComponent(ISBName+inttostr(i)));
+    iISB.Parent.Height := H;
+    iISB.Parent.Top := T+4;
+    iISB.Parent.Height := iISB.DisplayedGraphic.Height;
+    H := iISB.Parent.Height;
+    T := iISB.Parent.Top+H;
+  end;}
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PaintShape
+  引用相依:
+  方法描述:在預覽縮圖周圍繪製藍色選取框(TShape)。若僅傳入單一影像(ToImg 為 nil),
+            則只在該影像位置建立選取框;若傳入起點與終點影像,則會在範圍內的所有影
+            像組件上建立選取框。框線寬度設為 3 且顏色為藍色,用於視覺化標記選取狀
+            態。
+============================================================================== }
+Procedure TCB_IMGPSScanX.PaintShape(FromImg,ToImg:TImageScrollBox); //畫有被選取的影像
+var
+  i,F_No,T_No : Integer;
+  SP : TShape;
+  ISB : TImageScrollBox;
+  Function GetImgNo(iISB:TImageScrollBox):Integer;
+  begin
+    Result := strtoint(Copy(iISB.Name,length(ISBName)+1,length(iISB.Name)-length(ISBName))); //'PreViewISB'
+  end;
+begin
+  IF ToImg = nil Then   //只畫單一個
+  begin
+    ISB := TImageScrollBox(FindComponent(ISBName+inttostr(GetImgNo(FromImg))));
+    if TShape(FindComponent('SP'+inttostr(GetImgNo(FromImg)))) = nil then
+    begin
+
+    SP := TShape.Create(self);
+    SP.Pen.Color := clblue;
+    SP.Pen.Width := 3;
+    SP.Parent := ScrollBox1;
+    SP.Name := 'SP'+inttostr(GetImgNo(FromImg));
+    SP.Left := ISB.Parent.Left-4;
+    SP.Top := ISB.Parent.Top -4;
+    SP.Width := ISB.Parent.Width + 8;
+    SP.Height := ISB.Parent.Height + 8;
+    end;
+  end
+  Else
+  begin
+    FreeShapeobj(nil);
+    IF GetImgNo(FromImg) <= GetImgNo(ToImg) Then
+    begin
+      F_No := GetImgNo(FromImg);
+      T_No := GetImgNo(ToImg);
+    end
+    Else
+    begin
+      F_No := GetImgNo(ToImg);
+      T_No := GetImgNo(FromImg);
+    end;
+    For i := F_No to T_No do
+    begin
+      ISB := TImageScrollBox(FindComponent(ISBName+inttostr(i)));
+      SP := TShape.Create(self);
+      SP.Pen.Color := clblue;
+      SP.Pen.Width := 3;
+      SP.Parent := ScrollBox1;
+      SP.Name := 'SP'+inttostr(i);
+      SP.Left := ISB.Parent.Left-4;
+      SP.Top := ISB.Parent.Top -4;
+      SP.Width := ISB.Parent.Width + 8;
+      SP.Height := ISB.Parent.Height + 8;
+    end;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:FreeShapeobj
+  引用相依:
+  方法描述:刪除縮圖上的選取標記(TShape)。若傳入的 SelectISB 為 nil,則會刪除所有
+            名稱前綴為 "SP" 的選取框組件;若指定了特定的影像組件,則僅刪除與該影像
+            對應的選取框。
+============================================================================== }
+Procedure TCB_IMGPSScanX.FreeShapeobj(SelectISB : TImageScrollBox);
+var
+  i : Integer;
+begin
+  IF SelectISB = nil then //全Free;
+  begin
+    For i:= ComponentCount -1 downto 0 do
+    begin
+      IF Components[i] is TShape Then
+      begin
+        IF Pos('SP',Components[i].Name) > 0  Then
+          Components[i].Free;
+      end;
+    end;
+  end
+  Else  //只Free指定的
+  begin
+    TShape(FindComponent('SP'+Copy(SelectISB.Name,length(ISBName)+1,length(SelectISB.Name)-length(ISBName)))).Free;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBClick
+  引用相依:Image_Smooth, LoadFromFile
+  方法描述:處理縮圖點擊事件,支援組合鍵選取。若按下 Shift 鍵則執行連選(PaintShape
+             範圍選取);若按下 Control 鍵則切換單選狀態;一般點擊則清除舊選取並重
+            新標記。點擊後會從選取的縮圖載入原圖至主顯示區(ISB1),並視需要執行影像
+            平滑化處理。
+============================================================================== }
+Procedure TCB_IMGPSScanX.ISBClick(Sender : TObject);
+var
+  v,ln:Integer;
+begin
+  if (GetKeyState(VK_SHIFT) < 0) Then
+  begin
+    PaintShape(SelectISB,TImageScrollBox(Sender));
+    SelectISB := TImageScrollBox(Sender);
+  end
+  Else if (GetKeyState(VK_CONTROL) < 0) Then
+  begin
+    SelectISB := TImageScrollBox(Sender);
+    IF TShape(FindComponent('SP'+Copy(SelectISB.Name,length(ISBName)+1,length(SelectISB.Name)-length(ISBName)))) = nil Then
+      PaintShape(SelectISB,nil)
+    else
+      FreeShapeobj(SelectISB);
+  end
+  Else
+  begin
+    FreeShapeobj(nil);
+    SelectISB := TImageScrollBox(Sender);
+    PaintShape(SelectISB,nil);
+  end;
+  GetSelectImageFile;
+
+  v := length(ISBName);
+  ln := length(SelectISB.Name);
+  SelectPage := Strtoint(Copy(SelectISB.Name,v+1,ln-v));
+  ISB1.ZoomMode := zmFittoPage;
+//ShowMessage('SelectISB.FileName='+SelectISB.FileName);
+  //if SelectISB.FileName='' then exit;
+
+  ISB1.LoadFromFile(SelectISB.FileName,1);
+  if (ISB1.Graphic.ImageFormat <> ifBlackWhite) and (SmoothCB.Checked)then
+    Image_Smooth(ISB1.Graphic);
+  ISB1.Redraw(True);
+  ISB1Click(ISB1);
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBMouseMove
+  引用相依:
+  方法描述:處理縮圖區的滑鼠移動事件。當處於拖曳狀態且滑鼠移動至已選取的影像(有 S
+            P 標記)時,觸發組件的 BeginDrag 開始執行拖放操作。
+============================================================================== }
+Procedure TCB_IMGPSScanX.ISBMouseMove(Sender: TObject; Shift: TShiftState;
+  X, Y: Integer);
+begin
+  //Edit1.SetFocus;
+  if Draging then
+  begin
+    if not (TShape(FindComponent('SP'+Copy(TImageScrollBox(Sender).Name,length(ISBName)+1,length(TImageScrollBox(Sender).Name)-length(ISBName)))) = nil) then
+    begin
+      SelectISB.BeginDrag(False);
+      Draging := False;
+    end;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBImageMouseDown
+  引用相依:LoadFromFile
+  方法描述:處理縮圖預覽影像的滑鼠按下事件。當按下左鍵時,將 Draging 標記設為 True
+             以利後續拖曳判斷。若未處於拖曳中,則根據是否按下 Shift 或 Control 鍵,
+            執行範圍選取、加選或單選操作。選取後會更新 SelectPage,並在主顯示區(ISB
+            1)同步載入對應的影像檔案。
+============================================================================== }
+procedure TCB_IMGPSScanX.ISBImageMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+var
+  v,ln:Integer;
+begin
+  if Button = TMouseButton(mbLeft) Then
+  begin
+    Draging := True;
+    //if SelectISB <> nil then
+
+    //if not Draging then
+    //begin
+
+  end;
+  //end;
+
+  {if not (TShape(FindComponent('SP'+Copy(TImageScrollBox(Sender).Name,length(ISBName)+1,length(TImageScrollBox(Sender).Name)-length(ISBName)))) = nil) then
+  begin
+    //Showmessage('SP'+Copy(TImageScrollBox(Sender).Name,length(ISBName)+1,length(TImageScrollBox(Sender).Name)));
+    if (Button = TMouseButton(mbLeft)) and (GetKeyState(VK_CONTROL) >= 0) then
+    begin
+      if SelectISB <> nil then
+        SelectISB.BeginDrag(False);
+    end;
+  end;
+  //if (TShape(FindComponent('SP'+Copy(TImageScrollBox(Sender).Name,length(ISBName)+1,length(TImageScrollBox(Sender).Name)-length(ISBName)))) = nil) then
+  //begin
+  //else
+  //begin
+  if not Draging then
+  begin
+    if (GetKeyState(VK_SHIFT) < 0) Then
+    begin
+      PaintShape(SelectISB,TImageScrollBox(Sender));
+      SelectISB := TImageScrollBox(Sender);
+    end
+    Else if (GetKeyState(VK_CONTROL) < 0) Then
+    begin
+      SelectISB := TImageScrollBox(Sender);
+      IF TShape(FindComponent('SP'+Copy(SelectISB.Name,length(ISBName)+1,length(SelectISB.Name)-length(ISBName)))) = nil Then
+        PaintShape(SelectISB,nil)
+      else
+        FreeShapeobj(SelectISB);
+    end
+    Else
+    begin
+      FreeShapeobj(nil);
+      SelectISB := TImageScrollBox(Sender);
+      PaintShape(SelectISB,nil);
+    end;
+    v := length(ISBName);
+    ln := length(SelectISB.Name);
+    SelectPage := Strtoint(Copy(SelectISB.Name,v+1,ln-v));
+    ISB1.ZoomMode := zmFittoPage;
+    ISB1.LoadFromFile(SelectISB.FileName,1);
+    ISB1Click(ISB1);
+  end;
+  //end;
+  //end
+  //Else
+  //begin
+
+  //end; }
+
+  {if (Button = TMouseButton(mbRight)) and (TShape(FindComponent('SP'+Copy(TImageScrollBox(Sender).Name,length(ISBName)+1,length(TImageScrollBox(Sender).Name)-length(ISBName)))) = nil) then
+  begin
+    //ISBClick(Sender);
+  end;
+  if (Button = TMouseButton(mbLeft)) then
+  begin
+
+  end; }
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBImageMouseUp
+  引用相依:
+  方法描述:處理縮圖預覽影像的滑鼠放開事件,將拖曳標記 Draging 重置為 False。
+============================================================================== }
+procedure TCB_IMGPSScanX.ISBImageMouseUp(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+begin
+  Draging := False;
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBEndDrag
+  引用相依:
+  方法描述:當影像拖放操作結束時,觸發 TreeView1Click 事件以更新樹狀結構與顯示介
+            面。
+============================================================================== }
+procedure TCB_IMGPSScanX.ISBEndDrag(Sender, Target: TObject; X, Y: Integer);
+begin
+  TreeView1Click(self);
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBDragDrop
+  引用相依:
+  方法描述:執行縮圖拖放後的影像移動操作。根據來源與目標影像的原始掃描頁碼,呼叫 M
+            oveImage_Drag 調整檔案在目錄中的順序。
+============================================================================== }
+procedure TCB_IMGPSScanX.ISBDragDrop(Sender, Source: TObject; X, Y: Integer);
+var
+  fp,tp : Integer;
+begin
+  fp := FileName2ScanPage(TimageScrollBox(Source).FileName);
+  tp := FileName2ScanPage(TimageScrollBox(Sender).FileName);
+  MoveImage_Drag(DisplayPath+NowDocDir+'\',fp,tp );
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:ISBDragOver
+  引用相依:
+  方法描述:判斷拖放操作是否可接受。僅在來源為影像組件、檔案路徑不同且樹狀結構選取
+            在文件層級(Level 2)時,才允許執行拖放。
+============================================================================== }
+procedure TCB_IMGPSScanX.ISBDragOver(Sender, Source: TObject; X, Y: Integer;
+      State: TDragState; var Accept: Boolean);
+var
+  So : Boolean;
+begin
+  {if (TObject(Source) is TImageScrollBox) and (TObject(Sender) is TImageScrollBox) then
+  begin
+    Label3.Caption := TImageScrollBox(Source).FileName+#13+TImageScrollBox(Sender).FileName;
+  end;  }
+
+  So := False;
+  if TObject(Source) is TImageScrollBox then
+    So := True;
+  Accept := True;
+  if not So
+    or (TImageScrollBox(Source).FileName = TImageScrollBox(Sender).FileName)
+    or (TreeView1.Selected.Level <> 2)
+    Then
+      Accept := False;
+end;
+
+

--
Gitblit v1.8.0