Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Drag&Drop einer Datei in TreeView (https://www.delphipraxis.net/130643-drag-drop-einer-datei-treeview.html)

freak4fun 11. Mär 2009 17:42


Drag&Drop einer Datei in TreeView
 
Ich habe diesen Code aus der CL:

Delphi-Quellcode:
uses
  ShellAPI;

private
  procedure WMDROPFILES(var Msg: TMessage); Message WM_DROPFILES;

procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
  i, Counts, Size: Integer;
  PCharFileName: PChar;
begin
  inherited;

  PCharFileName := nil;
  Counts := DragQueryFile(Msg.WParam, $FFFFFFFF, PCharFileName, 255);

  for i := 0 to Counts - 1 do
  begin
    Size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
    PCharFileName := StrAlloc(Size);
    DragQueryFile(Msg.WParam, i, PCharFileName, Size);
    ListBox1.Items.Add(String(PCharFileName));
    StrDispose(PCharFileName);
  end;

  DragFinish(Msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(ListBox1.Handle, True);
end;
Wenn ich nun statt ListBox1 TreeView1 benutzen möchte passiert nichts. Woran liegt das? :gruebel:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(ListBox1.Handle, True);
end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(TreeView1.Handle, True);
end;

_frank_ 11. Mär 2009 18:24

Re: Drag&Drop einer Datei in TreeView
 
Zitat:

Zitat von freak4fun
Delphi-Quellcode:
ListBox1.Items.Add(String(PCharFileName));

das obige hast auch geändert? was passiert genau? ändert sich der drag-cursor korrekt (also wird das drag-over erlaubt)?

Gruß Frank

freak4fun 11. Mär 2009 18:29

Re: Drag&Drop einer Datei in TreeView
 
Zitat:

Zitat von _frank_
Zitat:

Zitat von freak4fun
Delphi-Quellcode:
ListBox1.Items.Add(String(PCharFileName));

das obige hast auch geändert? was passiert genau? ändert sich der drag-cursor korrekt (also wird das drag-over erlaubt)?

Gruß Frank

Nein, das Habe ich gelassen. Denn wenn ich eine exe auf die TreeView ziehe soll der Pfad erst mal in der Listbox stehen. ;) Das Drag&Drop-symbol wird angezeigt. Aber es passiert gar nichts. Auch keine Fehlermeldung. :stupid:

_frank_ 11. Mär 2009 18:54

Re: Drag&Drop einer Datei in TreeView
 
Zitat:

Zitat von freak4fun
Nein, das Habe ich gelassen. Denn wenn ich eine exe auf die TreeView ziehe soll der Pfad erst mal in der Listbox stehen. ;) Das Drag&Drop-symbol wird angezeigt. Aber es passiert gar nichts. Auch keine Fehlermeldung. :stupid:

bisschen benutzer-verwirrend :) naja, wie auch immer...wird die message-procedure aufgerufen (breakpoints,F7,F8)?

Gruß Frank

freak4fun 11. Mär 2009 18:59

Re: Drag&Drop einer Datei in TreeView
 
Nein.

_frank_ 11. Mär 2009 21:30

Re: Drag&Drop einer Datei in TreeView
 
ok, habs mal getestet...sieht so aus, als würde das wirklich nicht mit dem TV funktionieren, aber hab noch keine Idee, woran das liegt...
willst du nur das Treeview als ziel erlauben? wenn ich das ganze Formular als DragZiel erlaube, kann ich die datei auch über dem treeview ablegen...das funktioniert...

HTH Frank

schwa226 25. Jan 2010 12:35

Re: Drag&Drop einer Datei in TreeView
 
Stehe gerade vor dem selben Problem.

Gibt's da schon Abhilfe?

Drop auf die Form geht, Drop auf nur TV-Handle geht nicht.

himitsu 25. Jan 2010 12:41

Re: Drag&Drop einer Datei in TreeView
 
Notfalls dieses probieren:
Ein rahmenloses Panel nehmen, dort die TreeView rein und dann das Drag&Drop in dem Panel implementieren.

PS:
procedure WMDROPFILES(var Msg: TMessage); sollte in der Komponente implementiert sein, wofür auch das D&D-Aktiviert wurde,
also in einen Nachfahren von TTreeView.

Delphi-Quellcode:
DragAcceptFiles(ListBox1.Handle, True);
heißt doch wohl, daß die Drag&Drop-Nachrichten an die ListView gesendet werden sollen
und nicht an die Form, wo aktuell die Nachrichtenbehandlung implementiert wurde?

