Solved

Copy & Paste in a TreeView ?

Posted on 2001-09-02
16
996 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
  • 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
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.

 
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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
In this video I am going to show you how to back up and restore Office 365 mailboxes using CodeTwo Backup for Office 365. Learn more about the tool used in this video here: http://www.codetwo.com/backup-for-office-365/ (http://www.codetwo.com/ba…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

813 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

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now