curtis
17小時前 5577f3ba7b9f0319c9b32d7080165207726d1f81
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
{ ==============================================================================
  方法名稱:ISB1Click
  引用相依:
  方法描述:影像滾輪盒(ISB)的點擊處理。更新當前顯示的 ISB 對象,調整 Shape1 標記框
            的位置以框選當前 ISB。根據 ISB 名稱與捲軸位置計算並更新 PageLV 清單中
            的選取狀態(NowPage 與 ItemIndex)。
============================================================================== }
procedure TCB_IMGPSScanX.ISB1Click(Sender: TObject);
var
  p : Integer;
begin
  DisplayISB := TImageScrollBox(Sender);
  Shape1.Left := TPanel(TImageScrollBox(Sender).Parent).Left - Seg;
  Shape1.Top := TPanel(TImageScrollBox(Sender).Parent).Top - Seg;
  P := strtoint(copy(DisplayISB.Name,4,1)) + ScrollBar1.Position-2;
  if P <= PageLV.Items.Count-1 then
  begin
    if PageLVclear then
    begin
      PageLV.ClearSelection;
    end;
    NowPage := p+1;
    PageLV.ItemIndex := P;
  end;
  //DisplayISB.SetFocus;
end;
 
 
{ ==============================================================================
  方法名稱:ISB1EndScroll
  引用相依:
  方法描述:當影像滾輪盒停止捲動時觸發。呼叫 SetScrollData 將當前的水平/垂直捲軸
            位置與縮放百分比存回緩存中,以維持影像顯示的一致性。
============================================================================== }
procedure TCB_IMGPSScanX.ISB1EndScroll(Sender: TObject);
var
  ISB : TImageScrollBox;
begin
  ISB := TImageScrollBox(Sender);
 
  SetScrollData(ISB,ISB.HorzScrollBar.Position,ISB.VertScrollBar.Position,ISB.ZoomPercent);
  {if (TImageScrollBox(Sender) = MpsViewX1) and SortMode then
  begin
    ReczoomPercent := MpsViewX1.ZoomPercent;
    RecHozPos := MpsViewX1.HorzScrollBarPos;
    RecVerPos := MpsViewX1.VertScrollBarPos;
  end;}
end;
 
 
{ ==============================================================================
  方法名稱:ISB1Enter
  引用相依:
  方法描述:當滑鼠進入影像滾輪盒區域時,強制將焦點設為 ISB1。
============================================================================== }
procedure TCB_IMGPSScanX.ISB1Enter(Sender: TObject);
begin
  ISB1.SetFocus;
end;
 
 
{ ==============================================================================
  方法名稱:ISB1ImageMouseDown
  引用相依:LoadFromFile
  方法描述:影像滑鼠按下事件。設定當前 DisplayISB 並視情況取得焦點,更新 Shape1 的
            選取框位置。同步更新 PageLV 的選取頁面。若處於特定模式(NowClick = -1)
            且按下左鍵,則啟動影像的拖曳操作(BeginDrag)。此外也會處理旋轉模式下的
            影像載入。
============================================================================== }
procedure TCB_IMGPSScanX.ISB1ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  p : Integer;
begin
  DisplayISB := TImageScrollBox(Sender);
  if NowClick<>0 then
    DisplayISB.SetFocus;
  Shape1.Left := TPanel(TImageScrollBox(Sender).Parent).Left - Seg;
  Shape1.Top := TPanel(TImageScrollBox(Sender).Parent).Top - Seg;
  P := strtoint(copy(DisplayISB.Name,4,1)) + ScrollBar1.Position-2;
  if P <= PageLV.Items.Count-1 then
  begin
    NowPage := p+1;
    PageLV.ClearSelection;
    PageLV.ItemIndex := P;
 
    //PageLV.Selected := PageLV.Items.Item[PageLV.ItemIndex];
 
  end;
  if (NowClick = -1) and (Button=TMouseButton(mbLeft)) and (DisplayISB.FileName <> '') then
  begin
    {for P := 1 to 8 do
    begin
      TImageScrollBox(FindComponent('ISB'+inttostr(p))).Enabled := False;
    end; }
    DisplayISB.BeginDrag(True);
  end;
  case TImageScrollBox(Sender).MouseMode of
    mmR90,mmR180,mmR270:
    begin
      TImageScrollBox(Sender).LoadFromFile(TImageScrollBox(Sender).FileName,1);
    end;
  end;
 