Oder man kann diese Art nicht verwenden und muß sich an anderer Stelle in die Message-Behandlung einschalten.

schwa226 25. Jan 2010 15:09

Re: Drag&Drop einer Datei in TreeView
 
Zitat:

Zitat von himitsu
heißt doch wohl, daß die Drag&Drop-Nachrichten an die ListView gesendet werden sollen
und nicht an die Form, wo aktuell die Nachrichtenbehandlung implementiert wurde?

Oder man kann diese Art nicht verwenden und muß sich an anderer Stelle in die Message-Behandlung einschalten.

Bei ListBox1.Handle geht es das die Message Funktion in der MainForm die WM_DROPFILES Nachricht bekommt.
Bei TreeView1.Handle schaltet zwar der Cursor um jedoch kommt die Nachricht WM_DROPFILES nicht.

Aber es war der richtige Tipp!

So habe ich es nun hinbekommen:

Delphi-Quellcode:
type
  TMainForm= class(TForm)
    TreeView1 : TTreeView;
    .....

  private
    { Private-Deklarationen }
    OldLBWindowProc: TWndMethod;
  public
    { Public-Deklarationen }
    procedure WMDropFiles(var Msg: TMessage);
  end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  //save old windoproc:
  OldLBWindowProc := TreeView1.WindowProc;
  TreeView1.WindowProc := WMDropFiles;
  //enable drag and drop of treeview:
  DragAcceptFiles(TreeView1.Handle, True);

end;

procedure TMainForm.OnClose(Sender: TObject; var Action: TCloseAction);
begin
  //disable drag and drop of treeview:
  DragAcceptFiles(TreeView1.Handle, False);
end;´

//drag and drop:
procedure TMainForm.WMDropFiles(var Msg: TMessage);
var
  DropH: HDROP;              // drop handle
  DroppedFileCount: Integer; // number of files dropped
  FileNameLength: Integer;   // length of a dropped file name
  FileName: string;          // a dropped file name
  I: Integer;                // loops thru all dropped files
  DropPoint: TPoint;         // point where files dropped
  AnItem : TTreeNode;
begin

  // Store drop handle from the message
  case Msg.Msg of

    WM_DROPFILES : begin
        DropH := Msg.WParam;
        try
          // Optional: Get point at which files were dropped
          DragQueryPoint(DropH, DropPoint);
          // ... do something with drop point here

          AnItem := TreeView1.GetNodeAt(DropPoint.X, DropPoint.Y) ;
          //only handle the drop if node was under drop mouse:
          if AnItem <> nil then
          begin
            // Get count of files dropped
            DroppedFileCount := DragQueryFile(DropH, $FFFFFFFF, nil, 0);
            // Get name of each file dropped and process it
            for I := 0 to Pred(DroppedFileCount) do
            begin
              // get length of file name
              FileNameLength := DragQueryFile(DropH, I, nil, 0);
              // create string large enough to store file
              // (Delphi allows for #0 terminating character automatically)
              SetLength(FileName, FileNameLength);
              // get the file name
              DragQueryFile(DropH, I, PWideChar(FileName), FileNameLength + 1);
              // process file name (application specific)
              // ... processing code here
            end;
          end;
        finally
          // Tidy up - release the drop handle
          // don't use DropH again after this
          DragFinish(DropH);
        end;
        // Note we handled message
        Msg.Result := 0;
    end; // WM_DROPFILES : begin
    //forward message to original WndProc:
    else OldLBWindowProc(Msg);
  end; //case Msg.Msg of
end;
Damit geht das Drag and Drop Event mit TreeView. Scheint zu gehen, bin mir aber nicht sicher ob es auch richtig "Save" ist.

schwa226 26. Jan 2010 11:56

Re: Drag&Drop einer Datei in TreeView
 
Habe hierzu Drag&Drop noch eine Frage:

Wenn ich im TreeView einen Node per Drag&Drop verschiebe wird über OnDragOver der Node selektiert der sich unter der Mouse befindet.

Wenn ich nun aber eine Datei vom Explorer per Drag&Drop darüber ziehe wird OnDragOver nicht ausgelößt.
Erst wenn die Mousetaste losgelassen wird, wird das Event ausgelößt.
Das gleiche ist auch bei MouseOver und gedrückter MouseTaste.

Kann man das noch hinbiegen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz