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.

    @dive26 Wohere kommt der Dateiname, woher kommen die Daten, die da zusammengestellt werden?
    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
    Wohere kommt der Dateiname, woher kommen die Daten, die da zusammengestellt werden?


    Der Dateiname ist anfangs fiktiv und das (erst zu erstellende) PDF.
    Die Daten kommen entweder aus eine Cloud oder aus einem Datenordner mit mehreren Daten.

    Das bedeutet, die Datei selbst ist erst verfügbar wenn diese NACH dem Drop "erstellt" wird.
    Diese vorher auf Verdacht zu erstellen geht nicht, da dies bei der Anzahl der Dateien zu viel Rechenaufwand bedeutet, der unötig ist, wenn man nie ein PDF rauszieht.

    Wenn ich (wie oben gepostet) das Kontextmenü "Export as PDF to the desktop" anwähle, dann wird das PDF erstellt und auf den Desktop abgelegt.
    Vorher existiert gar kein PDF, denn das Dokument besteht aus verschiedenen Stroke-Informationen, aus SVG-Dateien und aus PNG Hintergründen und noch dazu aus 1-unendlich Seiten.

    Aber wie gesagt habe ich die Anforderungen bzw. den Ablauf oben schon einige Male geschrieben ;)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Hast Du das hier aus Deinem Link mal ausprobiert?
    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!
    Bis jetzt noch nicht. Da es C Code ist, habe ich es (noch) vermieden und gehofft hier hat schon jemand eine fertig "übersetzte" Lösung.
    Werde ich mir aber zu den Feiertagen ansehen.

    (sorry, mit "C Code" meine ich alles was C im Namen hat, egal ob es C#, C++ oder C ist - ist für mich alles gleich - also Bahnhof ;-)).

    Liebe Grüße
    Roland Berghöfer

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

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

    dive26 schrieb:

    Da es C Code ist
    Wie kommst Du da drauf?

    C# - WPF.
    Geh doch ins Marktplatz-Forum und lass Dir das nach VB.NET-WinForm übersetzen.
    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!
    Kurze Zwischenfrage. Der Drop ist ja zumindest in seiner Ausführung (leider ohne Zieldaten) erfassbar, indem das DnDQuellControl-QueryContinueDrag ausgewertet wird. Ein Beispiel:

    VB.NET-Quellcode

    1. Friend Class FrmMain
    2. Dim StartDragging As Boolean = False
    3. Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs) Handles Label1.MouseDown
    4. StartDragging = True
    5. End Sub
    6. Private Sub Label1_MouseMove(sender As Object, e As MouseEventArgs) Handles Label1.MouseMove
    7. If Not StartDragging Then Return
    8. StartDragging = False
    9. Dim fileList As New Collections.Specialized.StringCollection
    10. fileList.Add("D:\2.txt") 'nicht-existente Datei
    11. Dim dataObj As New DataObject
    12. dataObj.SetFileDropList(fileList)
    13. Label1.DoDragDrop(dataObj, DragDropEffects.Copy)
    14. End Sub
    15. Private Async Sub Label1_QueryContinueDrag(sender As Object, e As QueryContinueDragEventArgs) Handles Label1.QueryContinueDrag
    16. If e.Action = DragAction.Drop Then
    17. Await Threading.Tasks.Task.Delay(1)
    18. MessageBox.Show("Da wurde was fallen gelassen.") 'oder hier andere Aktion durchführen
    19. End If
    20. End Sub
    21. End Class

    Ist das lösungsrelevant?

    Ja, leider nur mit Delay-Workaround.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ich wollte hier gerade die Lösung reinposten und habe gesehen, dass Du die selbe Idee hattest.
    Ja, genau mit dem QueryContinueDrag habe ich es auch umgesetzt.
    Habe den Hinweis zufällig im Netz gefunden und ausprobiert. Tut genau das was ich wollte.

    Hier mein Code, wo aber viel "Gedöns" dabei ist, welches aber nur für meine Anwendung spezifisch ist.
    Ich musste auch diverse Sicherungen einbauen, damit man das Drag & Drop nicht wieder auf sich selbst anwendet.
    Die Anwendung soll ja als Quelle und als Ziel für Drag & Drop dienen, aber nicht für eigene Dateien ;-).

    VB.NET-Quellcode

    1. Public edata As DataObject = Nothing
    2. Public PDFWirdbereitsExportiert As Boolean
    3. Public DragVorgangGestartet As Boolean
    4. ''' <summary>
    5. ''' Drag-out aus einer Listview
    6. ''' </summary>
    7. ''' <param name="sender"></param>
    8. ''' <param name="e"></param>
    9. Private Sub ListView_Documents_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles ListView_Documents.ItemDrag
    10. DragVorgangGestartet = True
    11. PDFWirdbereitsExportiert = False
    12. GlobalDragoutFilename = "" 'leerer Dateistring, hier wird eigentlich noch gar nichts kopiert
    13. edata = New DataObject 'wurde vorher Global definiert
    14. Dim fi() As String = {GlobalDragoutFilename}
    15. edata.SetData(DataFormats.FileDrop, fi)
    16. ListView_Documents.DoDragDrop(edata, DragDropEffects.Copy)
    17. End Sub
    18. ''' <summary>
    19. ''' Drop außerhalb der Anwendung
    20. ''' </summary>
    21. ''' <param name="sender"></param>
    22. ''' <param name="e"></param>
    23. Private Sub ListView_Documents_QueryContinueDrag(sender As Object, e As QueryContinueDragEventArgs) Handles ListView_Documents.QueryContinueDrag
    24. If PDFWirdbereitsExportiert = True Then Exit Sub
    25. If e.KeyState = 0 Then
    26. 'Damit der Dropvorgang nicht auf sich selbst durchgeführt werden kann
    27. If DragVorgangGestartet = True Then
    28. 'Überprüfen ob die Maus außerhalb der Form ist
    29. If MousePosition.X > Me.Left And MousePosition.X < Me.Left + Me.Width And MousePosition.Y > Me.Top And MousePosition.Y < Me.Top + Me.Height Then
    30. 'Maus befindet sich noch auf der Form
    31. e.Action = DragAction.Cancel
    32. DragVorgangGestartet = False
    33. Exit Sub
    34. End If
    35. End If
    36. PDFWirdbereitsExportiert = True 'Damit die Routine bei der endgültigen Übergabe nicht erneut aufgerufen wird
    37. 'Das folgende Konstrukt erzeugt die PDF-Datei.
    38. 'Der Datenpfad zur PDF Datei wird mit GlobalDragoutFilename zurückgegeben.
    39. '#######################
    40. DragExport = True
    41. Dim abc As New MouseEventArgs(MouseButtons.Left, 1, 0, 0, 0)
    42. ListView_Documents_MouseDoubleClick(sender, abc)
    43. DragExport = False
    44. '#######################
    45. If File.Exists(GlobalDragoutFilename) Then
    46. 'Neue Datei ins DataObjekt hinzufügen und den Drop durchführen
    47. Dim fi() As String = {GlobalDragoutFilename}
    48. edata.SetData(DataFormats.FileDrop, fi)
    49. edata = Nothing
    50. e.Action = DragAction.Drop
    51. Else
    52. e.Action = DragAction.Cancel 'Datei existiert nicht, daher Dropvorgang abbrechen
    53. End If
    54. End If
    55. e.Action = DragAction.Continue
    56. End Sub
    57. Private Sub ListView_Documents_MouseMove(sender As Object, e As MouseEventArgs) Handles ListView_Documents.MouseMove
    58. If e.Button = MouseButtons.Left Then DragVorgangGestartet = True Else DragVorgangGestartet = False
    59. End Sub

    Liebe Grüße
    Roland Berghöfer

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

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

    Vielen Dank für die Unterstützung bei allen Fragen.
    Ich hab ein kleines Anwendungsvideo gemacht wo man den Drag & Drop Export und auch den Import sehen kann.
    Export per Drag & Drop direkt in eine andere Anwendung funktioniert auch, das ist aber am Video nicht zu sehen.

    youtu.be/-UelNNXK8DI
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Sieht gut aus. Kleiner Verbesserungsvorschlag: Lade nach der Upload nicht alle Dateien neue, sondern füge lediglich die neuen hinzu. Bei den paar Dateien sieht das schon recht langsam aus. Was ist bei 50 Dateien?
    "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
    @VaporiZed Eine sehr interessante Lösung.
    Ich hab das Zurücksetzen von StartDragging noch etwas optimiert, da funktioniert es so, wie man es sich vorstellt.
    Da könnte man sogar ganz easy ein UserControl draus basteln.
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Collections.Specialized;
    2. using System.Windows.Forms;
    3. namespace DoDragDrop
    4. {
    5. public partial class Form1 : Form
    6. {
    7. private bool StartDragging;
    8. public Form1()
    9. {
    10. InitializeComponent();
    11. this.panel1.QueryContinueDrag += this.Panel1_QueryContinueDrag;
    12. }
    13. private void panel1_MouseDown(object sender, MouseEventArgs e)
    14. {
    15. if (e.Button == MouseButtons.Left)
    16. {
    17. this.StartDragging = true;
    18. }
    19. }
    20. private void panel1_MouseUp(object sender, MouseEventArgs e)
    21. {
    22. // lokal beendet
    23. this.StartDragging = false;
    24. }
    25. private void panel1_MouseMove(object sender, MouseEventArgs e)
    26. {
    27. if (!this.StartDragging)
    28. {
    29. return;
    30. }
    31. StringCollection fileList = new StringCollection();
    32. fileList.Add("D:\\Temp\\2.txt"); // nicht-existente Datei
    33. DataObject dataObj = new DataObject();
    34. dataObj.SetFileDropList(fileList);
    35. this.panel1.DoDragDrop(dataObj, DragDropEffects.Copy);
    36. }
    37. private async void Panel1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    38. {
    39. if (this.StartDragging && e.Action == DragAction.Drop)
    40. {
    41. await System.Threading.Tasks.Task.Delay(1);
    42. MessageBox.Show("Drop ausgeführt");
    43. }
    44. this.StartDragging = false;
    45. }
    46. }
    47. }
    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!
    @mrMo

    Sieht gut aus. Kleiner Verbesserungsvorschlag: Lade nach der Upload nicht alle Dateien neue, sondern füge lediglich die neuen hinzu. Bei den paar Dateien sieht das schon recht langsam aus. Was ist bei 50 Dateien?


    Das war eine Neuinstallation mit geleertem Cache.
    Sobald die Dokumente einmal heruntergeladen wurden und keine Veränderung stattfand, werden die aus dem Cache gelesen.
    Im Demovideo habe ich aber 2x zwischen Cloud und Direktverbindung umgeschaltet, daher musste er alle Daten erneut laden.
    Aber ich weiß was du meinst.

    Beim ersten Mal dauert es leider immer länger. Das ist Systembedingt.
    Aus der Cloud (per API) bekomme ich das Inhaltsverzeichnis komplett und die Dokumentdaten nur einzeln.
    Aus dem Gerät muss ich mir sogar aus den Metadaten jeder einzelner Datei (über FTP) herunterladen, auslesen und eine Verzeichnisstruktur erstellen. Danach kann jedes einzelne Dokument direkt vom Gerät geladen werden (besteht meist aus 2 Ordnern und mindestens 4 Dateien). Diese muss ich dann auslesen, verarbeiten, ein Thumbnail erstellen (falls noch nicht existiert).

    Was ich jedenfalls anders machen hätte sollen:
    Ich hätte bei der ursprünglichen Planung der Browser-Funktion einen anderen Weg einschlagen müssen.
    Ich hätte das Listview nach dem Laden des Inhaltsverzeichnises mit Platzhaltern sofort befüllen müssen und danach ASYNC die einzelnen Dateien nachladen und die Imagelist aktualiseren müssen.
    Vielleicht mach ich das im Weihnachtsurlaub. Mal sehen ob ich die Muse dazu habe.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Man könnte es sogar noch weiter optimieren und nur die Daten Laden die momentanen angezeigt werden.
    "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
    Man könnte es sogar noch weiter optimieren und nur die Daten Laden die momentanen angezeigt werden.


    Das wird sowieso gemacht.

    Es werden nur die Dokumente geladen die in der aktuellen Ansicht (aktuellem Ordner) vorkommen.
    Das Inhaltsverzeichnis muss aber dennoch immer komplett geladen werden.

    Ich habe ein kurzes Beispielvideo in der Supportgruppe gepostet: facebook.com/groups/1637442566604503 (öffentlich)
    Liebe Grüße
    Roland Berghöfer

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