Entwickler-Ecke

Open Source Units - TOnFileDrop


0xCC - Mi 02.08.06 21:57
Titel: TOnFileDrop
Eine Komponente für Drag & Drop von Dateien.
(der komplette dateiname wird übergeben, unterstützt ansi und unicode)

Einfach aufs Formular ziehen, und das OnFileDrop Ereignis zuweisen.

Installation: Datei-öffnen: DPK auswählen, dann compilieren und installieren.
Im Reiter "int 3" findet ihr dann die Komponente.

http://int3.at/downloads/int3OnFileDrop.zip


GTA-Place - Do 03.08.06 21:14

Kannst du bitte genauer eklären, was man mit deiner Komponente machen kann? Zieht man eine Datei auf das Programm und bekommt den Dateinamen im Ereignis OnFileDrop?


0xCC - Fr 04.08.06 11:12

user profile iconGTA-Place hat folgendes geschrieben:
Zieht man eine Datei auf das Programm und bekommt den Dateinamen im Ereignis OnFileDrop?

Ja, das Ereignis OnFileDrop wird aktiviert wenn man Datei(en) auf das Formular zieht und "dropt".

Üblicherweise muss man um diese Funktionalität zu erreichen einen eigenen Messagehandler für WM_DROPFILES einrichten sowie im Form.Create die API-funktion DragAcceptFiles aufrufen.
Ziemlich viel Aufwand eben, den diese Kompo einem abnehmen soll.


Fighter#1 - Fr 04.08.06 11:45

Vielen Dank,
Super Komponente, kann ich grad super gebrauchen :-)
Auch mehrere Dateien, ... TOLL!


0xCC - So 21.01.07 17:46

Neue Version online, unterstützt nun auch widestring (unicode) per event OnFileDropWide


Calculon - So 21.01.07 18:16

Ich find's super! :zustimm:

Kann ich den zulässigen Drop-Bereich irgendwie beschränken z.B. über einer Listbox oder so?

Gruß

Calculon


0xCC - So 21.01.07 19:50

user profile iconCalculon hat folgendes geschrieben:
Kann ich den zulässigen Drop-Bereich irgendwie beschränken z.B. über einer Listbox oder so?

