線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2980
推到 Plurk!
推到 Facebook!

TreeView 拖放事件參考寫法

 
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-11 19:33:24 IP:211.20.xxx.xxx 未訂閱
拖放時功能: 
  1. 要拖放到未展開節點的子節點上時,滑鼠停在要展開的節點一會兒,會自動展開
  2. 要拖放到超過目前顯示範圍時,會自動捲動
  3. 禁止拖放到自己的子節點上
將 DragMode 屬性設定為 dmAutomatic 撰寫事件程式如下:
<textarea cols="80" rows="130" class="delphi" name="code"> procedure TfmERingNG.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
AnItem: TTreeNode;
i, j, iBegin, iEnd, iLevel: Integer;
Pt: TPoint;
StartTime, EndTime: TDateTime;
begin
if TreeView1.Selected = nil then
Exit;
iBegin := TreeView1.Selected.AbsoluteIndex;
iLevel := TreeView1.Selected.Level;
i := iBegin;
while i < TreeView1.Items.Count - 1 do
begin
i := i 1;
if TreeView1.Items[i].Level <= iLevel then
Break;
end;
if i <= TreeView1.Items.Count - 1 then
iEnd := i - 1
else
iEnd := i;
AnItem := TreeView1.GetNodeAt(X, Y);
Accept := (Source = TreeView1)
and (AnItem <> nil)
and not ((AnItem.AbsoluteIndex >= iBegin)
and (AnItem.AbsoluteIndex <= iEnd));
if AnItem = nil then
Exit;
if not AnItem.Expanded and AnItem.HasChildren then
begin
if (State = dsDragMove) and AnItem.DropTarget then
begin
StartTime := Now;
GetCursorPos(Pt);
Pt := ScreenToClient(Pt);
TreeView1.RePaint;
while AnItem = TreeView1.GetNodeAt(Pt.x, Pt.y) do
begin
GetCursorPos(Pt);
Pt := ScreenToClient(Pt);
if Now - StartTime > 0.000001 then
Break;
end;
EndTime := Now;
if EndTime - StartTime > 0.000001 then
begin
AnItem.Expand(False);
TreeView1.RePaint;
end;
end;
end;
while (Y > TreeView1.Height - GetSystemMetrics(SM_CYHSCROLL) - 5)
and (Y <= TreeView1.Height) do
begin
GetCursorPos(Pt);
Pt := ScreenToClient(Pt);
Y := Pt.y;
i := TreeView1.TopItem.AbsoluteIndex;
j := 1;
while (i j <= TreeView1.Items.Count)
and (TreeView1.Items[i j].Parent <> nil)
and (not TreeView1.Items[i j].Parent.Expanded) do
j := j 1;
TreeView1.TopItem := TreeView1.Items[i j];
TreeView1.RePaint;
if i = TreeView1.TopItem.AbsoluteIndex then
Break;
Sleep(50);
end;
while (Y < 20) and (Y >= 0) do
begin
GetCursorPos(Pt);
Pt := ScreenToClient(Pt);
Y := Pt.y;
i := TreeView1.TopItem.AbsoluteIndex;
j := 1;
while (i - j >= 0) and (TreeView1.Items[i - j].Parent <> nil)
and (not TreeView1.Items[i - j].Parent.Expanded) do
j := j 1;
if i > 0 then
begin
TreeView1.TopItem := TreeView1.Items[i - j];
TreeView1.RePaint;
end;
if i = 0 then
Break;
Sleep(50);
end;
end;

procedure TfmERingNG.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
AnItem: TTreeNode;
AttachMode: TNodeAttachMode;
HT: THitTests;
begin
if TreeView1.Selected = nil then
Exit;
HT := TreeView1.GetHitTestInfoAt(X, Y);
AnItem := TreeView1.GetNodeAt(X, Y);
if AnItem = nil then
Exit;
if (HT - [htOnItem, htOnRight, htOnIcon, htNowhere, htOnIndent] <> HT) then
begin
AttachMode := naInsert;
if (htOnItem in HT)
or (htOnRight in HT) or (htOnIcon in HT) then
AttachMode := naAddChild
else if htNowhere in HT then
AttachMode := naAdd
else if htOnIndent in HT then
AttachMode := naInsert;
TreeView1.Selected.MoveTo(AnItem, AttachMode);
end;
end;

</textarea>
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2007-06-11 14:11:13, 註解 無‧
sryang 重新編輯於 2007-06-11 14:23:15, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-02-07 17:29:08 IP:59.120.xxx.xxx 未訂閱
這內容太經典

推一下!
it1506
初階會員


發表:30
回覆:83
積分:47
註冊:2011-02-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-03-26 13:14:22 IP:59.120.xxx.xxx 未訂閱
我也推一下
===================引 用 GrandRURU 文 章===================
這內容太經典

推一下!
P.D.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-03-28 18:00:31 IP:59.120.xxx.xxx 未訂閱
感謝分享! 大家來襄盛舉吧!
好久沒看到 sryang兄了!
編輯記錄
P.D. 重新編輯於 2012-03-28 04:00:57, 註解 無‧
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-03-29 11:25:49 IP:59.125.xxx.xxx 未訂閱
哎呀呀!這篇又被挖出來了
這是當時寫一個功能表內容編輯工具時寫的程式,分享出來給大家參考
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2017-10-24 15:48:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!