![]() |
Drag&Drop einer Datei in TreeView
Ich habe diesen Code aus der CL:
Delphi-Quellcode:
Wenn ich nun statt ListBox1 TreeView1 benutzen möchte passiert nichts. Woran liegt das? :gruebel:
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;
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; |
Re: Drag&Drop einer Datei in TreeView
Zitat:
Gruß Frank |
Re: Drag&Drop einer Datei in TreeView
Zitat:
|
Re: Drag&Drop einer Datei in TreeView
Zitat:
Gruß Frank |
Re: Drag&Drop einer Datei in TreeView
Nein.
|
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 |
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. |
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:
heißt doch wohl, daß die Drag&Drop-Nachrichten an die ListView gesendet werden sollen
DragAcceptFiles(ListBox1.Handle, True);
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. |
Re: Drag&Drop einer Datei in TreeView
Zitat:
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:
Damit geht das Drag and Drop Event mit TreeView. Scheint zu gehen, bin mir aber nicht sicher ob es auch richtig "Save" ist.
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; |
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? |
Re: Drag&Drop einer Datei in TreeView
OnDragOver und Co. ist nur für Drag&Drop innerhalb einer Delphi-Anwendung zuständig.
Das Drag&Drop vom Explorer läuft über einen anderen Mechianismus. Zitat:
PS: Du kannst auch eine Eigenart der VCL ausnutzen, die TreeView wärend des Compilierens ersetzen und so dort deine Message doch noch "reinschmugggeln", ohne extern erstmal eine Ableitung der Klasse zu erstellen.
Delphi-Quellcode:
type
TTreeView = class(ComCtrls.TTreeView) procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES; end; TMainForm = class(TForm) TreeView1 : TTreeView; ..... end; procedure TTreeView.WMDROPFILES(var Msg: TMessage); var i, Counts, Size: Integer; PCharFileName: PChar; begin Counts := DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 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); ... StrDispose(PCharFileName); end; DragFinish(Msg.WParam); end; procedure TMainForm.FormCreate(Sender: TObject); begin DragAcceptFiles(TreeView1.Handle, True); end; |
Re: Drag&Drop einer Datei in TreeView
[edit]
*kann gelöscht werden* |
Re: Drag&Drop einer Datei in TreeView
Zitat:
Zitat:
|
Re: Drag&Drop einer Datei in TreeView
Zitat:
WM_DROPFILES ist eine der Windows-Messages für das D&D seitens Windows, welches über ![]() Wie dieses andere D&D-ähnliche Verhalten (OnDragOver und Co.) innerhalb von Delphi abläuft, das weiß ich nicht, es geht aber nicht über die "Schnittstellen" von Windows. Soweit ich erkennen kann, werden dort delphieigene Nachrichten direkt zwischen VCL-Controls verschickt. |
Re: Drag&Drop einer Datei in TreeView
Jetzt habe ich noch eine Frage dazu:
Wie sieht es eigentlich mit Drag&Drop von TreeView -> Explorer aus? Da ändert sich bei mir der Cursor nicht... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz