![]() |
DragOver vom Explorer erkennen
Hallo.
Wenn man im Explorer (oder vom Desktop) eine Datei per DragDrop ins eigene Formular zieht und dort loslässt, kann man sich die Daten der Quelle einverleiben. Für mich geht es aber um den Schritt vorher: das "DragOver". Ich habe eine Anwendung aufgebaut, die virtuelle Explorer-Listviews benutzt. Betrachtet man nun ein einzelnes ListView, so kann es vom User auf- oder zugeklappt werden. Was ich erreichen will, ist ein automatisches Aufklappen, wenn bei einem DragDrop vom Explorer mit der Maus über einen "Aufklapp"-Button gefahren wird. Glaubt mir, ich habe mich schon dusselig gesucht! Im Internet, in den Foren, in der Delphi-Hilfe, der MSDN und wer weiß wo sonst noch! Ich weiß noch nicht mal, welche Suchbegriffe ich für dieses Thema nehmen soll. Zu "Drag & Drop", "DragOver", oder "Drag systemweit erkennen" gibt es Millionen "Treffer". Die haben jedoch alle nichts mit dem Thema zu tun. Das Einzige was ich gefunden habe, ist " ![]() Kurzfassung: Wie kann ich über einem eigenen Control (z. B. TPanel) ein "DragOver" vom Explorer erkennen und z. B. ein ListView vergrößern ("aufklappen")? Grüße, Guido. |
Re: DragOver vom Explorer erkennen
Hallo,
vielleicht kannst Du Dir mit ![]() Oder noch einfacher: ![]()
Delphi-Quellcode:
Gruß
unit Unit1;
interface uses Windows, Classes, Controls, Forms, ActiveX; type TForm1 = class(TForm, IDropTarget) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public function DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function DragLeave: HResult; stdcall; function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; end; var Form1: TForm1; implementation {$R *.dfm} uses Dialogs; { TForm1 } function TForm1.DragEnter(const dataObj: IDataObject; grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult; begin dwEffect := DROPEFFECT_COPY; Result := S_OK; end; function TForm1.DragLeave: HResult; begin Result := S_OK; end; function TForm1.DragOver(grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult; begin Color := RGB(Random(256), Random(256), Random(256)); dwEffect := DROPEFFECT_COPY; Result := S_OK; end; function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult; begin dwEffect := DROPEFFECT_COPY; Result := S_OK; end; procedure TForm1.FormCreate(Sender: TObject); var R: Integer; begin R := RegisterDragDrop(Handle, Self); if R <> S_OK then ShowMessage('Couldn''t initialize Drag''n''Drop!'); Randomize; end; procedure TForm1.FormDestroy(Sender: TObject); begin RevokeDragDrop(Handle); end; initialization OleInitialize(nil); end. xaromz |
Re: DragOver vom Explorer erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
weil ich sowas schon lange machen wollte, habe ich gleich eine Komponente gebastelt, die das Droppen von Dateien behandelt. Gruß xaromz |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Das hört sich doch gut an! Ich werde es heute noch ausprobieren und mich dann melden. Bis hierhin schon mal vielen Dank. Guido. |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Als Allererstes ein dickes Dankeschön! Die Komponente funktioniert (fast) wunderbar. Für meine Zwecke sind insbesondere die Ereignisse "DragEnter" und "DragLeave" geeignet. Umgangssprachlich ist es zwar richtig, dass ich beim "DragOver" über z. B. Panel1 das ListView1 zeigen will. Programmiertechnisch sieht das anders aus: Genaugenommen soll, wie oben schon angedeutet, "DragEnter" ermittelt werden. Ab dann läuft eine Verzögerung von ca. 0,5 bis 1 Sekunde an. Wird das Panel1 innerhalb dieser Verzögerung wieder verlassen (= "DragLeave"), so wird das Zeigen des ListView1 NICHT ausgeführt. Insofern ist deine Komponente genau das Richtige für meine Zwecke! 2 Probleme bestehen noch: Erstens: Wie kann ich mehrere Controls an "ShellDroper" zuweisen? So dass z. B. Panel1 .. Panelx überwacht werden. Zweitens: Mein Test-Programm enthält die Form1, darauf sind zwei Panels (Panel1 und Panel2). Panel1 habe ich der Komponente ("ShellDropper1") zur Designtime zugewiesen. Während der Ausführung des Test-Programms funktioniert alles ( "DragEnter", "DragOver" und "DragLeave"). Jedoch beim Beenden des Test-Programms wird folgende Exeption ausgelöst: ---------------------------------------- Debugger Exception Notification ---------------------------------------- Project Project1.exe raised exception class EInvalidOperation with message 'Control 'Panel1' has no parent window'. Danach habe ich im Code deiner Komponente fogendes hinzugefügt:
Delphi-Quellcode:
Leider bleibt die oben beschriebene Exeption.
...
initialization OleInitialize(nil); finalization OleUninitialize; // <-- hinzugefügt (Ist das richtig/notwendig?) end. Wie kann das behoben werden? Nochmal dickes Lob für die Komponente! Ich hoffe, dass wir zumindest das Problem mit der Exeption lösen können. Gruß, Guido. |
Re: DragOver vom Explorer erkennen
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: DragOver vom Explorer erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
so, jetzt kann die Komponente auch mit mehreren Controls umgehen. Das Control, für welches das Ereignis gerade gilt, steckt im "Sender". Die Exception sollte jetzt nicht mehr kommen. Leider habe ich es aber nicht hinbekommen, ein Control abzumelden, bevor es sein Handle verliert. Deshalb kann ich nicht garantieren, dass es hier kein Ressourcenleck gibt. Aber eigentlich sollte Windows erkennen, dass das Handle zerstört wird und selbiges abmelden. Gruß xaromz |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Hier schon mal ein Vorweg-Lob! In meinem Kurztest hat das sehr gut hingehauen. Und außerdem die Eingabe für mehrere Contols find ich gelungen! Den Bereich "TShellDropper.Notification" hatte ich schon im Auge. Da scheint sich ja auch was getan zu haben. Ich werde den neuen Code heute noch ausführlich testen und melde mich dann. Bis dahin: Danke! Guido. |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Es gibt eine gute und eine schlechte Nachricht. Zuerst die Gute: So wie die Komponente "ShellDropper" angelegt ist, das find ich echt genial. Es können kompfortabel mehrere Controls zur Überwachung angegeben werden. Jedes Control kann einzeln enabled oder disabled werden. Trozdem benutzen alle Controls die gleichen Event-Routinen (z. B. für DragEnter und DragLeave). Dadurch ist die Handhabung wirklich gut. Der Betrieb funktioniert dann auch wirklich so, wie man es sich vorstellt. Dann die Schlechte: Nach der Benutzung der Komponente in der IDE verhält sich die IDE "sonderbar". Es kommen z. B. Exeptions wenn ich den Code von dieser oder von anderen Komponenten ansehe. Z. B. "Forms" oder "Windows". Dann ist es mir fast unmöglich, eine "ShellDropper"-Komponente zu löschen. Das heißt, ich setzt eine Komponente auf ein leeres Form. Ob ich nun ein anderes Control zur Überwachung zuweise oder nicht, wenn ich die "ShellDropper"-Komponente löschen will beginnt ein Exeption-Regen: Error --------------------------- Access violation at address 51F3155D in module 'rtl100.bpl'. Read of address 95D5C950. --------------------------- Error --------------------------- Invalid pointer operation --------------------------- Error --------------------------- Borland Delphi for Microsoft Windows: bds.exe - Fehler in Anwendung --------------------------- Die Ausnahme "Unbekannter Softwarefehler" (0x0eedfade) ist in der Anwendung an der Stelle 0x7c81eb33 aufgetreten. --------------------------- --------------------------- Application Error --------------------------- Exception EInvalidPointer in module rtl100.bpl at 0000657D.Invalid pointer operation. --------------------------- Hat das vielleicht mit dem Ressourcenleck zu tun, das du erwähnt hast? Gruß, Guido. |
Re: DragOver vom Explorer erkennen
Hallo,
Zitat:
Zitat:
Ich habe die Komponente nur in Delphi 2006 getestet, da funktioniert sie einwandfrei. Sie ist eigentlich auch so konstruiert, dass sie in der IDE nicht aktiv wird. Ich werde mir das noch mal ansehen. Zitat:
Gruß xaromz |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Ich benutze ebenfalls Delphi 2006. Zitat:
Wenn ich eine ShellDropper-Komponente löschen will kommen die Exeptions in diesem Moment. Was passiert denn bei dir, wenn du eine ShellDropper-Komponente löschst? Funktioniert das denn? Gruß, Guido. |
Re: DragOver vom Explorer erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
der Fehler tritt bei mir ebenfalls auf. Versuch doch mal die angehängte Version. Gruß xaromz |
Re: DragOver vom Explorer erkennen
Ja, Sir! Wird gemacht Sir! :-D *grins*
Grüße, Guido. |
Re: DragOver vom Explorer erkennen
So einfach wie genial.
Einfach zu Handhaben und eine Sache die man öfter benutzten wird. Danke für die Arbeit :thumb: |
Re: DragOver vom Explorer erkennen
@oschulz
Wust' ich's doch! Da haben sich auch noch andere für das Thema interessiert! *smile* :wink: @xaromz Also die ersten Test hat dein Code wunderbar bestanden. In einem Testaufbau hat alles wunderbar funktioniert, ohne Querschläger und Exeptions! Am Wochenende werde ich wahrscheinlich dazu kommen, es in "echt", also in meiner Applikation auszuprobieren. Danach werde ich gerne meine Ergebnisse mit allen teilen. Apropos: @alle die sich für dieses Thema und den wirklich guten Code von xaromz interessieren: Ein Forum lebt davon, dass möglichst viele ihre Gedanken und Erfahrungen miteinander teilen. Deshalb freue ich mich, wenn der ein oder andere sich hier zu Wort meldet und sagt, ob er Fehler gefunden hat, oder ob xaromz' Code so gut funktioniert, wie es im Moment aussieht. Viele Grüße, Guido. |
Re: DragOver vom Explorer erkennen
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: DragOver vom Explorer erkennen
Zitat:
Ich such momentan eine Möglichkeit, einen Link aus dem Internet Explorer auf ein TEdit in meinem Programm zu ziehen, geht das mit TShelldropper? Falls nicht, ließe sich TShelldropper entsprechend erweitern? |
Re: DragOver vom Explorer erkennen
Das is auch möglich. Der Shelldroper gibt dir einen String mit den markierten Dateien zurück. Die kannst du dann nach deinen Wünschen verarbeiten. Der Pfad zu den Dateien ist dabei absolut, also ein kompletter Pfad.
Edit Schreibfehler berichtigen :D |
Re: DragOver vom Explorer erkennen
Ja und wie wird TShelldropper nun "verdrahtet"? Kleines Codesample oder Pointer reicht ja schon, so ganz ohne Doku fühl ich mich momentan etwas "nackt" ;)
|
Re: DragOver vom Explorer erkennen
am Besten du installierst dir die Komponente als Package und packst sie auf deine Form. Danach wählst du Controlsliste die Controls aus, die "überwacht" werden sollen. Per Hand kannst du auch den Formularnamen eingeben. Dann kannst du bei OnDrop deinen Code einfügen. Ist sehr Simple, das bekommst du schon hin.
|
Re: DragOver vom Explorer erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
die Komponente kann bisher nur mit dem Format "CF_HDROP" umgehen, welches die Shell verwendet. Der IE nutzt aber das Format "CFSTR_INETURL". Natürlich ist es kein großes Problem, die Komponente so abzuändern, dass sie auf dieses Format reagiert. Ich hab da mal was vorbereitet... Die Komponente besitzt jetzt eine neue Eigenschaft "DropSource". Darüber kann man einstellen, ob die Komponente Dateien oder Internetlinks annimmt. Zitat:
Gruß xaromz |
Re: DragOver vom Explorer erkennen
Ich war nur über die Designtime-Realisierung etwas irritiert. Zuerst legt man abstrakte DropControls an, die man danach dann nochmal einzeln anfasst und mit existierenden Controls verknüpft :) Ich hatte mir das gestern nur kurz mal angeschaut, werd gleich mal das neue Package kompilieren und das ganze ausprobieren :)
Edit: So, nun habe ich begriffen wie das Ding funktioniert und auch Drag and Drop aus dem IE hinbekommen. Der Trick war, das Property DropSource von TShelldropper korrekt einzustellen :) Leider funktioniert das ganze nur mit dem IE, andere Browser sind da nicht so kooperativ. Da muss ich jetzt wohl doch Plugins bauen ;) Gibt es eigentlich einen Grund dafür, dass man nur jeweils eine Art DropSource behandeln kann? |
Re: DragOver vom Explorer erkennen
@xaromz
Delphi-Quellcode:
... ich hab kleine Probleme bei der Übersetzung.
{ Use of this file is permitted for commercial and non-commercial }
{ use, as long as the author is credited. } Ich finde deine Klasse echt durchdacht und würde sie gern verwenden. Was ist mit is credited gemeint? Frank |
Re: DragOver vom Explorer erkennen
Hallo,
Zitat:
Das ist mein Standard-Disclaimer und bei dieser Komponente eigentlich Overkill. Du kannst also die Nennung auch weglassen. Gruß xaromz |
Re: DragOver vom Explorer erkennen
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: DragOver vom Explorer erkennen
Ah gut, ich dachte mir schon sowas. Ich hab mich mit dem Thema Drag and Drop bisher noch nicht so arg beschäftigt, aber jetzt liegts für ein Projekt halt gerade akut an. Ist allerdings auch nur "Zuckerguss" so dass ich da nicht viel Zeit investieren kann. Aber die Komponente ist schon genial, das muss man Dir lassen :)
|
Re: DragOver vom Explorer erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
die überarbeitete Version im Anhang (v1.2) kann jetzt mit Shell, IE und Firefox umgehen (bei Opera kommt nicht mal ein Event :cry: ). In den Ereignissen wird jetzt jeweils ein Record übergeben, in dem die Art des Objekts steht (Shell oder URL). Je nach Quelle ist entweder die StringListe (Ansi + Unicode) oder die URL gefüllt. Gruß xaromz |
Re: DragOver vom Explorer erkennen
Wow, ich bin wirklich begeistert. Das nenne ich mal prompt :) Dass Opera da recht eigensinnig ist, ist mir auch schon aufgefallen, Windows bringt beim Drag and Drop über die Taskleiste nicht mal den Zielprozess nach vorne. Da ham die Jungs vermutlich was vergessen :)
|
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Nach meinem letzten Posting musste ich mich auf die Abschlussprüfung meiner Umschulung vorbereiten. Diese Abschlussprüfung war Ende November. Danach musste ich mich um mein Auskommen kümmern (Jobsuche), und jetzt kam Weihnachten mit seinen Vorbereitungen. Deshalb kam ich leider nicht dazu, deinen Code komplett zu testen. Da sich aber löblicherweise auch andere damit beschäftigt und hier keine Fehler gemeldet haben, gehe ich davon aus, dass da alles in Ordnung ist. In nächster Zeit werde ich auch weiterhin mit Arbeitssuche beschäftigt sein (Fachinformatiker Anwendungsentwicklung). Da wird wohl keine Zeit zum Testen bleiben. Trotzdem wollte ich mich melden und mich dem Lob der anderen DPler anschließen! Ich finde, es ist eine wirklich löbliche Sache, einen Komponente zu entwickeln und zur Verfügung zu stellen. Vielen Dank, Guido. |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Die version 1.2 geht mit delphi 7 nicht mehr (keine WideStrings.dcu)! Sonst super komponente! |
Re: DragOver vom Explorer erkennen
Hallo,
ich konnte mir damit behelfen aus allen Widesstrings und TWideStrings und TWideStringList, Strings, TStrings und TStringlists zu machen. (und die WideStrings Unit auszukommentieren) Das Problem mit MK_ALT konnte ich allerdings nicht lösen, kennt meine Delphi Version (5) nicht. Ansonsten super Sache :) |
Re: DragOver vom Explorer erkennen
Hallo zusammen,
tolles Projekt! Bin nur leider zu blöd das als Package zu installieren..(bin da noch etwas unerfahren *schäm*) Könnte mal jemand etwas detaillierter beschreiben.. (Das ist ja nur ein Pas-File, und keine Package-Datei(dpk) :?) Ich benutze Delphi 7 - über Component/install Packages.. geht da nix mit pas-files.. tut mir leid,bin echt ratlos, hat vielleicht jemand Lust ein kleines Tutorial zu schreiben (Oder wenn es sehr verzwickt ist, könnte hier jemand für die letzte Version das .dpk reinstellen) ? In freudiger Erwartung ..Brad |
Re: DragOver vom Explorer erkennen
Zitat:
Gruß ..Brad |
Re: DragOver vom Explorer erkennen
Zitat:
dann speichern und nochmal rechtsklick -> installieren. |
Re: DragOver vom Explorer erkennen
Zitat:
(der gute alte Projektmanager, den sollte ich mal gründlich studieren.., das mit den Packages ist ja wirklich sehr praktisch wie ich hier sehe..) jetzt gehts *freu* nur schade, daß Opera sich verweigert. Vielleicht bekommt das hier doch noch jemand hin (?) Drag&Drop aus Opera auf den Desktop geht - müßte doch also irgendwie möglich sein.. Vielen Dank ..Brad |
Re: DragOver vom Explorer erkennen
Was noch ein Hit wäre...
wäre Unterstützung für Drag&Drop direkt aus Outlook. Anhänge aus Thunderbird gehen ja jetzt schon nur bei Outlook-Anhängen reagiert noch nichts. Wäre das denkbar und lösbar? |
Re: DragOver vom Explorer erkennen
Hallo,
ich kann mir mal anschauen, was da von Outlook kommt, wenn man einen Anhang droppt. Dazu komme ich aber wahrscheinlich erst nächste Woche. Was kommt denn von Thunderbird an? Der Dateiname? Welchen Pfad hat der dann? Gruß xaromz |
Re: DragOver vom Explorer erkennen
Hallo,
habe gerade nachsehen können, was kommt wenn man von Thunderbird ein Attachement bekommt. Der macht das dann über das Filesystem Wenn man Attachement mit Namen A.xls droppt, steht bei mir C:\Dokumene~1\guenter\LOKALE~1\Temp\A.xls Er machts also anscheinend über das Temp Verzeichnis des jeweiligen Users. Schön wärs natürlich wenn die gesamte Email auch ginge. |
Re: DragOver vom Explorer erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Jetzt geht also auch Outlook. Es ist wohl so, dass Outlook einen etwas anderen Weg geht: es übergibt die Dateien als Stream. Das führt zu ein paar Änderungen in der Komponente:
Gruß xaromz |
Re: DragOver vom Explorer erkennen
Hallo xaromz.
Es ist schon erstaunlich, was sich aus meinem kleinen Anfangsproblem entwickelt hat. Die ShellDropper.pas ist ja nun eine Komponente geworden, die wirklich einige Features zu bieten hat. Lob und Dank für deine Arbeit! :thumb: Viele Grüße, Guido. PS: Wenn die Komponente jetzt auch noch Kaffee kochen könnte, ... ! :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 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