AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Drag&Drop aus neuem Outlook

Ein Thema von stalkingwolf · begonnen am 17. Mär 2025 · letzter Beitrag vom 25. Mär 2025
Antwort Antwort
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Drag&Drop aus neuem Outlook

  Alt 21. Mär 2025, 11:46
Damit kriege ich weder aus Outlook (classic) 365 noch Outlook 2016 irgendwas (weder Mails noch Anhänge). Dateien aus dem Explorer nimmt er. Ich habe keinen Filter drin, denn Outlook (classic) 365 liefert immer noch MSG. Mein bisheriges Outlook-Drag-and-Drop aus der Melander-Suite geht aber mit Outlook (classic) 365 nicht.

Wo ist eigentlich die vollständige Dokumentation von Jedi? Ich arbeite gerade das erste Mal damit.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#2

AW: Drag&Drop aus neuem Outlook

  Alt 21. Mär 2025, 12:30
Doku?
Das ist doch selbsterklärend.



Explorer nutzt CF_FILENAMES (je ANSI und Unicode) mit optionalem CF_FILEDESCRIPTOR
Thunderbird CF_HDROP mit STGMEDIUM-Record, wo eine Liste zu TempFiles drin ist
Outlook nutzt CF_HDROP mit IStream
und das neue Outlook nutzt CF_HDROP mit IDataObjectAsyncCapability (bzw. eigentich IAsyncOperation)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Mär 2025 um 12:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.677 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Drag&Drop aus neuem Outlook

  Alt 21. Mär 2025, 14:50
Wo ist eigentlich die vollständige Dokumentation von Jedi?
LOL

Die gab es noch nie, auch damals nicht, als das Projekt noch deutlich mehr aktive Mitglieder hatte. Du kannst bei Delphi-Bibliotheken inzwischen schon froh sein, dass es noch Updates gibt, über Doku denkt keiner mehr nach.

Der ursprüngliche Ansatz liegt hier:

https://wiki.delphi-jedi.org

Allerdings würde es mich nicht wunder, wenn dort keiner mehr die Zugangsdaten hätte.

Wie immer bei Open Source Projekten: Wer Doku schreiben möchte, darf sich gerne anbieten.
Thomas Mueller

Geändert von dummzeuch (21. Mär 2025 um 16:48 Uhr)
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Drag&Drop aus neuem Outlook

  Alt 21. Mär 2025, 15:14
So, ich habe ein paar Minuten zeit gehabt und die Drag-and-Drop-Component-Suite etwas angeschaut. Eigentlich könnte die alles. Es ist nur nicht alles zusammengebaut.

Zuerst muss die Klasse TOutlookDataFormat um das Clipboard-Format TFileClipboardFormat erweitert werden und die Dateinamen, die per async. HDROP rein kommen, in einer Files-Stringliste abgelegt werden. Das macht die folgende DataFormat-Klasse.
Man könnte das auch direkt in TOutlookDataFormat einbauen, aber so geht das auch, ohne Änderungen am Originalcode.
Delphi-Quellcode:
type
  TNewAndClassicOutlookDataFormat = class(TOutlookDataFormat)
  private
    FFiles: TUnicodeStrings;
  protected
    class procedure RegisterCompatibleFormats; override;
  public
    constructor Create(AOwner: TDragDropComponent); override;
    destructor Destroy; override;
    function Assign(Source: TClipboardFormat): Boolean; override;
    function AssignTo(Dest: TClipboardFormat): Boolean; override;
    procedure Clear; override;

    property Files: TUnicodeStrings read FFiles;
  end;

{ TNewAndClassicOutlookDataFormat }

class procedure TNewAndClassicOutlookDataFormat.RegisterCompatibleFormats;
begin
  inherited RegisterCompatibleFormats;
  RegisterDataConversion(TFileClipboardFormat, 1); // New Outlook (WebApp)
end;

function TNewAndClassicOutlookDataFormat.Assign(Source: TClipboardFormat): Boolean;
begin
  if Source is TFileClipboardFormat then
  begin
    FFiles.Assign(TFileClipboardFormat(Source).Files);
    Result := True;
  end
  else
    Result := inherited Assign(Source);
end;

function TNewAndClassicOutlookDataFormat.AssignTo(Dest: TClipboardFormat): Boolean;
begin
  if Dest is TFileClipboardFormat then
  begin
    TFileClipboardFormat(Dest).Files.Assign(FFiles);
    Result := True;
  end
  else
    Result := inherited AssignTo(Dest);
end;

constructor TNewAndClassicOutlookDataFormat.Create(AOwner: TDragDropComponent);
begin
  inherited Create(AOwner);
  FFiles := TUnicodeStringList.Create;
end;

destructor TNewAndClassicOutlookDataFormat.Destroy;
begin
  FFiles.Free;
  inherited Destroy;
end;

procedure TNewAndClassicOutlookDataFormat.Clear;
begin
  FFiles.Clear;
  inherited Clear;
end;
Dann muss man diese Klasse registrieren:
Delphi-Quellcode:
initialization
  TNewAndClassicOutlookDataFormat.RegisterDataFormat;
