Drag and Drop

Plattformunabhängige GUIs mit wxWidgets.
Antworten
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo,

Ich arbeite mit wxPython!
Ich möchte aus einer Listctrl per Drag and Drop Daten in den Windows-Explorer verschieben. Wie kann ich den Pfad des Explorers erhalten, in die ich die Daten meiner ListCtrl verschieben möchte? Ich brauche nur den Pfad, denn zur Erstelltung der Daten im Filesystem verwende ich eine eigene Funktion.

Hat jemand eine Idee diesen Pfad zu ermitteln?

Danke!
Gruß, Harry
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Vielleicht gehts ja auch anders.
Ich möchte nun nochmals mein Problem schildern.
Folgendes Problem:
Ich habe mir ein Unzip-Programm gebaut. Nun möchte ich Dateien aus meinem Fenster per Drag and Drop in den Windows-Explorer schieben.
Doch bevor ich die Drag and Drop-Operation starte, müssen die Dateien nartürlich entpackt sein.
Das bedeutet: Wenn ich während der Drag and Drop-Operation die Maustaste loslasse, müssen zuerst die angewählten Dateien aus meiner Liste intern entpackt werden und dann darf erst die Drag and Drop-Operation starten.

Wie kann ich das korrekt miteinander verbinden?
Gruß, Harry
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo

Mir ist, ehrlich gesagt Dein Problem nicht ganz klar. Wenn ich Dich richtig verstehe, willst Du
1. Dateien auflisten.
2. Diese entpacken.
3. Und DANN ERST irgendwo hinverschieben.

Da habe ich einige Verständnisprobleme: Wenn Du diese Dateien entpackst, willst Du sie erst vollständig im Speicher belassen und erst ausschreiben, wenn der Nutzer per Drag und Drop den Befehl gibt? So zumindest habe ich das verstanden. Ich weiß nicht, ob das eine gute Idee ist, denn wenn ich Pakete entpacke, kommen ab und zu weit mehr als 100 Mb dabei heraus und da bin ich doch ganz froh, wenn mein "Entpacker" mir das gleich auf die Platte schreibt, ich also nur noch den Pfad verändern muß - wenn ich das denn will.

Ansonsten würde ich einfach für jede dargestellte Datei eine "Fahne" setzen, die erst dann auf "True" gesetzt wird, wenn alle nötigen Operationen ausgeführt sind. Dann erst wird (bei Deinem Programm) die Drag-and-Drop-Option ermöglicht. Ich jedenfalls mache dergleichen so und gebe sonst eine eine kurze Information aus, die beinhaltet, was man als Anweder zuerst machen muß, um diese oder jene Option zu bekommen. (Du kannst natürlich auch überprüfen in welchem Zustand Deine Daten sind und dann eine Option ermöglichen oder nicht - ist womöglich sicherer.)

Vielleicht ist das aber immer noch völlig am Problem vorbei, den was Du damit meinst:
Das bedeutet: Wenn ich während der Drag and Drop-Operation die Maustaste loslasse, müssen zuerst die angewählten Dateien aus meiner Liste intern entpackt werden und dann darf erst die Drag and Drop-Operation starten.
ist mir absolut schleierhaft: Der Anwender soll eine Datei aus dem Explorer in Dein Programm ziehen und das startet dann das Entpacken? Oder existiert in Deinem Programm eine Liste von Dateien, die entpackt und dann in den Explorer verschoben werden? Wieso darf die Drag-and-Drop-Operation/Option erst starten/möglich werden, wenn man doch schon etwas zieht, um es möglich zu machen?

Vielleicht, wenn Du das Problem doch etwas genauer schilderst oder etwas Code gibst, daß jemand Dir helfen kann? Tut mir jedenfalls leid, wenn ich es (noch) nicht kann.

