<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91758&amp;view=findpost&amp;p=687268</guid>
        <pubDate>Tue, 19 Apr 2005 06:07:03 +0000</pubDate>
        <title>Drag&amp;amp;Drop в TTreeView</title>
        <link>https://forum.sources.ru/index.php?showtopic=91758&amp;view=findpost&amp;p=687268</link>
        <description><![CDATA[s-mike: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit Unit1;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,</div><div class="code_line">&nbsp;&nbsp;ComCtrls;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TForm1 = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;TreeView1: TTreeView;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;State: TDragState; var Accept: Boolean);</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure MoveNode(TargetNode, SourceNode: TTreeNode);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Form1: TForm1;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.MoveNode(TargetNode, SourceNode: TTreeNode);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;NodeTmp: TTreeNode;</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;with TreeView1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;// проверяем, является ли целевой элемент предком перетаскиваемого</div><div class="code_line">&nbsp;&nbsp; &nbsp;NodeTmp := TargetNode.Parent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while Assigned(NodeTmp) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if NodeTmp = SourceNode then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Abort</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;NodeTmp := NodeTmp.Parent;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// копируем перетаскиваемый элемент в новосозданный</div><div class="code_line">&nbsp;&nbsp; &nbsp;NodeTmp := Items.AddChild(TargetNode, SourceNode.Text);</div><div class="code_line">&nbsp;&nbsp; &nbsp;NodeTmp.Data := SourceNode.Data;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for I := 0 to SourceNode.Count - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;MoveNode(NodeTmp, SourceNode.Item[I]);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Selected := NodeTmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TopItem := NodeTmp.getPrev;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TargetNode.Expand(True);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;TargetNode, SourceNode: TTreeNode;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;with TreeView1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;TargetNode := GetNodeAt(X, Y);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SourceNode := Selected;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (TargetNode = SourceNode) or (TargetNode = nil) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;EndDrag(False);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MoveNode(TargetNode, SourceNode);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SourceNode.Free;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;</div><div class="code_line">&nbsp;&nbsp;State: TDragState; var Accept: Boolean);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SourceNode, TargetNode, NodeTmp: TTreeNode;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Sender = TreeView1 then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;// скроллинг дерева при перетаскивании</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Y &#62; TreeView1.Height - 10 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TreeView1.TopItem := TreeView1.TopItem.getNext;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Sleep(100); // пауза</div><div class="code_line">&nbsp;&nbsp; &nbsp;end else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Y &#60; 10 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;TreeView1.TopItem := TreeView1.TopItem.getPrev;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Sleep(100); // пауза</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TargetNode := TreeView1.GetNodeAt(X, Y);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SourceNode := TreeView1.Selected;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (TargetNode = nil) or (TargetNode = SourceNode) then Abort;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Accept := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// проверяем, является ли целевой элемент предком перетаскиваемого</div><div class="code_line">&nbsp;&nbsp; &nbsp;NodeTmp := TargetNode.Parent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while Assigned(NodeTmp) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if NodeTmp = SourceNode then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Abort</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;NodeTmp := NodeTmp.Parent;</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;Accept := False;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>s-mike</author>
        <category>VCL</category>
      </item>
	
      </channel>
      </rss>
	