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/view/treeView.pas |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 822 insertions(+), 0 deletions(-)

diff --git a/reassemble/view/treeView.pas b/reassemble/view/treeView.pas
new file mode 100644
index 0000000..cc13e2a
--- /dev/null
+++ b/reassemble/view/treeView.pas
@@ -0,0 +1,822 @@
+{ ==============================================================================
+  方法名稱:DrawDocItem2
+  引用相依:DirectoryExists, FileExists, LoadFromFile
+  方法描述:在樹狀結構中繪製指定案件的文件與表單節點。讀取 CaseDocNo.dat 取得文件
+            清單,逐一建立文件節點並根據引用狀態設定圖示。接著在文件節點下建立表單
+            節點,區分制式表單與自定義表單。包含入庫過濾與附件處理,是樹狀 UI 呈現
+            的核心。
+============================================================================== }
+Function TCB_IMGPSScanX.DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //畫出文件名稱的Tree
+Var
+  i,n,m : Integer;
+  DocNode,FormNode : TTreeNode;
+  DocNoPage,FormPage : Integer;
+  DocNoCopies : Integer;
+  DocNo,iDocNo : String;
+  DocVer : String;
+  FileList : TStringlist;
+  FormID,iFormID : String;
+  FormName : String;
+  CaseDocNoList,CaseDocNo_CopiesList,StrList : TStringlist;
+  iiDocNo,iiFormID,iiDocVer : String;
+  ST1:TStringList;
+begin
+  Result := False;
+  FileList := TStringlist.Create;
+  CaseDocNoList := TStringlist.Create;
+  CaseDocNo_CopiesList := TStringlist.Create;
+  StrList := TStringlist.Create;
+  ST1:=TStringList.Create;
+LogFile1.LogToFile(logTimeString+'產文件樹開始');
+  try
+    CaseNode.ImageIndex := 1;
+    CaseNode.SelectedIndex := 1;
+    While CaseNode.Count > 0 do  //全刪
+    begin
+      CaseNode.Item[0].Delete;
+    end;
+    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');
+    for i := 0 to CaseDocNoList.Count - 1 do
+    begin
+      FileList.Clear;
+      //Showmessage(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\Context.dat');
+      if FileExists(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\Context.dat') then
+        FileList.LoadFromFile(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\Context.dat');
+      iDocNo := DocNoDir2DocNo(CaseDocNoList.Strings[i]);
+      ST1.Clear;
+
+LogFile1.LogToFile(logTimeString+'FileList.Text='+FileList.CommaText);
+      if (FWH_category='N') and (FIs_In_Wh='Y') then
+      begin
+        for n := 0 to FileList.Count - 1 do
+        begin
+          if ISExistImg(ImageSavePath+Caseno+'\'+CaseDocNoList.Strings[i]+'\'+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覺得應該加這段
+
+
+
+LogFile1.LogToFile(logTimeString+'WH_category='+FWH_category+',Is_In_Wh='+FIs_In_Wh+',FileList.Text='+FileList.CommaText);
+      if FileList.Count=0 then Continue;
+
+      DocNoCopies := Strtoint(CaseDocNo_CopiesList.Strings[i]);
+      DocNoPage := FileList.Count;
+      iDocNo := DocNoDir2DocNo(CaseDocNoList.Strings[i]);
+//Showmessage(iDocNo);
+//Showmessage(DocNo2DocName(Caseno,iDocNo));
+//ShowMessage('FileList='+FileList.Text);
+      {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;
+
+
+      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('頁'),[CaseDocNoList.Strings[i],DocNo2DocName(Caseno,iDocNo),DocNoPage]));
+      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[CaseDocNoList.Strings[i],DocNo2DocName(Caseno,iDocNo),DocNoCopies]));
+//ShowMessage('iDocNo='+iDocNo);
+      DocNode := TreeView1.Items.AddChild(CaseNode,Format(_Msg('%s{%s}-%d份'),[DocNo2DocName(Caseno,iDocNo),CaseDocNoList.Strings[i],DocNoCopies]));
+
+      if GetUseCase('F',ImageSavePath+Caseno+'\',CaseDocNoList.Strings[i]) <> '' Then
+      begin
+        DocNode.ImageIndex := 8;
+        DocNode.SelectedIndex := 8;
+      end
+      Else if GetUseCase('T',ImageSavePath+Caseno+'\',CaseDocNoList.Strings[i]) <> '' Then
+      begin
+        DocNode.ImageIndex := 9;
+        DocNode.SelectedIndex := 9;
+      end
+      Else
+      begin
+        DocNode.ImageIndex := 2;
+        DocNode.SelectedIndex := 2;
+      end;
+      if ((Pos('ZZZZZ',DocNode.Text) = 0) and (Pos('YYYYY',DocNode.Text) = 0)) and (FileList.Count =0) then  //制式文件
+      begin
+        for n := 1 to LASTEST_FORM_INF_List.Count - 1 do
+        begin
+          StrList := SplitString('!@!',LASTEST_FORM_INF_List.Strings[n]);
+          iiFormID := StrList.Strings[0];
+          iiDocNo := StrList.Strings[1];
+          if iiDocNo = iDocNo then
+          begin
+            FormID := iiFormID;
+            FormPage := GetFormIDPage(FileList,FormID);
+            FormName := FormCode2FormName(Caseno,FormID);
+            //FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+            FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
+            FormNode.ImageIndex := 4;
+            FormNode.SelectedIndex := 4;
+            DocNode.AlphaSort(True);
+          end;
+        end;
+      end
+      else if (Pos('ZZZZZ',DocNode.Text) > 0) or (Pos('YYYYY',DocNode.Text) > 0) then //自訂文件
+      begin
+        FormID := GetCustomFormID(ImageSavePath+Caseno+'\',CaseDocNoList.Strings[i]);
+        //showmessage(FileList.Text);
+        FormPage := GetFormIDPage(FileList,FormID);
+        FormName := FormCode2FormName(Caseno,FormID);
+        //FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+        //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+        FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
+        FormNode.ImageIndex := 4;
+        FormNode.SelectedIndex := 4;
+        DocNode.AlphaSort(True);
+      end;
+      SortDocDir_FormID(Caseno,CaseDocNoList.Strings[i]);  //檔名依FormID排序
+
+      for n := 0 to FileList.Count - 1 do
+      begin
+        FormID := FileName2FormCode(FileList.Strings[n]);
+        DocVer := FormCode2Version(FormID);
+        DocNo := FormCode2DocNo(FormID);
+        if CheckFormIDExists(DocNode,FormID) then Continue;
+        //Showmessage(FormID+#13+DocNo+#13+DocVer);
+        for m := 0 to FormID_List.Count - 1 do
+        begin
+          iiFormID := FormID_List.Strings[m];
+          iiDocNo := DocNo_List.Strings[m];
+          iiDocVer := FormCode2Version(iiFormID);
+          if (iiDocNo = DocNo) and (iiDocVer = DocVer) then
+          begin
+            //Showmessage(iiFormID+#13+iiDocNo+#13+iiDocVer);
+            FormID := iiFormID;
+            FormPage := GetFormIDPage(FileList,FormID);
+            FormName := FormCode2FormName(Caseno,FormID);
+            //FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+            //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+            FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
+            FormNode.ImageIndex := 4;
+            FormNode.SelectedIndex := 4;
+            DocNode.AlphaSort(True);
+          end;
+        end;
+
+
+        //if not CheckFormIDExists(DocNode,FormID) then
+        //begin
+         // Application.ProcessMessages;
+         // FormPage := GetFormIDPage(FileList,FormID);
+         /// FormName := FormCode2FormName(Caseno,FormID);
+         /// FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+         // FormNode.ImageIndex := 4;
+         // FormNode.SelectedIndex := 4;
+        //end;
+      end;
+    end;
+
+    if DirectoryExists(ImageSavePath+Caseno+'\'+AttName) then
+    begin
+
+      FileList.Clear;
+      if FileExists(ImageSavePath+Caseno+'\'+AttName+'\Context.dat') then
+        FileList.LoadFromFile(ImageSavePath+Caseno+'\'+AttName+'\Context.dat')
+      Else
+      begin
+        Rmdir(ImageSavePath+Caseno+'\'+AttName);
+        Exit;
+      end;
+      DocNoPage := FileList.Count;
+      iDocNo := DocNoDir2DocNo(AttName);
+      //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[AttName,DocNo2DocName(Caseno,iDocNo),1]));
+      DocNode := TreeView1.Items.AddChild(CaseNode,Format(_Msg('%s{%s}-%d份'),[DocNo2DocName(Caseno,iDocNo),AttName,1]));
+      DocNode.ImageIndex := 2;
+      DocNode.SelectedIndex := 2;
+      for n := 0 to FileList.Count - 1 do
+      begin
+        FormID := FileName2FormCode(FileList.Strings[n]);
+        if not CheckFormIDExists(DocNode,FormID) then
+        begin
+          FormPage := GetFormIDPage(FileList,FormID);
+          FormName := FormCode2FormName(Caseno,FormID);
+          //FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+          //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+          FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
+          FormNode.ImageIndex := 4;
+          FormNode.SelectedIndex := 4;
+        end;
+      end;
+    end;
+
+    if FModeName='件' then  //20170904 先裝死  因為異動 同時存在兩種附件太難寫
+    begin
+      if DirectoryExists(ImageSavePath+Caseno+'\Attach') then
+      begin
+        FileList.Clear;
+        if FileExists(ImageSavePath+Caseno+'\Attach'+'\Context.dat') then
+          FileList.LoadFromFile(ImageSavePath+Caseno+'\Attach'+'\Context.dat')
+        Else
+        begin
+          Rmdir(ImageSavePath+Caseno+'\Attach');
+          Exit;
+        end;
+        DocNoPage := FileList.Count;
+        iDocNo := DocNoDir2DocNo(AttName);
+        //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[AttName,DocNo2DocName(Caseno,iDocNo),1]));
+        //DocNode := TreeView1.Items.AddChild(CaseNode,Format('%s{%s}-%d'+_msg('份'),[DocNo2DocName(Caseno,iDocNo),'Attach',1]));
+        DocNode := TreeView1.Items.AddChild(CaseNode,Format(_Msg('%s{%s}-%d份'),[DocNo2DocName(Caseno,iDocNo),'Attach',1]));
+
+        DocNode.ImageIndex := 2;
+        DocNode.SelectedIndex := 2;
+        for n := 0 to FileList.Count - 1 do
+        begin
+          FormID := FileName2FormCode(FileList.Strings[n]);
+          if not CheckFormIDExists(DocNode,FormID) then
+          begin
+            FormPage := GetFormIDPage(FileList,FormID);
+            FormName := FormCode2FormName(Caseno,FormID);
+            //FormNode := TreeView1.Items.AddChild(DocNode,FormID+'{'+FormName+'}-'+inttostr(FormPage)+_msg('頁'));
+            //FormNode := TreeView1.Items.AddChild(DocNode,FormName+'{'+FormID+'}-'+inttostr(FormPage)+_msg('頁'));
+            FormNode := TreeView1.Items.AddChild(DocNode,Format(_Msg('%s{%s}-%d頁'),[FormName,FormID,FormPage]));
+
+            FormNode.ImageIndex := 4;
+            FormNode.SelectedIndex := 4;
+          end;
+        end;
+      end;
+    end;
+LogFile1.LogToFile(logTimeString+'產文件樹結束');
+  Finally
+  FileList.Free;
+  CaseDocNoList.Free;
+  CaseDocNo_CopiesList.Free;
+  StrList.Free;
+  ST1.Free;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1Click
+  引用相依:FileExists, LoadFromFile
+  方法描述:處理樹狀結構(TreeView)的點擊事件,是切換顯示內容的核心入口。根據點擊的
+            層級(案件、文件、表單),重置全域變數並設定對應的 DisplayPath、NowDocNo 
+            與 NowFormCode。接著載入並顯示該層級對應的影像與附件清單,同時動態調整
+            按鈕與選單的可用性。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1Click(Sender: TObject);
+Var
+  v,v1,v2,v3,ln : Integer;
+  i,page : Integer;
+  F : TSearchrec;
+begin
+  ScanMode := smNew;
+  IF TreeView1.Selected = nil Then Exit;
+  Scrollbar1.Position := 1;
+  Scrollbar1.Max := 1;
+  DisplayPath := '';
+  NowCaseno := '';
+  NowDocDir := '';
+  NowDocNo := '';
+  NowFormCode := '';
+  NowFormName := '';
+  NowPage := 0;
+  NowShowFileList.Clear;
+  StatusBar1.Panels[2].Text := '';
+  ClearCaseIndex;
+  PageLv.Items.Clear;  //頁數清單
+  //Panel18.Enabled:= False;
+  AttListBox.Items.Clear;
+  AddAttFileLB.Enabled := False;
+  DelAttFileLB.Enabled := False;
+  UseOldCaseLb.Visible := False;
+  PM107.Visible := False; //備註功能
+  CaseHelpBtn.Visible := False; //檢核失敗原因鈕
+  Panel5.Visible := True;
+  ContextList.Clear;
+  SortMode := false;
+  ISB1.ZoomMode := zmFullPage;
+  IF TreeView1.Selected.Parent <> nil Then
+  begin
+    if TreeView1.Selected.Parent = NewTreenode then  //點在案件上
+    begin
+      //Panel18.Enabled := True;
+      PM107.Visible := True; //備註功能
+      MyTreeNode1 := TreeView1.Selected;
+      MyTreeNode2 := nil;
+      MyTreeNode3 := nil;
+      v := Posend('-',MyTreenode1.Text);
+      v1 := Length(MyTreenode1.Text);
+      NowCaseNo := Copy(TreeView1.Selected.Text,1,v-1);
+      if (FMode = 'ESCAN') and (FOldCaseInfo <> '') then
+        UseOldCaseLb.Visible := True;
+      ClearView(1);
+      DisplayPath := ImageSavePath+NowCaseNo+'\';
+      if FLoanDoc_Enable = 'Y' then
+      begin
+        AddCredit1RG.Enabled := True;
+      end;
+      ReadCaseIndex(DisplayPath);
+      If FileExists(DisplayPath+'\upload\Checkerr.ini') and (not FileExists(DisplayPath+'\upload\OMRCheckOk.dat')) Then
+        CaseHelpBtn.Visible := True;
+      IF FileExists(DisplayPath+'CaseDocNo.dat') Then
+      begin
+        CaseDocNoList.LoadFromFile(DisplayPath+'CaseDocNo.dat');
+
+
+        view_image_DocNo(DisplayPath,'ShowAll','',1);
+      end;
+      if FileExists(DisplayPath+'CustomDocNo.dat') then
+        Cust_DocNoList.LoadFromFile(DisplayPath+'CustomDocNo.dat');
+
+
+      Page := ContextList.Count;
+      For i := 1 to page do
+      begin
+        With PageLV.Items.Add do
+        begin
+          Caption := Add_Zoo(i,3);
+        end;
+      end;
+      If Page > 0 then
+        ScrollBar1.Max := page;
+      MyTreeNode1.Expand(True);
+    end
+    Else If TreeView1.Selected.Parent.Parent  = NewTreenode Then    //點在文件上
+    begin
+
+      MyTreeNode1 := TreeView1.Selected.Parent;
+      MyTreeNode2 := TreeView1.Selected;
+      MyTreeNode3 := nil;
+      v := Pos('-',MyTreenode1.Text);
+      NowCaseNo := Copy(MyTreenode1.Text,1,v-1);
+
+      v := Posend('{',MyTreenode2.Text);
+      v1 := Posend('}',MyTreenode2.Text);
+      v2 := posend('-',MyTreenode2.Text);
+      ln := length(MyTreenode2.Text);
+      NowDocDir := Copy(MyTreeNode2.Text,v+1,v1-v-1);
+      NowDocNo := DocNoDir2DocNo(NowDocDir);
+      page :=Strtoint(Copy(MyTreeNode2.Text,v2+1,ln-v2-1));
+      if (FMode = 'ESCAN') and (FOldCaseInfo <> '') then
+        UseOldCaseLb.Visible := True;
+      ClearView(1);
+      DisplayPath := ImageSavePath+NowCaseNo+'\';
+
+      if GetUseCase('F',DisplayPath,NowDocDir) <> '' then
+        StatusBar1.Panels[2].Text := Format(_Msg('從%s引用'),[GetUseCase('F',DisplayPath,NowDocDir)]);
+      if GetUseCase('T',DisplayPath,NowDocDir) <> '' then
+        StatusBar1.Panels[2].Text := Format(_Msg('被%s引用'),[GetUseCase('T',DisplayPath,NowDocDir)]);
+      if FLoanDoc_Enable = 'Y' then
+      begin
+        AddCredit1RG.Enabled := True;
+      end;
+      ReadCaseIndex(DisplayPath);
+      If FileExists(DisplayPath+'Checkerr.ini') and (not FileExists(DisplayPath+'OMRCheckOk.dat')) Then
+        CaseHelpBtn.Visible := True;
+      If Page > 0 then
+        ScrollBar1.Max := page;
+      For i := 1 to page do
+      begin
+        With PageLV.Items.Add do
+        begin
+          Caption := Add_Zoo(i,3);
+        end;
+      end;
+
+      If FileExists(DisplayPath+'Checkerr.ini') and (not FileExists(DisplayPath+'OMRCheckOk.dat')) Then
+        CaseHelpBtn.Visible := True;
+      IF FileExists(DisplayPath+NowDocDir+'\Context.dat') Then
+      begin
+        ContextList.LoadFromFile(DisplayPath+NowDocDir+'\Context.dat');
+        //Context_DocnoList.LoadFromFile(DisplayPath+'Context_Docno.dat');
+        view_image_DocNo(DisplayPath,NowDocDir,'',Page);
+      end;
+      if FileExists(DisplayPath+'CustomDocNo.dat') then
+        Cust_DocNoList.LoadFromFile(DisplayPath+'CustomDocNo.dat');
+       MyTreeNode1.Expand(True);
+    end
+    Else If (NewTreenode <> nil) and (TreeView1.Selected.Parent.Parent.Parent  = NewTreenode) Then //點在表單上
+    begin
+      //NoteBtn.Visible := True; //備註功能
+      //Panel18.Enabled := True;
+      ClearView(1);
+      PM107.Visible := True; //備註功能
+      MyTreeNode1 := TreeView1.Selected.Parent.Parent;
+      MyTreeNode2 := TreeView1.Selected.Parent;
+      MyTreeNode3 := TreeView1.Selected;
+
+      v := Posend('-',MyTreenode1.Text);
+      NowCaseNo := Copy(MyTreenode1.Text,1,v-1);
+
+      if (FMode = 'ESCAN') and (FOldCaseInfo <> '') then
+        UseOldCaseLb.Visible := True;
+
+      v := Posend('{',MyTreenode2.Text);
+      v1 := Posend('}',MyTreenode2.Text);
+      v2 := posend('-',MyTreenode2.Text);
+      ln := length(MyTreenode2.Text);
+      NowDocDir := Copy(MyTreeNode2.Text,v+1,v1-v-1);
+      NowDocNo := DocNoDir2DocNo(NowDocDir);
+
+      v := Posend('{',MyTreenode3.Text);
+      v1 := Posend('}',MyTreeNode3.Text);
+      v2 := Posend('-',MyTreeNode3.Text);
+      ln := Length(MyTreeNode3.Text);
+      if v>0 then
+      begin
+        NowFormCode := Copy(MyTreeNode3.Text,v+1,v1-v-1);
+        if (NowFormCode = 'Attach') or (NowFormCode = 'S_Attach') then
+          NowFormCode := '';
+        NowFormName := Copy(MyTreeNode3.Text,v+1,v1-v-1);
+        page := strtoint(Copy(MyTreeNode3.Text,v2+1,ln-v2-1));
+      end
+      Else  //點在附件的頁數
+      begin
+        NowFormCode := '';
+        page := 1;
+      end;
+
+      DisplayPath := ImageSavePath+NowCaseNo+'\';
+
+      if GetUseCase('F',DisplayPath,NowDocDir) <> '' then
+        StatusBar1.Panels[2].Text := Format(_Msg('從%s引用'),[GetUseCase('F',DisplayPath,NowDocDir)]);
+      if GetUseCase('T',DisplayPath,NowDocDir) <> '' then
+        StatusBar1.Panels[2].Text := Format(_Msg('被%s引用'),[GetUseCase('T',DisplayPath,NowDocDir)]);
+
+      if FLoanDoc_Enable = 'Y' then
+      begin
+        AddCredit1RG.Enabled := True;
+      end;
+      ReadCaseIndex(DisplayPath);
+      If FileExists(DisplayPath+'Checkerr.ini') and (not FileExists(DisplayPath+'OMRCheckOk.dat')) Then
+        CaseHelpBtn.Visible := True;
+      If Page > 0 then
+        ScrollBar1.Max := page;
+      For i := 1 to page do
+      begin
+        With PageLV.Items.Add do
+        begin
+          Caption := Add_Zoo(i,3);
+        end;
+      end;
+      If FileExists(DisplayPath+NowDocDir+'\Context.dat') Then
+      begin
+        ContextList.LoadFromFile(DisplayPath+NowDocDir+'\Context.dat');
+        view_image_DocNo(DisplayPath,NowDocDir,NowFormCode,Page);
+        //view_image_FormCode(DisplayPath,NowFormCode,1,1);
+      end;
+      if FileExists(DisplayPath+'CustomDocNo.dat') then
+        Cust_DocNoList.LoadFromFile(DisplayPath+'CustomDocNo.dat');
+    end;
+    MyTreeNode1.Expand(True);
+    AddAttFileLB.Enabled := True;
+    if FileExists(DisplayPath+'ATTContext.dat') then
+    begin
+      LoadAttFile(NowCaseno);
+    end;
+  end
+  Else     //點在NewTreenode or MyTreenode1 上
+  begin
+    ClearView(1);
+    MyTreeNode1 := nil;
+    MyTreeNode2 := nil;
+    MyTreeNode3 := nil;
+  end;
+  TreeView1.Selected.MakeVisible;
+  CaseList.Clear;
+  if FileExists(ImageSavePath + 'CaseList.dat') then
+    CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat');
+  //CountCaseno;
+  //CountCaseCount;
+  Application.ProcessMessages;
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1DragDrop
+  引用相依:CopyFile, DeleteImageFile, LoadFromFile, ReSortFileName, RenameFile,
+             SaveToFile, _DelTree
+  方法描述:處理樹狀結構的拖放操作,實現影像的快速歸類或跨案件移動。當使用者將影像
+            縮圖拖至樹狀節點時,程序會判斷目標層級,執行實際的檔案搬移(Copy/Delete
+            )與更名,同步更新 Context.dat 索引檔案,並重新整理樹狀顯示與筆數統計。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
+var
+  NewCaseno,NewDocNo,NewDocDir,NewFormCode,NewFormName : String;
+  NewPath,NewFileName:String;
+  OldFileName : String;
+  iTreeNode1,iTreeNode2,iTreeNode3: TTreeNode;
+  i,v,v1,v2 : Integer;
+  PreIndex,Precount,NowCount:Integer;
+  GoAtt : Boolean;
+  AttLv : Integer;
+begin
+  NewCaseno := '';
+  NewFormCode := '';
+  NewFormName := '';
+  Precount := MyTreeNode1.Count;
+  PreIndex := -1;
+  GoAtt := False;
+  if (MytreeNode2 <> nil) and (Pos('Attach',MyTreeNode2.Text)>0) then
+  begin
+    AttLv := TreeView1.Selected.Level;
+    GoAtt := True;
+  end;
+
+  if TTreeView(Sender).GetNodeAt(X,Y).Level =2 then
+  begin
+    iTreeNode2 := TTreeView(Sender).GetNodeAt(X,Y);
+    iTreeNode1 := iTreeNode2.Parent;
+    v := Pos('-',iTreenode1.Text);
+    v1 := Length(iTreenode1.Text);
+    NewCaseNo := Copy(iTreeNode1.Text,1,v-1);
+    v := Posend('{',iTreeNode2.Text);
+    v1 := Posend('}',iTreeNode2.Text);
+    NewDocNo := Copy(iTreeNode2.Text,v+1,v1-v-1);
+    NewPath := ImagePath+NewCaseNo+'\';
+    OldFileName := ExtractFileName(DisplayISB.FileName);
+    if Copy(NewDocNo,1,5) = 'ZZZZZ' then  //自訂文件
+    begin
+      NewFileName := Add_Zoo(FileName2ScanPage(OldFileName),3)+'_'+NewDocNo+'0000000'+ExtractFileExt(OldFileName);
+      NewFormCode := NewDocNo+'0000000';
+      {ReNameFile(DisplayISB.FileName,NewPath+NewFileName);
+      ReNameContext(DisplayPath,OldFileName,NewFileName);
+      MyTreeNode2ReFresh(NowCaseno);
+      TreeView1Click(nil);}
+    end;
+    //NewFileName := Add_Zoo(GetCasePage(ImagePath,NewCaseno)+1,3)+FileName2NoQuene_Filename(OldFileName);
+  end
+  Else if TTreeView(Sender).GetNodeAt(X,Y).Level =3 then
+  begin
+    OldFileName := ExtractFileName(DisplayISB.FileName);
+    iTreeNode1 := TTreeView(Sender).GetNodeAt(X,Y).Parent.Parent;
+    iTreeNode2 := TTreeView(Sender).GetNodeAt(X,Y).Parent;
+    iTreeNode3 := TTreeView(Sender).GetNodeAt(X,Y);
+    v := Pos('-',iTreenode1.Text);
+    v1 := Length(iTreenode1.Text);
+    NewCaseNo := Copy(iTreeNode1.Text,1,v-1);
+    v := Pos('{',iTreeNode2.Text);
+    v1 := Pos('}',iTreeNode2.Text);
+    NewDocDir := Copy(iTreeNode2.Text,v+1,v1-v-1);
+
+    v := Pos('{',iTreeNode3.Text);
+    v1 := Pos('}',iTreeNode3.Text);
+    NewFormName := Copy(iTreeNode3.Text,1,v-1);
+    NewFormCode := Copy(iTreeNode3.Text,v+1,v1-v-1);
+    IF v = 0 Then
+    begin
+      NewFormCode := '';
+      v := Posend('-',iTreeNode3.Text);
+      NewFormName := Copy(iTreeNode3.Text,1,v1-1);
+    end;
+    NewPath := ImagePath+NewCaseNo+'\'+NewDocDir+'\';
+    if NewPath = DisplayPath Then  //同案件
+    begin
+      if NewFormCode <> '' then
+        //NewFileName := Copy(OldFileName,1,3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
+        NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir),3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
+      Else
+        //NewFileName := Copy(OldFileName,1,3)+ExtractFileExt(OldFileName)
+        NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir),3)+ExtractFileExt(OldFileName);
+    end
+    else   //不同案件
+    begin
+      if NewFormCode <> '' then
+        //NewFileName := Copy(OldFileName,1,3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
+        NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir),3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
+      Else
+        //NewFileName := Copy(OldFileName,1,3)+ExtractFileExt(OldFileName)
+        NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir),3)+ExtractFileExt(OldFileName);
+    end;
+  end;
+  //Showmessage('a');
+  for I := 0 to NowSelectFileList.Count - 1 do
+  begin
+    OldFileName := NowSelectFileList.Strings[i];
+    if NewFormCode <> '' then
+      //NewFileName := Copy(OldFileName,1,3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
+      NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir)+1,3)+'_'+NewFormCode+ExtractFileExt(OldFileName)
+    Else
+      //NewFileName := Copy(OldFileName,1,3)+ExtractFileExt(OldFileName)
+      NewFileName := Add_Zoo(GetDocDir_Page(NewCaseNo,NewDocDir)+1,3)+ExtractFileExt(OldFileName);
+
+    if NewCaseNo = NowCaseNo then  //同案件不改順序
+    begin
+      CopyFile(PWideChar(OldFileName),PwideChar(NewPath+NewFileName),False);
+      SetContextList('A',-1,NewCaseNo,NewDocDir,NewFileName);
+      DeleteImageFile(ExtractFilePath(OldFileName),ExtractFileName(OldFileName),NowCaseNo);
+      TreeView1.Selected := MyTreeNode1;
+      //ReNameFile(DisplayPath + OldFileName,NewPath+NewFileName);
+      //ReNameContext(DisplayPath,OldFileName,NewFileName);
+      //MyTreeNode2ReFresh(NowCaseno);
+      //TreeView1Click(nil);
+    end
+    Else
+    begin
+      //Showmessage(DisplayMpsView.FileName+#13+NewPath+NewFileName);
+      ContextList.LoadFromFile(DisplayPath+'Context.dat');
+      if (ContextList.Count = 1) and ((FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'ISCAN')) then
+      begin
+        if Messagedlg(Format(_Msg('移動後(%s)案件無影像,將刪除此案件,是否確定移動?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
+      end;
+      CopyFile(PWideChar(DisplayISB.FileName),PWideChar(NewPath+NewFileName),False);
+      ContextList.LoadFromFile(NewPath+'Context.dat');
+      ContextList.Add(NewFileName);
+      ContextList.SaveToFile(NewPath+'Context.dat');
+      //Showmessage('1');
+      iTreeNode2.Text := Format(_Msg('%s-%d頁'),[NewCaseNo,GetCasePage(ImagePath,NewCaseNo)]);
+      //Showmessage('2');
+      //DrawDocItem(iTreeNode1,FORM_INF_List,NewCaseNo);
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NewCaseno);   20140820改
+      DrawDocItem2(MytreeNode1,NewCaseno);
+      //Showmessage('3');
+      ClearErrini(NewCaseNo,iTreeNode1);
+      ContextList.LoadFromFile(DisplayPath+'Context.dat');
+      if (ContextList.Count = 1) and ((FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'ISCAN')) then
+      begin
+        _DelTree(DisplayPath);
+        SetCaseList('D',MyTreeNode1.IndexOf(MyTreeNode2),'');
+        LoadImgFile;
+      end
+      Else
+      begin
+        ContextList.Delete(ContextList.IndexOf(ExtractFileName(DisplayISB.FileName)));
+        ContextList.SaveToFile(DisplayPath+'Context.dat');
+        DeleteFile(DisplayISB.FileName);
+        ReSortFileName(DisplayPath);
+        ClearErrini(NowCaseNo,MyTreeNode1);
+        MyTreeNode2ReFresh(NowCaseno);
+        //MyTreeNode3ReFresh(NowCaseno);
+        ContextList.LoadFromFile(DisplayPath+'Context.dat');
+        NowCount := MyTreeNode1.Count;
+        if PreCount = NowCount then
+        begin
+          TreeView1.Selected := MyTreeNode1.Item[PreIndex];
+          TreeView1Click(nil);
+        end
+        Else
+        begin
+          TreeView1.Selected := MyTreeNode1;
+          TreeView1Click(nil);
+        end;
+      end;
+    end;
+  end;
+  for I := 0 to NowSelectFileList.Count - 1 do
+  begin
+    OldFileName := NowSelectFileList.Strings[i];
+    ReSortFileName(ExtractFilePath(OldFileName));
+  end;
+  DrawDocItem2(MytreeNode1,NowCaseno);
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+  if GoAtt then
+  begin
+    GotoAttach(AttLv);
+  end;
+  //TreeView1Click(nil);
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1DragOver
+  引用相依:
+  方法描述:判斷樹狀結構拖放操作的有效性。程序會檢核來源影像的表單代碼與目標節點
+            的屬性,限制只能將影像拖入特定的表單層級(Level 3),且排除已存在的相同
+            表單、附件目錄或未註冊的文件類型。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
+  State: TDragState; var Accept: Boolean);
+var
+  NewNode : TTreeNode;
+  ImgFormCode : String;
+  ImgDocNo : String;
+  So : Boolean;
+begin
+  ImgFormCode := FileName2FormCode(ExtractFileName(DisplayISB.FileName));
+  ImgDocNo := Path2DocDir(ExtractFilePath(DisplayISB.FileName),NowCaseno);
+  //ImgDocNo := FileName2NowDcoNo(ExtractFileName(DisplayISB.FileName),ContextList,Context_DocnoList);
+  NewNode := TTreeView(Sender).GetNodeAt(X,Y);
+  //Label3.Caption := format('%d/%s/%s',[NewNode.Level,ImgDocNo,Node2DocNo(NewNode)]);
+  So := False;
+  if TObject(Source) is TImageScrollBox then
+    So := True;
+  Accept := True;
+  if not So
+    or(NewNode=nil)
+    or((NewNode.Level<>3))
+    or((NewNode.Level =3) and (((ImgFormCode=Node3FormID(NewNode)) and (ImgDocNo = Node3DocNo(NewNode))) or (Node3DocNo(NewNode)='')))
+    or(Pos(_Msg('Attach'),Newnode.Text)>0)
+    Then
+      Accept := False;
+
+  {if not So
+    or(NewNode=nil)
+    or((NewNode.Level <>2) and (NewNode.Level<>3))
+    or((NewNode.Level =2) and ((ImgDocNo = Node2DocNo(NewNode))or(Node2DocNo(NewNode)='')or (copy(Node2DocNo(NewNode),1,5)<>'ZZZZZ')))
+    or((NewNode.Level =3) and ((ImgFormCode=Node3FormID(NewNode)) or (ImgDocNo = Node3DocNo(NewNode)) or (Node3DocNo(NewNode)='')))
+    or(Pos(_Msg('未註冊文件'),Newnode.Text)>0)
+     Then
+      Accept := False;}
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1KeyUp
+  引用相依:
+  方法描述:處理樹狀結構的按鍵放開事件。若有選取子節點,則觸發 TreeView1Click 重新
+            載入影像顯示,否則清空視窗。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1KeyUp(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  IF TreeView1.Selected.Parent <> nil Then
+  begin
+    TreeView1Click(nil);
+  end
+  else
+  begin
+    ClearView(1);
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1MouseDown
+  引用相依:
+  方法描述:處理樹狀結構滑鼠按下事件。若是右鍵按下,則自動選取該位置的節點以便後續
+            彈出對應的開單選單。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1MouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  IF Button = TMouseButton(MbRight) Then
+  begin
+    MDown := True;
+    If TreeView1.GetNodeAt(X,Y) = nil then Exit;
+    TreeView1.Selected := TreeView1.GetNodeAt(X,Y);
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1MouseEnter
+  引用相依:
+  方法描述:當滑鼠進入樹狀結構區域時,自動將焦點(Focus)設定至 TreeView1。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1MouseEnter(Sender: TObject);
+begin
+TreeView1.SetFocus;
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1MouseMove
+  引用相依:
+  方法描述:處理樹狀結構滑鼠移動事件,目前實作已註解相關代碼。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1MouseMove(Sender: TObject; Shift: TShiftState;
+  X, Y: Integer);
+begin
+  //TreeView1.SetFocus;
+  {UnRegisterHotKey(Handle, HotKeyId1);
+  UnRegisterHotKey(Handle, HotKeyId2); }
+end;
+
+
+{ ==============================================================================
+  方法名稱:TreeView1MouseUp
+  引用相依:
+  方法描述:處理樹狀結構滑鼠放開事件。若為右鍵點擊且有選取節點,則觸發 TreeView1Cl
+            ick 並彈出與節點層級對應的右鍵選單。
+============================================================================== }
+procedure TCB_IMGPSScanX.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  IF Button = TMouseButton(MbRight) Then
+  begin
+    If TreeView1.GetNodeAt(X,Y) = nil then Exit;
+    if MDown then
+    begin
+      TreeView1Click(self);
+      TreeView1.PopupMenu.Popup(Mouse.CursorPos.X ,Mouse.CursorPos.Y);
+    end;
+    Application.ProcessMessages; //需加這行,不然有些全域變數會沒變到
+    MDown:= False;
+  end;
+end;
+
+

--
Gitblit v1.8.0