Dann muss man an der TDropEmptyTarget Komponente die Eigenschaft "AllowAsyncTransfer" auf True stellen und beim DataFormatAdapter die "DataFormatClass"-Eigenschaft auf "TNewAndClassicOutlookDataFormat" setzen.
Delphi-Quellcode:
DropEmptyTarget1.AllowAsyncTransfer := True; // Required for the "New Outlook" to receive EML filenames
DataFormatAdapterOutlook.DataFormatClass := TNewAndClassicOutlookDataFormat;
DataFormatAdapterOutlook.Enabled := True; // Setting DataFormClass disables the DataFormat
Jetzt kann man im OnDrop-Ereignis die Dateinamen empfangen:
Delphi-Quellcode:
OutlookDataFormat := DataFormatAdapterOutlook.DataFormat as TNewAndClassicOutlookDataFormat;
if OutlookDataFormat.Files.Count > 0 then // "New Outlook"
begin
  // Handle *.eml files
  for I := 0 to OutlookDataFormat.Files.Count - 1 do
  begin
    if SameText('.eml', ExtractFileExt(OutlookDataFormat.Files[I])) then
    begin
      Eml := TIdMessage.Create(nil);
      try
        Eml.LoadFromFile(OutlookDataFormat.Files[I]);
        // ...
      finally
        Eml.Free;
      end;
    end;
  end;
end
else
begin
  // Handle "Classic Outlook" *.msg files
  OutlookDataFormat.Messages.LockSession;
  for I := 0 to OutlookDataFormat.Messages.Count - 1 do
    // ...
end;
Um das "Bestätigen des Downloads" im New Outlook kommt man aber nicht herum, da es sich technisch dort um einen Download handelt. Und EML-Dateien "gefährlich" sind.
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
549 Beiträge
 
#5

AW: Drag&Drop aus neuem Outlook

  Alt 24. Mär 2025, 15:33
Hallo zusammen,

vielen dank für die Infos und den Link+Beispiel von Jedi werde ich mir die Tage einmal anschauen.

Classic Outlook funktioniert bei uns einwandfrei. Gesamte Email oder einzelne Datei.
Nun wechseln die Leute aber reihenweise ( teils gezwungen ) auf das neue Outlook und dann jammern sie herum.
Weg über Desktop geht, weil wir auch vollen EML Support haben, aber direkt ist halt nicht.

Das es wohl wegen der Bestätigung dazu komme habe ich mir schon gedacht. Das ist natürlich für den Anwender ätzend.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Drag&Drop aus neuem Outlook

  Alt 24. Mär 2025, 17:43
Erstmal Danke Andreas. Das Problem war aber ein ganz anderes, denn wir kriegen auch bei Outlook (classic) 365 weiterhin Messages und keine Files: Ich lade beim Erhalt von Messages MAPI32. Das scheitert mit "unbekannter Fehler". Wir haben mit Outlook 365 auf Office x64 gewechselt. Und ich brauche irgendwie MAPI, um die Message-Streams zu speichern, oder? Ohne gestartetes MAPI meldet Outlook (classic) nämlich einen Netzwerk- oder Verbindungsfehler (Danke für nichts!) und mein Programm nimmt keine DnD-Aktionen mehr an ("No"-Mauszeiger). Beim Beenden meldet mein Programm eine Zugriffsverletzung und nicht freigegebene Objekte.

Outlook (classic) x86 installiert. Funktioniert wie eh und je. Beim Ablegen von Anhängen, die keine Nachrichten sind, passiert auch bei Outlook (classic) x86 weiterhin absolut gar nichts, da ich weder ein Outlook- noch ein FileDataFormat kriege. TOutlookDataFormat zu benutzen erfordert wegen MAPI wohl dieselbe Bittigkeit bei Outlook. (Mit einer Ausnahme, die aber für uns irrelevant ist.)

Outlook (new) funktioniert hingegen unabhängig von der Bittigkeit. Ich könnte mir vorstellen, dass das der Grund gewesen ist, warum man bei Outlook (new) von MAPI auf asynchrone Dateien wechselt. Dafür braucht man übrigens deine Klasse nicht. Man kann einfach das Standard-FileDataFormat benutzen und AllowAsyncTransfer im EmptyDropTarget anmachen. (Auf AllowAsyncTransfer wäre ich aber ohne Andreas' Post nie gekommen.) Dann kriegt man aus Outlook (new) sowohl Nachrichten als auch - und das ist neu! - Nicht-Nachrichten-Anhänge.
Das Standard-FileDataFormat war bei mir nämlich zusätzlich drin und zusammen mit deiner Klasse haben dann beide für dieselbe Datei (inkl. Mail) getriggert.

Jetzt fragt sich noch, wie das bei beiden Outlooks jeweils mit OLE ist.
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer (24. Mär 2025 um 17:47 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Drag&Drop aus neuem Outlook

  Alt 25. Mär 2025, 16:02
Nachtrag dann noch: OLE funktioniert mit Outlook (classic) unabhängig von der Bittigkeit und mit Outlook (new) überhaupt nicht.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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