Autor Beitrag
ThoPos
Hält's aus hier
Beiträge: 11

Windows, fast alle Versionen ab NT4
Delphi 2007, Delphi 10.1 Berlin
BeitragVerfasst: Mi 11.07.12 07:06 
Hallo liebe Programmierer,

ich schreibe gerade ein Programm, mit dem ich unter anderem Dateien in einer Datenbank verwalte.

Ich habe es schon hinbekommen, daß ich Dateien aus dem Windows-Explorer auf die ListView in meinem Programm ziehen kann und diese dann in die Datenbank geladen werden.

Jetzt würde ich gerne auch den umgekehrten Weg realisieren. Wenn ich in der Listview einen (oder mehrere) Einträge markiere und diese dann auf ein Explorer-Fenster ziehe, so sollen die Dateien dann dort abgelegt werden. Die 'normalen' Drag'n'Drop Mechanismen scheiden aus, da die Dateien ja noch nicht im Dateisystem exisiteren.
Ich benötige also irgend eine andere Möglichkeit, zu erkennen, daß ich mein Listview mit gedrückter Maustaste verlassen habe und die Maustaste erst über einem Explorer-Fenster wieder losgelassen wurde. Des Weiteren benötige ich dann den Pfad des Windows-Explorer.

Habt Ihr Ideen und ggf. Code-Beispiele?

Gruß aus Köln
Thomas


Zuletzt bearbeitet von ThoPos am Mo 23.07.12 21:05, insgesamt 1-mal bearbeitet
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 11.07.12 07:46 
In meinem Player nutze ich dafür diese Komponente, die ich mal im Netz gefunden habe. Ob es sie jetzt immer noch sonstwo gibt, weiß ich nicht. Ist ursprünglich von Angus Johnson.
Damit funktioniert es nicht nur in den Explorer, sondern auch in andere Programme, die Dateien per Drag&Drop akzeptieren.
Einloggen, um Attachments anzusehen!
_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: Sinspin
ThoPos Threadstarter
Hält's aus hier
Beiträge: 11

Windows, fast alle Versionen ab NT4
Delphi 2007, Delphi 10.1 Berlin
BeitragVerfasst: Mi 11.07.12 08:03 
Hallo Gausi,

leider hagelt es beim Einbinden der Komponente nur Fehlermeldungen "Konstantenausdruck verletzt untere Grenze".

Ich habe mir mal den Source der Komponente angesehen. So wie ich das sehe, muß auch bei dieser Variante die Datei VOR dem Drag'n'Drop auf dem FileSystem liegen. Oder Irre ich mich?
Denn genau hier liegt mein Problem: ich möchte nicht jedesmal, wenn der Anwender im ListView eine Datei markiert, diese direkt auf seiner Festplatte abspeichern, sondern erst, wenn es sich wirklich um ein Drop in ein Explorer-Fenster handelt.

Dennoch vielen Dank.

Gruß
Thomas
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 11.07.12 08:21 
Oberhalb von dem Quelltext steht die Bedienungsanleitung.
Und da steht deutlich, das es nicht nötig ist das die Datei beim starten auf der Platte liegt. Es wird ein Ereignis ausgelößt in dem Moment wie es nötig wird das sie vorhanden ist. Also wenn der Nutzer die Datei hat fallen lassen.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
ThoPos Threadstarter
Hält's aus hier
Beiträge: 11

Windows, fast alle Versionen ab NT4
Delphi 2007, Delphi 10.1 Berlin
BeitragVerfasst: Mi 11.07.12 17:51 
Hallo Daniel, hallo Stefan,

danke für Eure Tipps.

Dank der Info über den ursprünglichen Programmierer, habe ich auf den Entwickler gefunden, der die Komponenten weiter fortgeführt hat: Anders Melander (www.melander.dk).

Dessen Komponenten konnte ich auch ohne Kompilierungsfehler in mein D2007 einbinden.

Und Ihr hattet Recht. Mit der Komponente DropFileSource geht es auch, ohne daß man die Dateien vorher auf die Platte laden muß.

Der Trick ist, daß man - so zumindestens das Ergebnis meiner Versuche:
1. die Files-Liste mit Dateien (inkl. Pfad) füllen muß
2. alle Dateien den selben Pfad haben müssen
3. man im OnDrop-Event dann die Dateien im angegeben Pfad ablegen muß
4. die DragDop-Eigenschaft auf MOVE stehen muß

Was die Eigenschaft "Assynchron" bewirken soll, habe ich noch nicht entdeckt. Aber es scheint besser zu sein, wenn sie auf "Assynchron" steht und die Komponente auch mit .Execute(True) aufgerufen wird.

