Recent

Author Topic: Copying files (drag/drop) with TShellListView and TShellTreeView  (Read 1195 times)

glubbish

  • Jr. Member
  • **
  • Posts: 66
Lazarus 2.0.2
I imagine this has been tried by just about everyone.
I followed https://forum.lazarus.freepascal.org/index.php?topic=37376.0 to add network nodes
I followed https://forum.lazarus.freepascal.org/index.php?topic=45766.0 to do the file copying (drag/drop)

I am able to get the full path/name of the source file.
The local (windows) target works fine, but the added network only gives the name, not the full path

I can see the full path in ffileinfo.name (when examining iNode in debug after "  iNode   := tv.GetNodeAt(x, y);")m but cannot figure out how to access it. I can access Kodi, but not //kodi/data

any help much appreciated.

Code: Pascal  [Select][+][-]
  1. unit Main;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  9.   StdCtrls, ComCtrls, DateUtils, ExtCtrls, FileCtrl, ShellCtrls;
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     ShellListView1: TShellListView;
  16.     ShellTreeView1: TShellTreeView;
  17.     procedure FormActivate(Sender: TObject);
  18.     procedure ShellListView1ColumnClick(Sender: TObject; Column: TListColumn);
  19.   private
  20.     procedure DragDropHandler(Sender, Source: TObject; X, Y: integer);
  21.     procedure DragOverHandler(Sender, Source: TObject; X, Y: integer; State: TDragState; var Accept: boolean);
  22.   public
  23.  
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. var
  30.   infile, outfile: string;
  31.  
  32. type
  33.   TOpenShellTreeNode = class(TTreeNode) // Copied from ShellCtrls
  34.   private
  35.     FFileInfo: TSearchRec;
  36.     FBasePath: string;
  37.   end;
  38.  
  39. type
  40.   TShellTreeViewOpener = class(TShellTreeView);
  41.  
  42. implementation
  43.  
  44. {$R *.lfm}
  45.  
  46. { TForm1 }
  47.  
  48. procedure TForm1.DragDropHandler(Sender, Source: TObject; X, Y: integer);
  49. var
  50.   tv:    TTreeView;
  51.   iNode: TTreeNode;
  52. begin
  53.   tv      := TTreeView(Sender);
  54.   iNode   := tv.GetNodeAt(x, y);
  55.   outfile := iNode.GetTextPath;
  56.   infile  := ShellListview1.root + ShellListView1.Selected.Caption;
  57.   ShowMessage(infile + ' ' + outfile);
  58. end;
  59.  
  60. procedure TForm1.DragOverHandler(Sender, Source: TObject; X, Y: integer; State: TDragState; var Accept: boolean);
  61. begin
  62.   Accept := True;
  63. end;
  64.  
  65. procedure AddToRoot(ToShellTree: TShellTreeView; const Caption, Path: string; Data: Pointer = nil);
  66. var
  67.   RootNode: TOpenShellTreeNode;
  68.   RootDir:  string;
  69. begin
  70.   RootNode                := TOpenShellTreeNode(Pointer(ToShellTree.Items.AddChildObject(nil, Caption, Data)));
  71.   RootDir                 := ExcludeTrailingPathDelimiter(Path);
  72.   RootNode.FFileInfo.Attr := FileGetAttr(RootDir);
  73.   RootNode.FFileInfo.Name := RootDir;
  74.   RootNode.FBasePath      := '';
  75.   RootNode.HasChildren    := True;
  76. end;
  77.  
  78. procedure TForm1.FormActivate(Sender: TObject);
  79. begin
  80.   TShellTreeViewOpener(ShellTreeView1).OnDragDrop := @DragDropHandler;
  81.   TShellTreeViewOpener(ShellTreeView1).OnDragOver := @DragOverHandler;
  82.   addtoroot(ShellTreeView1, 'Kodi', '\\kodi\data\');
  83. end;
  84.  
  85. procedure TForm1.ShellListView1ColumnClick(Sender: TObject; Column: TListColumn);
  86. begin
  87.   if column.index = 1 then ShellListView1.sorttype := stdata else ShellListView1.sorttype := sttext;
  88. end;
  89. end.
  90.  

 

TinyPortal © 2005-2018