end;
 
 
{ ==============================================================================
  方法名稱:ISB1ImageMouseMove
  引用相依:
  方法描述:影像滑鼠移動事件。根據當前是否有載入影像檔案,動態切換滑鼠模式(MouseMo
            de)。若無檔案則設為使用者模式(mmUser),否則根據 NowClick 狀態呼叫 View
            MouseMode 切換至對應的檢視模式。
============================================================================== }
procedure TCB_IMGPSScanX.ISB1ImageMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
   //Edit1.SetFocus;
  //TImageScrollBox(Sender).SetFocus;
 
  if TImageScrollBox(Sender).FileName = '' then
    TImageScrollBox(Sender).MouseMode := mmUser
  Else
    ViewMouseMode(NowClick);
 
  ISB1.AlwaysShowAnnotations := False;
 
//  if TImageScrollBox(Sender).FileName = '' then
//  begin
////ShowMessage('AAA');
//Label3.Caption:='FileName='+TImageScrollBox(Sender).FileName+'  time='+FormatDateTime('yyyy/mm/dd HH:MM:SS', now);
//    TImageScrollBox(Sender).MouseMode := mmUser
//  end
//  Else
//  begin
//Label3.Caption:='FileName='+TImageScrollBox(Sender).FileName;
//    ViewMouseMode(NowClick);
//  end;
end;
 
 
{ ==============================================================================
  方法名稱:ISB1ImageMouseUp
  引用相依:SaveQuality, SaveToFile, TJpegGraphic
  方法描述:影像滑鼠放開事件。處理多種滑鼠模式:在 mmDelete 模式下觸發刪除功能;在
            旋轉模式(mmR90等)下儲存旋轉後的影像檔案,並同步更新預覽圖(SelectISB)
            與清空檢核記錄。最後針對縮放或拖曳模式更新捲軸位置數據。
============================================================================== }
procedure TCB_IMGPSScanX.ISB1ImageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  p : Integer;
  ISB : TImageScrollBox;
begin
  case TImageScrollBox(Sender).MouseMode of
    mmDelete:
    begin
      PM508Click(Self);
    end;
    mmR90,mmR180,mmR270:
    begin
      if TImageScrollBox(Sender).Graphic.ImageFormat <> ifBlackWhite then
      begin
        TJpegGraphic(TImageScrollBox(Sender).Graphic).SaveQuality := 30;
        TJpegGraphic(TImageScrollBox(Sender).Graphic).SaveToFile(TImageScrollBox(Sender).FileName);
      end
      Else
        TImageScrollBox(Sender).SaveToFile(TImageScrollBox(Sender).FileName);
 
      SelectISB.Graphic.Assign(TImageScrollBox(Sender).Graphic);
      SelectISB.Redraw(True);
      FitPreViewISB;
      ISBClick(SelectISB);
      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
    end;
  end;
 
  ISB := TImageScrollBox(Sender);
  if (ISB.MouseMode = mmZoom) or (ISB.MouseMode = mmDrag) then
    SetScrollData(ISB,ISB.HorzScrollBar.Position,ISB.VertScrollBar.Position,ISB.ZoomPercent);
 
end;
 
 
{ ==============================================================================
  方法名稱:ScrollBox1MouseEnter
  引用相依:
  方法描述:當滑鼠進入捲軸區域時,自動將焦點設定至 ScrollBox1。
============================================================================== }
procedure TCB_IMGPSScanX.ScrollBox1MouseEnter(Sender: TObject);
begin
ScrollBox1.SetFocus;
end;
 
 
{ ==============================================================================
  方法名稱:FindISB2View
  引用相依:
  方法描述:根據檢視模式,在畫面中尋找下一個可顯示影像的 TImageScrollBox。遍歷 ISB
            1-ISB8,檢查 FileName 是否為空;若已滿則會清空特定位置影像並重新開始,
            確保影像載入有對應視窗。
============================================================================== }
Function TCB_IMGPSScanX.FindISB2View(Vmode:Integer):TImageScrollBox; //找空的ISB來顯示
var
  i,n : Integer;
  ISB : TImageScrollBox;