ich hab grade ne neue version geuppt die das kann. also drüberinstallieren und dann ca. so vorgehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, int3onfiledrop, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OFD(filename:string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  drop : TonfileDrop;

implementation

{$R *.dfm}

procedure TForm1.OFD(filename:string);
begin
   memo1.lines.add(filename);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  drop := tonfiledrop.Create(Memo1);
  drop.OnFileDrop := OFD;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  drop.free;
end;

end.


Calculon - So 21.01.07 20:15

Also dein Beispiel (auch das von der vorherigen Version in der Readme) liefert bei mir eine Stackoverflow-Fehlermeldung.
Nur auf visueller Ebene funktioniert das bei mir:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.OnFileDrop1FileDrop(filename: String);
begin
  memo1.Lines.Add(filename);
end;

Allerdings habe ich das mit der Beschränkung noch nicht hinbekommen. Welchen Code muss ich bei visuellem Gebrauch benutzen?

Gruß
--


0xCC - So 21.01.07 20:34

ne visuelle möglichkeit gibts leider nicht.
ich hab aber mal ein beispielprojekt angehängt, vielleicht funktioniert es so bei dir.


Calculon - So 21.01.07 20:47

Sorry, der Fehler vorhin lag daran, dass ich die Komponente auf die Form geschoben hatte, bevor ich dein Code benutzt hab'. Dabei recht es einen Eintrag bei uses zu machen.

Funktioniert jetzt wunderbar! Super Komponente!

Gruß

Calculon
--


Jakob Schöttl - So 21.01.07 21:13

Ich habs mir jetzt noch nicht runtergeladen, aber wird der Cursor bei jeder Datei die aufs Form gezogen wird zum crDrop oder nur bei denen, die man will zB. '*.mp3'?


0xCC - So 21.01.07 21:17

user profile iconJakob Schöttl hat folgendes geschrieben:
Ich habs mir jetzt noch nicht runtergeladen, aber wird der Cursor bei jeder Datei die aufs Form gezogen wird zum crDrop oder nur bei denen, die man will zB. '*.mp3'?

bei jeder datei.
die erkennung des dateityp's kannst du erst im event onfiledrop vornehmen, z.b.:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// im interface -teil
function PathMatchSpecA(pszFile, pszSpec: PAnsiChar): Boolean; stdcallexternal 'shlwapi.dll';
// ...

procedure TForm1.OnFileDrop1FileDrop(filename:string); 
begin 
   if pathmatchspecA(pchar(filename), '*.mp3'then memo1.lines.add(filename); 
end;


0xCC - So 21.01.07 22:24

habe die komponente nun komplett eigenständig gemacht, d.h. mit der aktuellen version 1.0.3 kann man die komponente auch mit verschiedenen formularen oder controls verwenden, indem man mehrere instanzen erzeugt.


teamrocket0 - Mi 28.02.07 22:33

Und wie kann ich nur den Dateinamen anzeigen lassen, das heißt also ohne die Pfadangaben?


0xCC - Do 01.03.07 02:36

ganz einfach:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.OnFileDrop1FileDrop(filename:string); 
begin 
   memo1.lines.add(extractfilename(filename)); 
end;


Tino - Do 01.03.07 11:40

@0xCC: Würdest Du bitte Deine Unit als Dateianhang an den Beitrag anhängen. Danke!

Regeln:
Diese Sparte ist für alle die gedacht die mit Delphi nützliche Units programmiert haben und diese nun in einer großen Community veröffentlichen wollen.

Die Entwickler-Ecke stellt Dir deshalb diese Sparte zur Verfügung. Folgende Punkte solltest Du bitte beachten:
  • Geltende Copyrightbestimmungen dürfen nicht verletzt werden
  • Die Unit muss im Beitrag selbst mit Delphi-Tags umschlossen oder per Anhang eingefügt werden.
  • Beschreib die Unit in einigen Sätzen damit der Leser weiß um was es geht
  • Die Unit muss dokumentiert sein
  • Nur eine Unit in einem Topic vorstellen
  • Nicht ein neues Topic starten nur weil es eine neue Version gibt sondern in dem schon vorhandenen Topic veröffentlichen


teamrocket0 - Do 01.03.07 20:18

Super.
Recht Herzlichen Dank an "0xCC"

Das funktioniert einwandfrei.
Ich werde denen Namen zu den Credits adden müssen!;-)


Calculon - Do 05.07.07 18:07

Hi,

ein Bug?

Wenn ich den Formstyle der Form auf fsStayOnTop setze, funktioniert Drag&Drop nicht mehr. Auch nicht mehr, wenn ich sie zur Laufzeit wieder in fsNormal abändere.

Im Anhang ein Beispielprojekt..

Gruß

Calculon
--


teamrocket0 - Di 07.08.07 23:39

Kann ich auch noch die dateiendung "abschneiden", so das ich nur den Namen der Datei habe?


Dezipaitor - Mi 08.08.07 00:02

@0xCC:
Sag mal, hast du in Turbo Pascal gearbeitet?


Delphi-Quelltext
1:
POnFileDrop = ^TOnFileDrop;                    


Sowas macht man nur bei "object", jedoch nicht bei class, da der Typ Class intern bereits ein Zeiger ist.


Übrigens, du solltest StrDispose und was danach kommt in einen finally Block einschließen. Wenn eine Exception in fOnFileDropWide, ist der Speicherplatz verloren.


Blackheart666 - Mi 08.08.07 07:44

user profile iconteamrocket0 hat folgendes geschrieben:
Kann ich auch noch die dateiendung "abschneiden", so das ich nur den Namen der Datei habe?


Das hatt doch nun nichts mit der Komponente zu tun, schau Dir mal das an.
http://www.dsdt.info/referenz/kategorie/?kat=5


teamrocket0 - Mi 08.08.07 14:42

Alles klar....

Wenn ich hier diese beiden Sachen mit einander kombieniere dann..


Delphi-Quelltext
1:
extractfilename(ChangeFileExt(FileName,''))                    


sollte das funktionieren, was es natürlich auch hervorragend tut!

Besten Dank.


Ironhead - Fr 21.09.07 01:59

Vielen Herzlichen Dank an 0xCC, die Kompo ist wirklich sau gut, das spart einem echt ne menge Code-schreiberei.
Ein Markel hab ich allerdings bei mir wird die Kompo nicht als Kompo im Formular angezeigt, ich muss mir schon merken wo ich sie hingesetzt hab.
Ist allerdings nur ein kleines Übel, also das soll keine Kritik sein, iss vielleicht nur ein Fehler an meinem Programm.


teamrocket0 - So 05.11.17 16:01

Heute habe ich mir ein kleines Programm mit dem guten alten "int3OnFileDrop" gebastelt. Es sollte anfangs nur schnell alle Namen der Ordner oder Dateien in ein Memo drücken. Funktioniert ja auch sehr gut. Aber ich hätte auch gerne noch die Namen der Unterordner und Dateien in diesen Unterordnern als Zusatzoption gehabt. Da stellt sich mir die Frage, welcher Befehl sich da anbietet. Ich habe schon Lösungen gefunden, aber die lassen sich nicht mit "int3OnFileDrop" vereinbaren. Kann mir da jemand bitte einen Hinweis geben, wie ich an die Unterverzeichnisnamen über Drag und Drop herankommen kann?


Narses - So 05.11.17 17:02

Moin!

user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
Aber ich hätte auch gerne noch die Namen der Unterordner und Dateien in diesen Unterordnern als Zusatzoption gehabt. Da stellt sich mir die Frage, welcher Befehl sich da anbietet.
Zunächst mal macht das ja mit den Inhalten nur dann Sinn, wenn man einen Ordner übergibt. ;) Weiterhin ist es wohl kaum der Focus einer solchen Komponente, die Verzeichnisstruktur zu ermitteln. Das musst du schon selbst tun (insbesondere gibt es keinen einzelnen "Befehl" dazu) oder einen der unzähligen Code-Schnipsel dafür verwenden. Vor allem muss du ja eh erstmal rausfinden, ob es ein Ordner oder eine Datei ist, die übergeben wurde. Wo genau ist das Problem? :nixweiss:

cu
Narses


icho2099 - Mo 06.11.17 15:07

Wo ich das hier gerade lese:

Ich verwende das tOnFileDrop auch hin und wieder mal.

Was müsste man denn tun damit auch Dateien die Anlagen in EMail sind, per Drag & Drop aus z.B. Outlook in eine
Delphi Anwendung gezogen werden können, auch mit so einer simplen Komponente wie tOnFileDrop ?
Hat da jemand etwas fertig zum verwenden ?


teamrocket0 - Di 12.03.19 23:55

Wieder einmal int3OnFileDrop. Allerdings auf Windows 10.

Folgendes Problem.

Ich habe Delphi 7 auf Windows 10 installiert. Das Prog läuft soweit ja ganz gut.
Die Komponente "CoolTrayIcon_D6plus.dpk" konnte ich bereits irgendwie installieren. Fragt mich jetzt nicht, wie. Es ist einen Weile her.

Jetzt möchte ich gerne wieder die "pkg_int3OnFileDrop.dpk" installieren. Aber es funktioniert einfach nicht.

Ich kann die Komponente ohne Fehlermeldungen compilieren und installieren, aber nur für das eine Mal. Beim nächsten Start von Delphi ist die Komponente wieder raus, aus der Tool-Leiste. Somit kann ich auch keine Projekte ohne Fehlermeldung öffnen, die diese Komponente bereits eingebaut haben. Kotzt mich total an.

Ich habe Delphi bereits als Administrator ausgeführt und über "Komponente installieren..." versucht die "pkg_int3OnFileDrop.dpk" hinzuzufügen. Ich habe verschiedenen Verzeichnisse ausprobiert, von denen aus ich die Komponente installieren möchte. Ich habe schon die Sicherheitsrichtlinien für die gesamte Festplatte auf "Jeder - Vollzugriff" gestellt. Aber die "pkg_int3OnFileDrop.dpk" bleibt einfach nicht in dieser verdammten Tool-Leiste.

Was kann ich da noch versuchen?

Eine Lösung für dieses Problem wäre echt super. Ansonsten rotzt ich den Rechner gleich von der nächsten Klippe und benutze wieder meinen Rechner bei meinen Eltern.

Hundert Erfahrungspunkte für denjenigen der die Lösung beisteuern kann...^^

