Copy & Paste in a TreeView ?

Has anybody an example how to realize
copy & paste in a TTreeView?
Multiselect = false but the function should also copy
the children of a node.

Thanks

tas
LVL 2
TasomiaAsked:
Who is Participating?
 
SlavakCommented:
From WM_PASTE function: AddNodes(Self, T.Items[0], Selected);
 
when T (selection) is empty Index = 0 and FCount = 0, so you need check it.
0
 
smurffCommented:
listening
0
 
SlavakCommented:
standard TreeView not support copy/paste tree nodes.

But you can write component with the feature.
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
TasomiaAuthor Commented:
But how ?
0
 
kretzschmarCommented:
if you would raise the points,
then i would post a sample :-))
0
 
TasomiaAuthor Commented:
Ok, now you get 130 points!
0
 
kretzschmarCommented:
hu, well ok,
tell me which delphi-version u use
0
 
SlavakCommented:
Example:

  TCPTreeView = class(TTreeView)
  private
   procedure WMCopy(var Msg : TMessage); message WM_COPY;
   procedure WMPaste(var Msg : TMessage); message WM_PASTE;
  protected
   procedure AddNodes(ATree : TTreeView; ASrc, ADst: TTreeNode);
  public
   procedure DoCopy;
   procedure DoPaste;
  End;

------------------------------

procedure TCPTreeView.DoCopy;
begin
 Perform(WM_COPY, 0, 0);
end;

procedure TCPTreeView.DoPaste;
begin
 Perform(WM_PASTE, 0, 0);
end;


procedure TCPTreeView.AddNodes(ATree : TTreeView; ASrc, ADst : TTreeNode);
Var
 NextSrc, NextDst : TTreeNode;
Begin
 NextDst := ATree.Items.AddChild(ADst, '');
 NextDst.Assign(ASrc);

 NextSrc := ASrc.GetFirstChild;
 while Assigned(NextSrc) Do Begin
  AddNodes(ATree, NextSrc, NextDst);
  NextSrc := ASrc.GetNextChild(NextSrc);
 End;
End;

procedure TCPTreeView.WMCopy(var Msg: TMessage);
Var
 T : TTreeView;
begin
 If not Assigned(Selected) Then Exit;

 T := TTreeView.Create(nil);
 Try
  T.Visible := False;
  T.Parent := Self;
  AddNodes(T, Selected, nil);
  ClipBoard.SetComponent(T);
 finally
  T.Free;
 end;
end;

procedure TCPTreeView.WMPaste(var Msg: TMessage);
Var
 A     : TComponent;
 T     : TTreeView;
begin
 Try
  A := ClipBoard.GetComponent(Self, Self);// as TCPTreeView;
  T := A as TTreeView;
  AddNodes(Self, T.Items[0], Selected);
 finally
  T.Free;
 end;
end;


Regards.
0
 
SlavakCommented:
you should add some code to keyboard handler to check for ^C/^V combination.
0
 
kretzschmarCommented:
seems someone had waited too

good work, slavak :-)
0
 
TasomiaAuthor Commented:
Hi Slavak,
Thanks for your great code!

I had to add
RegisterClasses([TTreeView]);
in order to get it work.


Now as it works for the standard TTreeView
I wanted it to work with TTreeNT.
I adapted the Code but when I run DoPaste I get an error
"the index of the list exceeds the maximum (0).

error raises here:  

function TTreeNodeList.Get(Index: Integer): TTreeNTNode;
begin
if (Index < 0) or (Index >= FCount) then
  {$ifdef DFS_COMPILER_3_UP}
    Error(SListIndexError, Index);
...


Does anybody have an idea why ?

tas

BTW: Slavak, the points are yours but I would be glad if somebody could help me with the TTreeNT problem.
0
 
TasomiaAuthor Commented:
I still can't get it work. The selection is not empty!
What's wrong ?
0
 
TasomiaAuthor Commented:
I still can't get it work. The selection is not empty!
What's wrong ?
0
 
SlavakCommented:
I'm not using TreeNT component and cannot do it myself, but it should be simple debugging check.
Place breakpoint in the function, and you will see Index value that make a problem.
0
 
TasomiaAuthor Commented:
The problem is, that after

T := A as TMYTreeNT; // My TreeNT Component


T.Items.Count is always = 0


0
 
geobulCommented:
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:

accept Slavak's comment as answer

Please leave any comments here within the next seven days.

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Thanks,

geobul
EE Cleanup Volunteer
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.