Solved

Copy & Paste in a TreeView ?

Posted on 2001-09-02
16
1,034 Views
Last Modified: 2010-04-06
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
0
Comment
Question by:Tasomia
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 5
  • 3
  • +2
16 Comments
 
LVL 3

Expert Comment

by:smurff
ID: 6448899
listening
0
 
LVL 3

Expert Comment

by:Slavak
ID: 6449040
standard TreeView not support copy/paste tree nodes.

But you can write component with the feature.
0
 
LVL 2

Author Comment

by:Tasomia
ID: 6449188
But how ?
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 27

Expert Comment

by:kretzschmar
ID: 6450573
if you would raise the points,
then i would post a sample :-))
0
 
LVL 2

Author Comment

by:Tasomia
ID: 6450686
Ok, now you get 130 points!
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6450884
hu, well ok,
tell me which delphi-version u use
0
 
LVL 3

Expert Comment

by:Slavak
ID: 6451062
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
 
LVL 3

Expert Comment

by:Slavak
ID: 6451070
you should add some code to keyboard handler to check for ^C/^V combination.
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6451102
seems someone had waited too

good work, slavak :-)
0
 
LVL 2

Author Comment

by:Tasomia
ID: 6451572
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
 
LVL 3

Accepted Solution

by:
Slavak earned 130 total points
ID: 6452351
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
 
LVL 2

Author Comment

by:Tasomia
ID: 6454671
I still can't get it work. The selection is not empty!
What's wrong ?
0
 
LVL 2

Author Comment

by:Tasomia
ID: 6454695
I still can't get it work. The selection is not empty!
What's wrong ?
0
 
LVL 3

Expert Comment

by:Slavak
ID: 6456101
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
 
LVL 2

Author Comment

by:Tasomia
ID: 6466839
The problem is, that after

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


T.Items.Count is always = 0


0
 
LVL 17

Expert Comment

by:geobul
ID: 9290020
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

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…

739 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question