Vielen Dank.


Delete - Mi 13.03.19 00:43

- Nachträglich durch die Entwickler-Ecke gelöscht -


teamrocket0 - Mi 13.03.19 01:06

Schon mal Danke an "Frühlingsrolle".
War durchaus ein Versuch wert. Aber dennoch stellt sich Delphi stur und will diese "OnFileDrop"-Komponente einfach nicht in seinem verdammten Langzeitgedächtnis behalten.

Nur mit der "*.pas" und der "*.dpk" ist das Prob auch nicht aus der Welt. Schon irgendwie schade. :-(


Delete - Mi 13.03.19 01:38

- Nachträglich durch die Entwickler-Ecke gelöscht -


Narses - Mi 13.03.19 12:18

Moin!

Ich habe auch mal sowas als Komponente gebaut und unter D7 betrieben, Quelltext im Anhang. Einfach in ein neues Package (oder das vorhandene Test/Demo-Package) installieren, compilieren, fertig. Vielleicht läuft das ja. ;)

cu
Narses

PS:
user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe schon die Sicherheitsrichtlinien für die gesamte Festplatte auf "Jeder - Vollzugriff" gestellt.
Das ist überhaupt keine gute Idee, das solltest du schleunigst wieder rückgängig machen (wenn das überhaupt noch geht... :hair:)! Ansonsten: viel Spaß mit der nächsten Malware... :?


teamrocket0 - Mi 13.03.19 21:09

Ich habe Delphi 7 als Admin ausgeführt und über die Funktion "Komponente installieren..." die "OnFileDrop"-Komponente installiert. Ohne Fehlermeldung. In der Tool-Leiste wird die neue Komponente ja auch angezeigt. Aber wenn ich Delphi 7 schließe und erneut ausführe, unabhängig davon ob "Als Administrator" oder nicht, fehlt die "OnFileDrop"-Komponente in der Tool-Leiste.

Wenn ich die Komponente "ShellFileDrop.pas" von Narses mit der Funktion "Komponente installiere..." -> "in neues Package"...erhalte ich folgende Fehlermeldung:


Delphi-Quelltext
1:
[Fataler Fehler] ShellFileDrop.pas(1): Das Programm oder die Unit 'ShellFileDrop.pas' ruft sich selbst wieder auf                    


Zitat:
Das ist überhaupt keine gute Idee, das solltest du schleunigst wieder rückgängig machen (wenn das überhaupt noch geht... :hair:)! Ansonsten: viel Spaß mit der nächsten Malware... :?

Also, mal davon abgesehen, das ich Windows 10 hasse, scheint ihr ja auch nicht gerade von Windows 10 überzeugt zu sein!^^


Narses - Mi 13.03.19 23:14

Moin!

user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich die Komponente "ShellFileDrop.pas" von Narses mit der Funktion "Komponente installiere..." -> "in neues Package"...erhalte ich folgende Fehlermeldung:

Delphi-Quelltext
1:
[Fataler Fehler] ShellFileDrop.pas(1): Das Programm oder die Unit 'ShellFileDrop.pas' ruft sich selbst wieder auf                    
Ähm, du hast nicht zufällig das Package so genannt, wie die Unit? :suspect: Nimm doch einfach mal das Standard-Demo-Package (ich weiß leider grad nicht, wie das heißt, "Verschiedene" oder so). :idea:

user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Das ist überhaupt keine gute Idee, das solltest du schleunigst wieder rückgängig machen (wenn das überhaupt noch geht... :hair:)! Ansonsten: viel Spaß mit der nächsten Malware... :?
Also, mal davon abgesehen, das ich Windows 10 hasse, scheint ihr ja auch nicht gerade von Windows 10 überzeugt zu sein!^^
Das bin ich auch nicht und wäre nicht im Traum darauf gekommen, D7 unter W10 zu installieren. Meine Delphi-IDE läuft schon seit Jahren in einer VM und ist sofort, immer und unverzüglich auf jedem neuen Rechner einsatzbereit... :D

cu
Narses


jaenicke - Do 14.03.19 11:30

user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Das ist überhaupt keine gute Idee, das solltest du schleunigst wieder rückgängig machen (wenn das überhaupt noch geht... :hair:)! Ansonsten: viel Spaß mit der nächsten Malware... :?

