Wie implementieren von Drag & Drop von outlook, mail oder thunderbird, um ein delphi-form?
Hat jemand bereits implementiert Drag & Drop von E-Mails von Outlook und/oder Thunderbird (von nun an "OT") zu einem Delphi-Formular.
Ich brauchen, um dem Benutzer eine Möglichkeit zum speichern wichtiger E-Mails in meine Datenbank-Anwendung schreiben ohne OT-plugins. Derzeit wird Sie diese Technik verwenden:
- von OT Sie klicken Sie auf eine E-Mail,
- speichern unter...
- speichern Sie auf Ihrem desktop oder im Ordner "temp",
- drag-and-drop die gespeicherte Datei auf der Delphi-Formular.
Während nach der änderung, die ich tun will:
- von OT Sie klicken Sie auf eine E-Mail,
- drag-and-drop die gespeicherte Datei auf der Delphi-Formular.
Also grundsätzlich habe ich umgesetzt, drag & drop aus dem explorer. Ich brauche eine zusätzliche Schicht, die erlaubt, dass meine Bewerbung an die E-Mail ursprünglich auf OT als eine normale Datei, also kann ich das ziehen von OT, als ob es ein normales windows-explorer-Fenster.
Beachten Sie: ich brauche nicht die Unterstützung der OT-Versionen. Ich kann akzeptieren, nicht für die Unterstützung von Outlook 2003 (zum Beispiel), aber nicht 2010. So im Fall der Technik nicht automatisch für alle OT-Versionen werde ich lieber die eine, die funktioniert mit dem neuesten.
Letzte Anmerkung: Es ist offensichtlich auf jeden Fall bin ich daran interessiert sind nur in Drag & Drop von E-Mails (und nicht Outlook-Kalender-Elemente, zum Beispiel). Eine Idee wäre, ziehen und Ablegen von Anlagen zu. Aber dies könnte eine zusätzliche Verbesserung für die Zukunft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie OLE-Drag&Drop, aber dann müssen Sie in der Lage sein, die Daten zu verarbeiten, die Sie erhalten, da jede Anwendung die Daten in einem eigenen format. Finden Sie einen schönen Delphi-Implementierung von OLE Drag&Drop hier
Outlook Express und Thunderbird sollen den transfer von Daten in RFC2822-format oder ähnliches, Outlook wird wahrscheinlich übertragen Sie die Daten in seine eigenen Nachrichten-format, es shuould dokumentiert wurden als Teil der Microsoft Open Specification Programm
Erste von allen, wenn Sie finden eine fertige Bibliothek, die sich aus der box (wie die vorgeschlagen von ldsandon) zu verwenden, da dies alles von hand ist schmerzhaft und frustrierend. Die Dokumentation ist stellenweise unvollständig und könnte Fehler enthalten: Sie werden am Ende Dinge tun, durch trial and error und Google wird Sie nicht retten, weil nicht viele Leute Tauchen Sie ein in die tiefen der Ole-drag-und-drop, und die meisten von denen, die tun, wird wahrscheinlich verwenden Sie fertige code.
, Wie dies in reinem Pascal
Theoretisch die API, die verwendet wird, um Ihre Anwendung zu verarbeiten OLE Tropfen ist sehr einfach. Alles, was Sie tun müssen, ist eine Umsetzung der
IDropTarget
Schnittstelle, die tut, was Sie brauchen, und rufenRegisterDragDrop
Bereitstellung der Griff für Ihre Anwendung ist, Fenster und des interface.Hier ist, wie meine Implementierung sieht so aus:
Die Umsetzung der
DragEnter
,DragOver
undDragLeave
trivial ist, considerring ich mache das für ein experiment: ich werde nur akzeptieren alles:Die eigentliche Arbeit geschieht in
TDropTargetImp.Drop
.Dieser code nimmt die "Drop", sieht für einige CF_FILECONTENTS, öffnet es sich wie TYMED_ISTORAGE, fällt jedem einzelnen stream in diesem Speicher, um eine Datei in
C:\Temp\<stream_name>.bin
; ich habe versucht, diese mit Delphi 2010 und Outlook 2007, es funktioniert alles richtig: Öffnen Sie die gespeicherten Dateien (viele von Ihnen!) Ich kann alles finden, von der E-Mail-Nachricht, in unerwarteter Weise. Ich bin sicher, es gibt Dokumentation, dass irgendwo genau erklärt, was jede dieser Dateien enthalten soll, aber ich weiß nicht wirklich, zu akzeptieren drag-and-Drop Dateien von Outlook so ich schaue nicht zu weit. Wieder, ldsandon ist link sieht vielversprechend aus.Diese codes sieht ziemlich kurz, aber das ist nicht die Quelle der Schwierigkeiten. Die Dokumentation für diese war wirklich fehlen; ich traf Straßensperren an jeder Ecke, angefangen mit diesem:
Msdn-Dokumentation klar sagt, dass die einzige gültige Wert für das "lindex" - 1: ratet mal, was, -1 funktioniert nicht, 0 nicht!
Dann gibt es diese kurzen code:
besonders die zwei consts:
immer, dass die Kombination war eine Sache von trial-and-error. Ich weiß nicht, wie Versuch und Irrtum: das Ist die optimale Kombination von flags für das, was ich will? Wird, dass die Arbeit auf jeder Plattform? Ich weiß nicht...
Dann gibt es die Angelegenheit von machen Sie Kopf oder Schwanz des tatsächlichen Inhalts empfangen von Outlook. Zum Beispiel den BETREFF der E-Mail gefunden wurde, in diesem stream:
__substg1.0_800A001F
. Der Körper der Nachricht gefunden wurde, die in diesem stream:__substg1.0_1000001F
. Für eine einfache E-Mail-Nachricht, die ich bekam 59-streams von nicht-null-Größe.-1
aber eventuell für ein anderes format. Aus blogs.msdn.com/b/oldnewthing/archive/2008/03/18/8080183.aspx, "der Inhalt Der Datei wird das format der Zwischenablage verwendet der lindex als ein auf null basierender index, der wählt die virtuelle Datei, die der Anrufer spricht. Wenn wir nur eine virtuelle Datei, deren index gleich null ist."