begin
  case Vmode of
    0 : n := 1;
    1 : n := 2;
    2 : n := 4;
    3 : n := 6;
    4 : n := 8;
  end;
  for i := 1 to 8 do
  begin
    if i > n then Break;
    ISB := TImageScrollBox(FindComponent('ISB'+inttostr(i)));
    if (i = n) and (ISB.FileName <> '') then
    begin
      clearView(i);
      Result := ISB1;
    end
    Else if ISB.FileName = '' then
      Result := ISB;
  end;
end;
 
 
{ ==============================================================================
  方法名稱:ImageScrollBox1NewGraphic
  引用相依:ConvertToBW, TDibGraphic
  方法描述:當載入新影像時觸發。將當前 Graphic 內容同步至黑白影像處理元件(ISB_BW)
            ,若原始影像非黑白格式則執行 ConvertToBW 轉換。
============================================================================== }
procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(const Graphic: TDibGraphic);
begin
  IF ImageScrollBox1.Graphic.Empty Then Exit;
  ISB_BW.Graphic.Assign(ImageScrollBox1.Graphic);
  If ImageScrollBox1.Graphic.ImageFormat <> ifBlackWhite Then
  begin
    ConvertToBW(ISB_BW.Graphic);
  end;
end;
 
 
{ ==============================================================================
  方法名稱:GetScrollData
  引用相依:
  方法描述:根據傳入的影像捲軸盒(ISB)名稱,從 ScrollRec 陣列中提取其儲存的水平、垂
            直捲軸位置及縮放比例。
============================================================================== }
Procedure TCB_IMGPSScanX.GetScrollData(ISB:TImageScrollBox;Var HS,VS:Integer;Var iRate:Single);
var
  index : Integer;
begin
  index := strtoint(copy(ISB.Name,4,1));
  HS := ScrollRec[Index].HScroll;
  VS := ScrollRec[Index].VScroll;
  iRate := ScrollRec[Index].Rate;
end;
 
 
{ ==============================================================================
  方法名稱:SetScrollData
  引用相依:
  方法描述:將指定的水平、垂直捲軸位置與縮放比例存入對應影像視窗索引的 ScrollRec 
            記錄中。
============================================================================== }
Procedure TCB_IMGPSScanX.SetScrollData(ISB:TImageScrollBox;HS,VS:Integer;iRate:Single);
var
  index : Integer;
begin
  index := strtoint(copy(ISB.Name,4,1));
  ScrollRec[Index].HScroll := HS;
  ScrollRec[Index].VScroll := VS;
  ScrollRec[Index].Rate := iRate;
end;
 
 
{ ==============================================================================
  方法名稱:FindMpsView
  引用相依:
  方法描述:根據當前的檢視模式(Vmode),在 8 個影像視窗中尋找適合載入下一個影像的
            視窗組件。函式會根據 1x1 到 4x2 的佈局決定搜尋上限,優先回傳檔名為空的
            視窗;若視窗已滿,則清空指定位置的顯示並回傳主視窗 ISB1。
============================================================================== }
Function TCB_IMGPSScanX.FindMpsView(Vmode: Integer):TImageScrollBox;
var
  i,n : Integer;
  ISB : TImageScrollBox;
begin
  case Vmode of
    0 : n := 1;
    1 : n := 2;
    2 : n := 4;
    3 : n := 6;
    4 : n := 8;
  end;
  for i := 1 to 8 do
  begin
    if i > n then Break;
    ISB := TImageScrollBox(FindComponent('ISB'+inttostr(i)));
    if (i = n) and (ISB.FileName <> '') then
    begin
      clearView(i);
      Result := ISB1;
    end
    Else if ISB.FileName = '' then
      Result := ISB;
  end;
end;