Gruß,
Christian
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Ich befürchte das geht so nicht.
Das DropTarget erhält die Benachrichtigung. Davon bekommt die DropSource gar nix mit. Das zu kopierende DataObject muss zu diesem Zeitpunkt schon existieren.
Du könntest einen eigenen Dateibaum in Deinem Programm darstellen, worauf Du die Dateien ziehen kannst. Dann kannst Du das DropTarget abfangen und das Dataobject entsprechend auswerten.
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Nochmals zur Erklärung:

Ich habe mir ein Programm zum Packen und Entpacken von Files gebaut.
Nun öffnen ich ein Zipfile. Dieses wird in mein Programm eingelesen (d.h. die Namen der Files aus dem Zipfile). Die Filenamen befinden sich nun in einer ListCtrl.
Aus dieser möchte ich nun die Files auf den Explorer verschieben.
Das bedeutet:
Ich muss die Files erstmal entpacken, da sie im Filesystem ja nur in der Zip-Datei vorliegen und nicht einzeln. Also entpacke ich sie zum Beispiel in ein Temp-Verzeichnis. Nun gebe ich der Drag and Drop-Operation dieses Verzeichnis als Source. Dieses wird dann in den Pfad verschoben auf dem ich die Maustaste loslasse.

Nun möchte ich aber das die Dateien erst entpackt werden, wenn die Drag Operation erfolgreich war, also erst nach loslassen der Maustaste. Macht ja auch Sinn und ist bei andern Packern ebenso.

Das Entpacken der ausgewählten Dateien aus dem eingelesenen Zip-File in meiner ListCtrl geschieht natürlich über eine interne Funktion meines Programms.

Ich hoffe das nun verständlich ist welches mein Problem ist.
Gruß, Harry
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Wie willst Du denn Drag-and-Drop realisieren?
Mit der in wxWidgets eingebauten Funktionlität? Oder direkt über Windows Shell-API?
Hast Du Drag-and-Drop schonmal für einfache Dateien angewendet? So zum testen?
So wie ich das verstehe ist das Problem, dass Du bei der Definition der wxDragSource mit SetData() ein wxDataObject angeben musst, das den Drop-Inhalt angibt. In Deinem Fall also einen Dateinamen. Das Problem ist aber, das die Datei zu dem Zeitpunkt noch nicht existiert, da sie ja noch gepackt ist. Du könntest Das umgehen indem Du die OnDrop-Funktion abfängst und dann entsprechent mit dem Inhalt des DataObjects umgehst. Aber leider bekommst Du gar keine OnDrop-Message, da diese ja der Explorer empfängt... und der erwartet eine vorliegende Datei.
D.h. entweder Du entpackst alles in ein temporäes Verzeichnis vor dem Drag-and-Drop Vorgang, dann kannst Du eine existierende Datei angeben, oder Du bastelst Dir selbst einen kleinen Dateiexplorer, dann kannst Du OnDrop abfangen.
Alles nur imo, kann mich auch irren ;)
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo Christopy,

Ich benutze die in wxWidgets eingebaute Funktionalität.
Drag and Drop funktioniert. Doch, und das hast du völlig richtig verstanden, muss ich die ausgewählten Dateien schon vor der Operation entpacken, da sie sonst nicht im File-System existieren.

Beim öffnen des Zipfiles alle Dateien schon in ein Temp-Verzeichnis entpacken wäre eine Lösung, aber warum wenn es auch anders möglich wäre. Schließlich nimmt das alles unnötig Zeit beim Öffnen in Anspruch.
Einen eigenen Dateiexplorer zu basteln wäre sicher auch möglich. Aber genau das möchte ich vermeiden. Mein Programm soll ja mit anderen Programmen über Drag and Drop interagieren können!
Es müsste irgendwie möglich sein bevor die Dateioperation des fremden Programms greift, aber erst nachdem man die gedrückte Maustaste losläßt, noch eine Funktion zu definieren.
Vielleicht hat ja jemand eine Idee oder einen Hinweis. Das wäre super!
Gruß, Harry
Antworten