Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DragOver vom Explorer erkennen (https://www.delphipraxis.net/79771-dragover-vom-explorer-erkennen.html)

GuenterS 21. Sep 2007 10:41

Re: DragOver vom Explorer erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Xaromz,

tut mir leid für die sehr späte Rückmeldung.

Leider ist die jetztige neue Version für mich eher ein Rückschritt. Jetzt kann ich auch keine Anhänge aus Thunderbird mehr droppen, die von Outlook (version 2000) gehen nach wie vor nicht.

Ich habe ein Panel als DropControl in der ShellDropper Komponente registriert. Leider kommt nur noch das Drop-Verbotsschild, wenn ich einen Anhang einer Email aus Thunderbird oder Outlook dort droppen möchte.

Wenn ich das DragOver Event implementiere und dort Accept auf true setze kommt er wohl in das Drop-Event, aber FilesW und Files Eigenschaften sind jeweils leer. Auch kein Filetype ist gesetzt.

Das hat zumindest in der vorherigen Version funktioniert.

Ich musste in der Unit allerdings einige Änderungen vornehmen um sie lauffähig zu bekommen. Delphi5 hat leider keine WideStrings Unit und kennt damit auch keine TWideStringList, WideString oder TWideStrings. Ich habe daher die WideStrings Unit entfernt und aus TWideStrings TStrings, aus WideString String und aus TWideStringList TStringList gemacht.

Desweiteren war es notwendigt folgende Konstanten zu definieren, da sie meiner Delphi Version (5) unbekannt waren.

Delphi-Quellcode:
 MK_ALT = 32;
 FILE_ATTRIBUTE_DEVICE = $00000040;
 PathDelim = '\';
Ich denke ich hänge die Unit einfach mal an, vielleicht hat das Verhalten ja auch etwas mit meinen Änderungen zu tun.

xaromz 21. Sep 2007 20:08

Re: DragOver vom Explorer erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

wenn Du einfach jeden WideString durch einen AnsiString ersetzt, dann kann das ja nicht funktionieren; Du musst natürlich die API-Aufrufe auch anpassen. Im Anhang findest Du eine Version, die abhängig vom Compiler die WideStrings einbindet (ab Delphi 7) oder eben nicht. Schau doch mal, ob das hilft.

Gruß
xaromz

GuenterS 21. Sep 2007 22:24

Re: DragOver vom Explorer erkennen
 
Jetzt kann die Komponente mit Attachements aus Outlook umgehen, das funktioniert jetzt, Anhänge aus Thunderbird gehen aber leider nicht in dieser Version.

Diese Version ließ sich auch gut in Delphi5 einbinden.


[Nachtrag]
Ich habe es jetzt auch mit Turbo Delphi probiert, da funktioniert es leider weder aus Thunderbird noch aus Outlook...
[/Nachtrag]

xaromz 22. Sep 2007 11:03

Re: DragOver vom Explorer erkennen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

ich habe jetzt die Komponente nochmals überarbeitet.
Getestet habe ich:
  • Drag aus der Shell (Explorer) -> funktioniert
  • Drag einer URL aus Internet Explorer -> funktioniert
  • Drag einer URL aus Firefox -> funktioniert
  • Drag einer URL aus Opera -> funktioniert nicht
  • Drag einer Mail aus Windows Mail -> funktioniert
  • Drag eines Anhangs aus Windows Mail -> funktioniert
  • Drag einer Mail aus Outlook (2007) -> funktioniert nicht
  • Drag eines Anhangs aus Outlook (2007) -> funktioniert
  • Drag einer Mail aus Thunderbird (2.0.0.6) -> funktioniert nicht
  • Drag eines Anhangs aus Thunderbird (2.0.0.6) -> funktioniert
Im Anhang ist auch ein Demo-Programm inklusive Quelltext.

Gruß
xaromz

GuenterS 24. Sep 2007 11:26

Re: DragOver vom Explorer erkennen
 
Hallo,

das Droppen von Anhängen aus Outlook funktioniert jetzt auch, nur wenn man das gleich mit Thunderbird probiert, gibt es jetzt das Problem, dass zwar das File erstellt wird. Das ist auch gut so, nur leider findet das nach dem Drop-Ereignis statt, so dass man im Drop-Event nicht auf das File zugreifen kann. Dies ist anscheinend aber nur bei Thunderbird Anhängen der Fall .

xaromz 24. Sep 2007 12:21

Re: DragOver vom Explorer erkennen
 
Hallo,
Zitat:

Zitat von GuenterS
Das ist auch gut so, nur leider findet das nach dem Drop-Ereignis statt, so dass man im Drop-Event nicht auf das File zugreifen kann. Dies ist anscheinend aber nur bei Thunderbird Anhängen der Fall .

Setz doch mal einen Breakpoint in der Methode "ProcessFileGroup" und schau, was passiert. In dieser Methode werden nämlich die temporären Dateien erstellt, und zwar unmittelber, bevor das Ereignis "OnDrop" ausgelöst wird.

Gruß
xaromz

GuenterS 24. Sep 2007 16:59

Re: DragOver vom Explorer erkennen
 
Hallo,

das mit dem Breakpoint habe ich gemacht und nun ist auch "klar" warum es bei Thunderbird Anhängen nicht funktioniert. Wenn ich einen Anhang aus Thunderbird droppe, kommt er nämlich gar nicht in die Methode "ProcessFileGroup".

Beim Auslösen des Drop-Events besteht das File, allerdings ist dieses noch offen und leer, und kann deshalb im Drop-Event nicht geöffnet werden. Läßt man das Programm weiterlaufen (wenn man nur den Dateinamen abfragt), kommt er zwar auch nicht in die Methode "ProcessFileGroup" aber die Datei existiert dann (mit Inhalt).

xaromz 24. Sep 2007 17:51

Re: DragOver vom Explorer erkennen
 
Hallo,

ich habe jetzt nochmal Thunderbird installiert, und habe folgende Beobachtung gemacht: Thunderbird verwendet den Standard-Weg für das Droppen von Dateien, verhält sich also so wie die Shell. Deshalb kommt auch kein ProcessFileGroup (der andere Weg). Leider erstellt aber Thunderbird den Inhalt der gedroppted Datei erst, wenn die Drop-Aktion komplett abgeschlossen ist, also, nachdem die Anwendung das Ereignis verarbeitet hat und der Handler in Thunderbird zurückgekehrt ist; das heißt, die Datei wird erst komplett sein, kurz nachdem sie gedroppt wurde. Das ist bei einer Kopieraktion in der Shell unwichtig, aber für die Verarbeitung in einem anderen Programm wirklich dämlich.
Ich fürchte, mit diesem Timing wirst Du selbst zurechtkommen müssen.

Gruß
xaromz

GuenterS 24. Sep 2007 18:41

Re: DragOver vom Explorer erkennen
 
Kann es sein, dass es sich beim Problem mit dem dropen ganzer Emails aus Thunderbird oder Outlook um ein ähnliches Problem handelt?

OldGrumpy 24. Sep 2007 18:59

Re: DragOver vom Explorer erkennen
 
Ich würde dieses Verhalten von Thunderbird mal als Bug in deren Bugtracker einstellen. Parallel dazu könnte man für solche Fälle einen Workerthread starten der 1-2 Sekunden lang in Intervallen versucht, auf die Datei zuzugreifen, bis er entweder in sein Timeout (drag&drop fehlgeschlagen) läuft oder halt Erfolg hat :) Ist natuerlich ne ziemliche Krüppellösung aber funktioniert erstmal.

