DragDrop auf den Desktop - Datei erst nach dem Loslassen auf dem Desktop von meiner Anwendung erstellen

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    DragDrop auf den Desktop - Datei erst nach dem Loslassen auf dem Desktop von meiner Anwendung erstellen

    *Topic ausgelagert aus DragDrop auf den Desktop (Zusatzfrage = neue Frage!)

    Entschuldigt, dass ich auf diesen alten Thread nochmals antworte. Ich habe dazu eine Zusatzfrage.

    Ich habe eine Anwendung wo ich ein Listview mit Elementen habe. Nun ziehe ich per Drag and Drop Elemente auf den Desktop.
    Das funktioniert einwandfrei, wenn die zu exportierende Datei bereits vorhanden ist.

    Nun ist es aber so, dass ich die Datei erst nach dem Loslassen auf dem Desktop von meiner Anwendung erstellen muss. Das dauert zwischen einer Sekunde und mehreren Minuten. Wie gehe ich das an?
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    dive26 schrieb:

    Wie gehe ich das an?
    Probier mal, zunächst eine leere Hülse mit diesem Namen zu erstellen, den richtigen Inhalt gibst Du ihr danach asynchron.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Probier mal, zunächst eine leere Hülse mit diesem Namen zu erstellen, den richtigen Inhalt gibst Du ihr danach asynchron.

    Ich habe leider keine Ahnung wie ich das angehen soll.

    Macht nicht die Zeile ListView_Documents.DoDragDrop(edata, DragDropEffects.Copy) den Kopiervorgang?

    Dieser Code funktioniert ja, aber zum Zeitpunkt von ListView_Documents.DoDragDrop(edata, DragDropEffects.Copy) existiert die Datei noch nicht. Die wird erst beim Fallenlassen erstellt.

    VB.NET-Quellcode

    1. Private Sub ListView_Documents_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles ListView_Documents.ItemDrag
    2. GlobalDragoutFilename = "C:\RM2 Template Helper\rm2th_manual.pdf" ' eine Testdatei
    3. Dim edata As New DataObject
    4. Dim fi() As String = {GlobalDragoutFilename}
    5. edata.SetData(DataFormats.FileDrop, fi)
    6. ListView_Documents.DoDragDrop(edata, DragDropEffects.Copy)
    7. End Sub

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    Ich habe das hier gefunden. Aber leider übersteigt das meinen Programmiertechnischen Horizont:
    dlaa.me/blog/post/9913083
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch
    Ich glaube, ich verstehe jetzt Dein Problem.

    dive26 schrieb:

    Macht nicht die Zeile ListView_Documents.DoDragDrop(edata, DragDropEffects.Copy) den Kopiervorgang?
    DoDragDrop startet den D&D-Prozess von Deinem Control aus.
    Du gibst dabei alle nötigen Informationen als Argument mit und sagst dem Empfänger, was er damit tun soll.
    Beim Loslassen fängt der Empfänger an zu arbeiten.
    Bei mir funktioniert dies:

    VB.NET-Quellcode

    1. Private Sub ListView1_ItemDrag(sender As Object, e As EventArgs) Handles ListView1.ItemDrag
    2. Dim file = "D:\Temp\Manual.pdf" ' eine Testdatei, 960 MB
    3. Dim edata As New DataObject
    4. Dim fi() As String = {file}
    5. edata.SetData(DataFormats.FileDrop, fi)
    6. Me.DoDragDrop(edata, DragDropEffects.Copy)
    7. End Sub
    Beim Loslassen kommt diesere Copy-Dialog:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Beim Loslassen fängt der Empfänger an zu arbeiten.
    Bei mir funktioniert dies:


    Ja, das funktioniert bei mir ja auch.


    Versuche einmal das Problem zu lösen (als Beispiel nehme ich Dein Beispiel):

    1. Die Datei "D:\Temp\Manual.pdf" existiert noch nicht
    2. Erst wenn wirklich feststeht, dass man das Element auf dem Desktop (oder wo anders) fallen hat lassen, dann erstellst Du das PDF-Dokument erst.

    Und genau bei Punkt 2 hapert es. Denn die Me.DoDragDop sorgt nicht nur für den Drag/Drop Effekt und definiert das "Ziel", sondern kopiert sofort nach dem Loslassen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch

    dive26 schrieb:

    Die Datei "D:\Temp\Manual.pdf" existiert noch nicht
    Ist das die Quelldatei?
    Die muss natürlich existieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ist das die Quelldatei?
    Die muss natürlich existieren.


    Ja leider, und das ist das Problem an der Sache. Die PDF-Datei existiert noch nicht, sondern sollte on-the-fly erstellt werden, sobald man ein Element per Drag & Drop rauszieht.

    Hintergrund (siehe Screenshots):
    Es ist eine Liste an Dokumenten (können auch mehrere Tausend sein), welche aus Hintergrund (Template) + Handschriften oder aus PDF-Dateien + Handschriften + Markierungen bestehen.
    Je nach Dateigröße dauert es mehrere Sekunden bis der Export als PDF abgeschlossen ist. Alle Dokumente schon vorher zu erstellen ist keine Lösung, da sich die Dokumente jederzeit ändern können (werden dann automatisch aus der Cloud synchronisiert).

    Ich habe überbrückend mal einfach ein Kontextmenü eingerichtet, mit dem man das PDF auf den Desktop exportieren kann.

    Natürlich wäre es praktische, wenn ich das Dokument direkt in den Windows-Explorer oder sogar in eine andere Anwendung (z.B. neue Email) reinziehen könnte.

    Aber vielleich fällt Euch Profis ja noch etwas dazu ein ;-).

    LG Roland
    Bilder
    • 21122021192736.jpg

      277,15 kB, 1.316×793, 30 mal angesehen
    • 21122021192944.jpg

      62,78 kB, 438×349, 40 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch
    @dive26 Wenn Du weißt, was da zusammengerührt werden muss, kannst Du das doch mit async-await machen.
    Das Problem wäre dann, das beim Loslassen der D&D-Prozess beendet wird.
    Muss es D&D sein?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Muss es D&D sein?

    Ich besteh nicht drauf, aber anders kann man es ja nicht in (z.B.) eine offene Outlook-Email ziehen oder in einen Wunschordner. Mir würde auch keine andere (praktische) Methode einfallen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch
    Wie wäre es die Datei in die Zwischenablage (Export to Clipboard) zu kopieren? Dann kann man die mit Strg + V auch in eine EMail einfügen …
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo
    Wie wäre es die Datei in die Zwischenablage (Export to Clipboard) zu kopieren? Dann kann man die mit Strg + V auch in eine EMail einfügen …


    Ja, das wäre auch eine Möglichkeit. Aber nicht viel komfortabler als die Datei gleich am Desktop abzulegen.
    Das Wunschziel ist immer noch Drag & Drop ;-).
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch
    @dive26 Was ganz genau soll denn passieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Was ganz genau soll denn passieren?

    Das habe ich oben schon mehrmals ausgeführt.

    Sobald feststeht, dass ein Drag&Drop aus der Anwendung heraus erfolgt, soll die PDF-Datei generiert werden (das kann mehr oder weniger lang dauern) und dann der Drop durchgeführt werden. Zum Zeitpunkt des "Ziehens" gibt es das PDF noch nicht.

    Da aber leider die Zeile Me.DoDragDrop(edata, DragDropEffects.Copy) das Drag & Drop durchführt und bereits eine fix fertige Dateiliste erwartet, gehts nicht. Diese Zeile führt nämlich das Drop durch, sobald man die Maustaste loslässt.

    Ich bräuchte eine Funktion die beim Ziehen und Loslassen noch nichts machen muss, mir Info gibt "jetzt wurde losgelassen" und ich dann die PDF erstellen kann und sagen "jetzt gib frei".
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch

    dive26 schrieb:

    Das habe ich oben schon mehrmals ausgeführt.
    So was: :?:
    Die Datei, die per D&D gezogen werden soll, ist lediglich ein String mit dem Inhalt einer nicht existierenden Datei.
    Ich will das D&D unterlaufen, indem ich die Datei erst nach dem Droppen bereitstelle.
    Ich will das System unterlaufen, weil es mit dem Kopieren so lange warten soll, bis ich die Datei bereitgestellt habe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    So was:

    Die Datei, die per D&D gezogen werden soll, ist lediglich ein String mit dem Inhalt einer nicht existierenden Datei.
    Ich will das D&D unterlaufen, indem ich die Datei erst nach dem Droppen bereitstelle.
    Ich will das System unterlaufen, weil es mit dem Kopieren so lange warten soll, bis ich die Datei bereitgestellt habe.


    Ja, genau.
    Wenn Du es nicht weißt ob oder wie es geht, dann ist es doch ok.
    Niemand ist allwissend.
    Aber Deine letzte Antwort ist wirklich nicht zielführend.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch

    dive26 schrieb:

    Aber Deine letzte Antwort ist wirklich nicht zielführend.
    Deine Problembeschreibung ist nicht zielführend.
    Du willst D&D "vergewaltigen" zu einem Zeitpumnkt, an dem die andere Applikation die Kontrolle übernommen hat.
    Das geht nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das geht nicht.

    Das ist eine zielführende Antwort ;-).

    Dann weis ich aber nicht was hier beschrieben wird: dlaa.me/blog/post/9913083.
    Da ist doch das "vergewaltigen" oder umgehen von D&D gemeint?
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch
    @dive26 Vielleicht ein einfacherer und zielführender Vorschlag:
    Du machst nicht D&D auf den Desktop, sondern Du machst D&D auf ein eigenes Fenster am besten dieses Programms und kopierst dann die Datei selbst auf den Desktop.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    ielleicht ein einfacherer und zielführender Vorschlag:
    Du machst nicht D&D auf den Desktop, sondern Du machst D&D auf ein eigenes Fenster am besten dieses Programms und kopierst dann die Datei selbst auf den Desktop.


    Leider nicht zielführend genug. Auf den Desktop kopieren kann ich ja schon mit dem Kontextmenü.
    Und auf die eigene Anwendung zu ziehen widerspricht jeder üblichen "Aktion" die User so gewohnt sind.

    Aber lediglich auf den Desktop kopieren löst nicht mein ursprüngliches Problem bzw. erfüllt nicht meinen ursprünglichen Wunsch ;)
    Der wäre: dass man ein Dokument direkt in eine andere Anwendung ziehen kann (z.B. in eine neue Outlook-Email).
    Das sind User gewohnt und so sollte es im Optimalfall auch funktionieren.
    Bilder
    • 22122021160839.jpg

      58,2 kB, 339×453, 19 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch