Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Outlook-Emails per Drag und Drop auf App ziehen... (https://www.delphipraxis.net/115753-outlook-emails-per-drag-und-drop-auf-app-ziehen.html)

Darkmorph 17. Jun 2008 13:46


Outlook-Emails per Drag und Drop auf App ziehen...
 
Hi Leute,

bin am verzweifeln. Suche eine Möglichkeit Emails aus Outlook, per Drag und Drop, in meine Anwendung zu schiessen. Wie man Emails per Oleautomatation oder ExMapi einliesst, weiß ich, aber ich möchte ein Feature bauen, das den Anwender spezifische Emails aus Outlook in mein Programm ziehen laesst. Es würde mir ja reichen, wenn ich nur die EntryId's bekommen würde. Darüber könnte ich auch auf die Messages zugreifen.
Im Zweifelsfall, würde es mir schon reichen, zu wissen, das ein Drag Drop von Outlook aus initiiert wurde, dann nämlich würde ich über ActiveExplorer einfach die aktuelle Selektion in Outlook abarbeiten.

Währe echt cool, wenn ich hilfreichen Input von euch kriegen könnte.
In diesem Sinne, noch einen schönen Tag.

Gruß
Benjamin

Tyrolean 17. Jun 2008 16:51

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
Hallo!

Das mache ich mit dem Dropmaster von Raize (http://www.raize.com/DevTools/DropMaster/Default.asp).
Geht ganz gut.

Gruß aus den Bergen
Günter

Darkmorph 18. Jun 2008 09:24

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
Vielen Dank für deine Antwort, aber ich dachte eher an ein paar Zeilen Code, den ich bei mir integrieren kann, nicht an eine ComponentSuite, welche ich auch noch bezahlen soll :)

Ich werde mal weiter forschen, bin guter Dinge :)
Inputs sind trotzdem immer noch mehr als Willkommen...

Union 18. Jun 2008 09:56

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
Such mal hier im Forum nach Hier im Forum suchenShellDropper. Damit konnte ich jedenfalls mit 10 Zeilen Code wenigstens Anlagen aus Oulook in meine Anwendung plumpsen lassen.

axellang 18. Jun 2008 12:39

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
Hallo Darkmorph,

das mit Outlook ist so ne Sache. Mit Drag and Drop alleine geht das nicht. Um Nachrichten per D&D aus Outlook zu ziehen brauchst Du ein wenig MAPI usw..

Lade Dir die Drag & Drop Component Suite für Delphi von MelanderBlog herunter, übrigens kostenlos mit Source, und sehe Dir
die Outlook Demo an. In dieser Demo wird genau das gemacht was du willst bzw. benötigst.

Gruß

Axel

Darkmorph 18. Jun 2008 12:45

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
Ich benutze nun das IDROPINTERFACE, um ein InterApp-DROP-Event zu erhalten. Daraufhin prüfe ich, per ActiveExplorer.Selection, ob in Outlook Nachrichten selektiert sind und übertrage diese per Ole Automatation. Das funzt auch alles Super, nur wie gehe ich auf Nummer sicher, das der Drop SENDER Outlook ist? Ich bekomme beim Drop-Event, wenn ich Clipboard-Format CF_TEXT einstelle, nur ein Ergebnis wie das folgt:
Zitat:

Von Betreff Erhalten Größe
Campusspeicher Team Campusspeicher - Neuigkeiten Sa 14.06 14 KB
Zattoo Support Deutschland User Support Sa 14.06 11 KB
Ich könnte jetzt einfach auf die Schlagworte "Vov", "Betreff", "Erhalten" und "Größe" prüfen, aber das scheint mir doch zu laienhaft in Bezug auf Mehrsprachigkeit von Outlook, Versionsabhängigkeit usw.

Delphi-Quellcode:
function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Integer;
  pt: TPoint; var dwEffect: Integer): HResult;
var
  aFmtEtc: TFORMATETC;
  aStgMed: TSTGMEDIUM;
  pData: PChar;
begin
  {Make certain the data rendering is available}
  if (dataObj = nil) then
    raise Exception.Create('IDataObject-Pointer is not valid!');
  with aFmtEtc do
  begin
    cfFormat := CF_TEXT;
    ptd := nil;
    dwAspect := DVASPECT_CONTENT;
    lindex := -1;
    tymed := TYMED_HGLOBAL;
  end;
  {Get the data}
  OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
  try
    {Lock the global memory handle to get a pointer to the data}
    pData := GlobalLock(aStgMed.hGlobal);
    { Replace Text }
    Memo1.Text := pData;
  finally
    {Finished with the pointer}
    GlobalUnlock(aStgMed.hGlobal);
    {Free the memory}
    ReleaseStgMedium(aStgMed);
  end;
  Result := S_OK;
end;
Dieser Code empfängt verarbeitet das Dropen, es handelt sich dabei um kopierten COde ausm Netz, wo kann oder muß ich in dem COde ansetzen, um die Source-Applikation sicher zu ermitteln?

Vielen Dank für die bisherige Hilfe und das was da noch kommen mag :)

Gruß
Benjamin

Darkmorph 18. Jun 2008 12:49

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
@axellang
hab ich schon getan, der Code war mir zu kryptisch und Umfangreich. Mit meiner Methode hab ich die gleiche und mehr Funktionalität mit einem Bruchteil des Codes.
Der einzigste Vorteil bisher, solange ich keine alternative hab, wäre, das ich mit der Suit prüfen kann, ob es sich um Outlook-Messages handelt bei dem Drop. Aber dafür installiere ich keine Komplette Komponentenpalette.
Nichts desto Trotz, vielen Dank.

Darkmorph 18. Jun 2008 13:41

Re: Outlook-Emails per Drag und Drop auf App ziehen...
 
So, hab mir nochmal Gedanken gemacht und prüfe nun wie folgt. Das dürfte ziemlich sicher sein, falls jemand eine API-Funktion hat, die das sicherer macht, immer her damit. Nun aber zu meinem Ergebnis:

Delphi-Quellcode:
    //erst prüfen, ob etwas in Outlook markiert ist
    if(Selection.Count>0) then
      //einfacher Test, ich weiss das Outlook eine Headerzeile + 1 Zeile pro Email ausgibt
      if(Selection.count=(WordCount5A(pData,#13)-1)) then
        //ist die Betreffzeile der ersten Email in pData vorhanden?
        if(pos(Selection.Item[1].Subject,pData)>0) then
          Memo1.Text := IntToStr(WordCount5A(pData,#13)-1)+' Emails';
Selection ist eine Olevariant-Variable, welche das folgende Ergebnis hält: Outlook.Application.ActiveExplorer.Selection.
WordCount5A ist eine Methode, die die Anzahl von Vorkommnissen eines Chars in einem String ermittelt.
pData enthält die DropData als Text.

Wenn man noch sicherer gehen will, könnte man testen, ob von allen markierten Emails der Betreff in pData vorhanden ist, das würde aber den Rahmen sprengen, finde ich, und deshalb belasse ich es so, bis mir was besseres daherkommt.

Gruß und Dank
Benjamin


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.

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