xaromz 24. Sep 2007 19:00

Re: DragOver vom Explorer erkennen
 
Hallo,
Zitat:

Zitat von GuenterS
Kann es sein, dass es sich beim Problem mit dem dropen ganzer Emails aus Thunderbird oder Outlook um ein ähnliches Problem handelt?

nein, das ist was anderes. Wenn ich nachschaue, ob die Datenstruktur vom Typ "CFSTR_FILECONTENTS" ist, sagt mir Windows: "Ja". Wenn ich dann die Daten abholen will, sagt mir Windows: "Fehler" (ich glaube irgendwas mir falscher Parameter). Noch habe ich keine Ahnung, was da los ist.

Gruß
xaromz

GuenterS 24. Sep 2007 20:19

Re: DragOver vom Explorer erkennen
 
Was mich aber stutzig macht ist, dass es mit früheren Versionen der Shelldropper Komponente funktioniert hat, das mit den Anhängen aus Thunderbird.

OldGrumpy 24. Sep 2007 20:31

Re: DragOver vom Explorer erkennen
 
Thunderbird wird ja auch häufiger mal aktualisiert, vielleicht hat sich da in letzter Zeit was geändert...

GuenterS 24. Sep 2007 20:33

Re: DragOver vom Explorer erkennen
 
Nein, das kann ich so ziemlich ausschließen, das war immer die gleiche Version .... kann es aber gerne morgen nochmal mit einer der älteren Versionen testen um das auszuschließen.

AndyOthers 28. Sep 2007 13:45

Re: DragOver vom Explorer erkennen
 
hallo, auch

das ist mein erster beitrag hier, möchte aber dazu sagen, dass ich diesen topic und die entwicklung der shelldropper-komponente - dazu gleich ein großes lob und n fettes dankeschön - schon seit anfang an mitverfolge.

mir ist dabei auch aufgefallen, dass man in der version 1.2 email-attachments aus dem thunderbird (2.0.0.6) droppen konnte und jetzt in der version 1.6 nichtmehr!?!

bin grad dabei der sache auf den grund zu gehen!? habt jemand vl schon eine idee?

achja: thunderbird blieb der selbe ... nur shelldropper wurde auf den neuesten stand gebracht.

xaromz 28. Sep 2007 14:08

Re: DragOver vom Explorer erkennen
 
Hallo,

ich habe gerade nochmal die Version 1.2 getestet. Auch mit dieser Version tritt das Problem auf, dass das Attachment erst nach dem Droppen wirklich erstellt wird. An den Routinen habe ich auch schon lange nichts wesentliches verändert.

Gruß
xaromz

AndyOthers 28. Sep 2007 15:09

Re: DragOver vom Explorer erkennen
 
hmmm, das ist sehr interessant. ich habe ebenfalls die version 1.2 nochmals ausprobiert und konnte in der drop-ereignis prozedur der shelldropper komponente schon auf die gedroppte datei zugreifen. sobald ich die version 1.6 verwende geht dies an selbiger stelle nicht (siehe obiges problem). ... Komisch

Delphi-Quellcode:
procedure TfrmDokumente.ShellDropper1Drop(Sender: TObject;
  const DropRec: TDropRec);
begin

  ....

end;
also in dieser prozedur kann ich in der v1.2 auf das gedroppte file schon zugreifen, und in der v1.6 nicht!?!

AndyOthers 8. Okt 2007 12:12

Re: DragOver vom Explorer erkennen
 
hallo

ich habe heut nochmal die versionen 1.2 und 1.6 verglichen und habe glaube ich eine spur entdeckt warum das droppen von mail-attachments aus dem thunderbird in der v1.2 funktioniert und in der v1.6 nicht funktioniert:

version 1.2:
  • im dragenter wird fillobjects ausgeführt, temp-datei wird von thunderbird erstellt, ist aber noch leer
  • dann kommt drop
  • dragenter is schon abgeschlossen und temp-datei von tb ist nun richtig erstellt
  • also kann auf diese dann in ondrop zugegriffen werden

version 1.6:
  • fillobject wird erst im drop (auf jeden fall) ausgeführt, temp-datei wird von thunderbird erstellt, ist aber noch leer
  • somit kann im ondrop nicht auf die temp-dateien von tb zugegriffen werden, da ja die dateien erst nach dem droppen erstellt werden

ich habs in meinem fall jetzt mal so gelöst, dass ich fillobjects auf jeden fall mal im dragenter ausführen lasse, um die tempfiles im drop bzw ondrop schon zu verfügung zu haben. hab meine überlegungen schnellschnell (dh änderungen sind noch nicht elegant ausprogrammiert) ausprobiert und so wie es ausschaut kann ich nun mail-attachments aus thunderbird, outlook express und outlook 2000 droppen.

ps: weiters würd ich im drop nach dem ondrop die (temp)files dann schon wieder löschen.

lg And the others ... and se others ... andy others

xaromz 9. Okt 2007 08:35

Re: DragOver vom Explorer erkennen
 
Hallo,

Zitat:

Zitat von AndyOthers
ich habe heut nochmal die versionen 1.2 und 1.6 verglichen und habe glaube ich eine spur entdeckt warum das droppen von mail-attachments aus dem thunderbird in der v1.2 funktioniert und in der v1.6 nicht funktioniert:

leider kann ich Deine Ausführungen nicht ganz nachvollziehen.

Zitat:

Zitat von AndyOthers
version 1.2:
  • im dragenter wird fillobjects ausgeführt, temp-datei wird von thunderbird erstellt, ist aber noch leer
  • dann kommt drop
  • dragenter is schon abgeschlossen und temp-datei von tb ist nun richtig erstellt
  • also kann auf diese dann in ondrop zugegriffen werden

Bei mir wird erst nach dem OnDrop die Datei mit Inhalt gefüllt, obwohl sie in OnDragEnter/OnDrop schon existiert (aber Null Byte groß ist).

Zitat:

Zitat von AndyOthers
version 1.6:
  • fillobject wird erst im drop (auf jeden fall) ausgeführt, temp-datei wird von thunderbird erstellt, ist aber noch leer
  • somit kann im ondrop nicht auf die temp-dateien von tb zugegriffen werden, da ja die dateien erst nach dem droppen erstellt werden