Also, mal davon abgesehen, das ich Windows 10 hasse,
Das hat ja nichts mit Windows 10 zu tun. Die Rechte sollte man nie auf "Jeder" setzen, ob nun unter Windows Vista oder unter Windows 10.
Ich habe Delphi 7 auch problemlos unter Windows 10 getestet, man sollte nur beachten, dass es standardmäßig eben in das eigene Verzeichnis schreiben möchte. Das kann man aber auch umgehen ohne gleich die Rechte zu verändern:
https://www.entwickler-ecke.de/topic_Delphi+1+bis+7+unter+Vista+bis+Win+10+richtig+installieren_89408,0.html

user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
scheint ihr ja auch nicht gerade von Windows 10 überzeugt zu sein!^^
Ich schon, aber das tut hier nix zur Sache. ;-)

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Nimm doch einfach mal das Standard-Demo-Package (ich weiß leider grad nicht, wie das heißt, "Verschiedene" oder so). :idea:
Jetzt wo die Rechte eh schon im Lokus gelandet sind geht das natürlich, aber wenn man Delphi 7 richtig einrichtet, fehlen da die Rechte. Von daher sollte man auch bei Delphi 7 eher eigene Packages benutzen.

Aber eine ganz andere Frage:
Das hört sich jetzt nicht eben so an als würdest du damit Geld verdienen. Kannst du nicht einfach die kostenlose Community Edition benutzen?
https://www.embarcadero.com/de/products/delphi/starter
Dann hast du eine moderne IDE, die auch für die Verwendung unter Windows 10 entwickelt wurde. Und angenehmer als Delphi 7 ist sie sowieso zumal du da auch für z.B. Android entwickeln kannst, Unicodeunterstützung und Generics hast, ...


teamrocket0 - Do 14.03.19 22:57

Ehm, warum ich nicht Delphi 10 benutze? Es ist ja nun nicht so, das ich Delphi 10 (aus Gott weiß welchen Gründen auch immer) nicht installiert habe. Ich möchte gerne ein (schon etwas älteres, kleines Programm) von mir, gerne (schnell) um zwei, drei Funktionen ergänzen und nicht alles in Delphi 10 neu schreiben, nur weil Delphi 10 mir die Ohren voll jammert, das die "OnFileDrop"-Komponente absolut unbekannt ist. So was nervt mich einfach nur. Deswegen der Entschluss einfach kurzerhand Delphi 7 und die "OnFileDrop"-Komponente zu installieren und die paar Zeilen Code hinzugefügt.

Seltsamerweise hat das Installieren der "CoolTrayIcon_D5.dpk" irgendwie funktioniert. Frag mich nicht wie...

Aber ich denke, es ist einen Versuch Wert, Delphi 7 zu deinstallieren, die Registrierung zu reinigen und noch einmal neu zu installieren. Ob das jetzt die Lösung ist, wage ich zu bezweifeln.

Gegebenenfalls muss ich eben alles neu in Delphi 10 programmieren oder den Rechner bei meinen Eltern abbauen und in meine zweiten Unterkunft umquartieren!^^

Aber trotzdem vielen dank für eure Unterstützung. :-)


teamrocket0 - Do 14.03.19 23:19

OK...es war doch tatsächlich "DIE LÖSUNG"....Delphi 7 zu Deinstallieren, die Reg zu reinigen und dann neu zu installieren...Fragt mich nicht, aber es muss wohl an irgendeinem Dateipfad gelegen haben.

Nach diesem Prozedere, jedenfalls, bleibt die Komponente "CoolTrayIcon" als auch die "OnFileDrop" in der Tool-Leiste bestehen. BAM, in meine Fresse...^^


jaenicke - Fr 15.03.19 08:05

user profile iconteamrocket0 hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte gerne ein (schon etwas älteres, kleines Programm) von mir, gerne (schnell) um zwei, drei Funktionen ergänzen und nicht alles in Delphi 10 neu schreiben
So viele Änderungen sind meistens gar nicht nötig. Solange man nicht direkt mit der API gearbeitet hat und dabei falsche Typen verwendet hat (PChar - PAnsiChar - PWideChar, ...) oder man with benutzt hat, gibt es da meistens kaum Probleme.