Nun habe ich folgendes Problem:
Sobald die Komponente im Programm genutzt wird, erscheinen beim Beenden des Progs mehrere Fehlermeldungen: Das Parent-Objekt meines Programmes könne nicht gefunden werden.

Des Weiteren wäre es für mein Audittrail noch hilfreich, wenn man das Ziel der Dateien ermitteln könnte.

Gruß aus Köln
Thomas
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 12.07.12 00:04 
Danke für den Link, ich gehe mal davon aus, neuer ist besser und versuch es auch mal mit der neuen allerdings in D7.
user profile iconThoPos hat folgendes geschrieben Zum zitierten Posting springen:
Was die Eigenschaft "Assynchron" bewirken soll, habe ich noch nicht entdeckt. Aber es scheint besser zu sein, wenn sie auf "Assynchron" steht und die Komponente auch mit .Execute(True) aufgerufen wird.

Eine Doku zu der Komponente habe ich nicht gefunden. Aber die Quelltexte sind gut dokumentiert. Ansonsten kann ich nur auf die Demos verweisen.
user profile iconThoPos hat folgendes geschrieben Zum zitierten Posting springen:
Nun habe ich folgendes Problem:
Sobald die Komponente im Programm genutzt wird, erscheinen beim Beenden des Progs mehrere Fehlermeldungen: Das Parent-Objekt meines Programmes könne nicht gefunden werden.

Im Archive sind eine ganze menge Demos mit dabei. Probier die mal aus ob es bei denen auch Probleme gibt. Wenn nicht schau nach was dort anders gemacht wird.
user profile iconThoPos hat folgendes geschrieben Zum zitierten Posting springen:
Des Weiteren wäre es für mein Audittrail noch hilfreich, wenn man das Ziel der Dateien ermitteln könnte.

Der gleiche Entwickler hat ein FAQ zur Komponente wo beschrieben ist warum es nicht geht. melander.dk/delphi/dragdrop/#faq_21

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
ThoPos Threadstarter
Hält's aus hier
Beiträge: 11

Windows, fast alle Versionen ab NT4
Delphi 2007, Delphi 10.1 Berlin
BeitragVerfasst: Do 12.07.12 21:38 
Hi Stefan,

leider habe ich mit meiner Fehlersuche keinen Erfolg.

Ich nutze die Komponente DragFileSource genauso wie im mitgelieferten Demo. Und bei der Suche nach dem Fehler im Einzelschritt-Modus kommen die Fehlermeldungen erst nach dem letzten Befehl, also wenn das Programm (scheinbar) schon beendet ist.

Ich habe inzwischen, quasi als Übergangslösung bis ich eine Erleuchtung habe oder man mir einen genialen Tip gibt, wo der Fehler liegt, das D&D ohne die Komponente realisert. Dazu habe ich das Herunterladen der Dateien auf die HDD in das MouseLeave-Event programmiert. Bei der geringen Dateigröße klappt dies noch.

Bzgl. des Audittrail werde ich in einer ruhigen Stunde mal ausprobieren, ob man nicht ermitteln kann, über welchem Fenster die Maustaste losgelassen wurde und - falls es ein Explorer-Fenster ist - welcher Pfad in diesem Fenster angezeigt wird.

Gruß
Thomas Posselt.


Zuletzt bearbeitet von ThoPos am Mo 23.07.12 21:06, insgesamt 1-mal bearbeitet
ThoPos Threadstarter
Hält's aus hier
Beiträge: 11

Windows, fast alle Versionen ab NT4
Delphi 2007, Delphi 10.1 Berlin
BeitragVerfasst: Mo 23.07.12 15:44 
Hallo Zusammen,

ich habe am Wochenende herausgefunden, wieso die Drag'n'Drop Komponente beim Beenden des Programms einen Laufzeitfehler generiert.

Ich habe in meinen Programm auf Application.OnActivate eine Prozedure gelegt. Wird die D&D-Komponente nun während der Programmausführung genutzt, so wird beim Beenden diese App.OnActivate-Prozedure aufgerufen. Benutzt man das D&D nicht, so wird App.OnActivate nicht aufgerufen.

Wieso der Aufruf einer OnActivate-Routine beim Beenden von der Verwendung der D&D-Komponente abhängig ist, will mir momentan nicht einleuchten. Rätselhaft ist mir auch, wieso ich in der Entwicklungsumgebung diesen Aufruf nicht verfolgen kann; wenn ich einen Haltepunkt in die Routine setze, so hält der Debugger nicht an dieser Stelle.

Gruß
Thomas