Die Methode FillObjects wird in DragEnter immer ausgeführt. Da Thunderbird keine FileGroup verwendet, werden auch die Dateien exakt so wie in der Methode Drop eingelesen.
Das Problem ist ja, dass Thunderbird den Inhalt der Datei erst schreibt, nachdem die Drop-Nachricht abgearbeitet wurde (lässt sich schön mit einem Breakpoint am Ende von "Drop" zeigen).

Zitat:

Zitat von AndyOthers
ps: weiters würd ich im drop nach dem ondrop die (temp)files dann schon wieder löschen.

Das die temporäre Datei von Thunderbird erstellt wird, muss sie auch von Thunderbird wieder gelöscht werden. Es gibt keine Möglichkeit, festzustellen, ob die gedroppte Datei temporär ist.
Wenn die Dateien per FileGroup übergeben wurden, dann haben sie auch das Flag ftTemporary und werden, sofern das Flag gesetzt bleibt, auch wieder gelöscht.

Gruß
xaromz

AndyOthers 15. Okt 2007 14:58

Re: DragOver vom Explorer erkennen
 
hallo

... ich hab schon befürchtet, dass ich mich ein wenig undeutlich ausgedrückt habe :mrgreen: .

löschen der temporären dateien:
war anscheinend mein fehler, hab nicht gesehen wo diese als ftTemporary gekennzeichneten Files wieder gelöscht werden. sorry :wink:

weiter zu FillObjects:

Zitat:

Die Methode FillObjects wird in DragEnter immer ausgeführt.
hier muss ich aber widersprechen :gruebel: . wie man im nachfolgenden code auszug sieht, wird fillobjects nur ausgeführt, wenn man in seiner shelldropper komponente OnDragEnter verwendet. arbeitet man zB nur mit OnDrop wird hier FillObjects nicht ausgeführt!

Delphi-Quellcode:
if FAccepted then
  begin
    if Assigned(FOnDragEnter) then
    begin
      FillObjects(dataObj, dsEnter);
      PrepareRec(pt, grfKeyState);
      FOnDragEnter(FControl, FDropRec, FAccepted);
    end;
  end;
Zitat:

Das Problem ist ja, dass Thunderbird den Inhalt der Datei erst schreibt, nachdem die Drop-Nachricht abgearbeitet wurde (lässt sich schön mit einem Breakpoint am Ende von "Drop" zeigen).
RICHTIG. und genau deswegen lasse ich fillobjects AUF JEDEN FALL im DragEnter ausführen damit Thunderbird die Datei vorm Drop noch befüllen kann. und wie gesagt, jetzt funzts mit Thunderbird, OutlookExpress und Outlook 2000.

im DragEnter:
Delphi-Quellcode:
...
  if FAccepted then
  begin
     FillObjects(dataObj, dsEnter);
    if Assigned(FOnDragEnter) then
    begin
      //FillObjects(dataObj, dsEnter);
      PrepareRec(pt, grfKeyState);
      FOnDragEnter(FControl, FDropRec, FAccepted);
    end;
  end;
...
im Drop:
Delphi-Quellcode:
...
  FDropped := True;
  if FAccepted then
  begin
    if Assigned(FOnDrop) then
    begin
      if FIsFileGroup then
        FillObjects(dataObj, dsDrop);
      PrepareRec(pt, grfKeyState);
      FOnDrop(FControl, FDropRec);
    end;
    dwEffect := GetCursor;
  end else
    dwEffect := DROPEFFECT_NONE;
...
hoffe ich konnte mich dieses mal verständlich machen :)

xaromz 15. Okt 2007 16:40

Re: DragOver vom Explorer erkennen
 
Hallo,
Zitat:

Zitat von AndyOthers
hoffe ich konnte mich dieses mal verständlich machen :)

konntest Du. Jetzt weiß ich auch, was Du meinst. Ich werde mal sehen, ob ich das Befüllen des Records an eine bessere Position verschieben kann.

Gruß
xaromz

Hobbycoder 13. Mär 2017 11:30

AW: DragOver vom Explorer erkennen
 
Bin grade über diese nette, kleine Komponente gestoßen, weil ich genau diese Feature grad in einer Anwendung realisieren möchte.

Meine Frage dazu, läßt sich irgendwie feststellen, an welcher Position auf dem Zielcontrol sich der Cursor befindet wenn das Drop-Ereignis ausgelöst wird?

Ich will Dateien aus dem Explorer auf ein Grid ziehen, und je nach Spalte und Zeile, auf der losgelassen wird, eine andere Procedure ausführen.

Hobbycoder 13. Mär 2017 11:44

AW: DragOver vom Explorer erkennen
 
Hat sich erledigt. Mit Mouse.Cursorpos und ScreenToClient lässt sich das passend errechnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 Uhr.
Seite 2 von 2     12   

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