Ereignis VOR OnDropFiles - etwa DragFilesOver ??
-
- Beiträge: 25
- Registriert: Mi 14. Nov 2012, 14:36
- OS, Lazarus, FPC: Linux Kernel 6.6 (L 3.0 FPC 3.2.2)
- CPU-Target: x86_64 Linux gtk2
Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Hallo an die Spezialisten.
Ich habe eine Form die Dateien von anderen Applikationen (Linux: Konqueror, Win Explorer und Thunderbird) per Drag-and-Drop erhält. Funktioniert prächtig auf Anhieb (auf beiden Systemen) mit Form1.AllowDropFiles := true; und dem entsprechenden Ereignis FormDropFiles.
Einen "Schönheitsfehler" hat die Sache aber: Ich habe nirgendwo gefunden, ob es ein Ereignis gibt, welches ausgelöst wird, wenn man mit dem (mit Dateien "beladenen" Mauszeiger - um einmal bildlich zu sprechen) über die Form geht. Ich möchte durch eine Änderung eines TImage Objekt visuell dem Benutzer mitteilen, dass er jetzt (und genau hier) die Maustaste loslassen kann, um die Dateien "abzuladen".
So wie das viele Benutzer aus dem Internet bereits gewöhnt sind, Dateien mit HTML5 per Drag-and-Drop hochzuladen - da wird dann auch ein z.B. Rahmenelement in der Farbe geändert, etc., also ein einfaches optisches Feedback.
Also die konkrete Frage: Gibt es bei Lazarus ein Ereignis etwa wie OnDragFilesOver - vor dem "Loslassen" ???
vielen Dank für Eure Hilfe!
Ich habe eine Form die Dateien von anderen Applikationen (Linux: Konqueror, Win Explorer und Thunderbird) per Drag-and-Drop erhält. Funktioniert prächtig auf Anhieb (auf beiden Systemen) mit Form1.AllowDropFiles := true; und dem entsprechenden Ereignis FormDropFiles.
Einen "Schönheitsfehler" hat die Sache aber: Ich habe nirgendwo gefunden, ob es ein Ereignis gibt, welches ausgelöst wird, wenn man mit dem (mit Dateien "beladenen" Mauszeiger - um einmal bildlich zu sprechen) über die Form geht. Ich möchte durch eine Änderung eines TImage Objekt visuell dem Benutzer mitteilen, dass er jetzt (und genau hier) die Maustaste loslassen kann, um die Dateien "abzuladen".
So wie das viele Benutzer aus dem Internet bereits gewöhnt sind, Dateien mit HTML5 per Drag-and-Drop hochzuladen - da wird dann auch ein z.B. Rahmenelement in der Farbe geändert, etc., also ein einfaches optisches Feedback.
Also die konkrete Frage: Gibt es bei Lazarus ein Ereignis etwa wie OnDragFilesOver - vor dem "Loslassen" ???
vielen Dank für Eure Hilfe!
- corpsman
- Lazarusforum e. V.
- Beiträge: 1627
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Bei meinem Sample, das ich gerade durch mache ( http://wiki.freepascal.org/Drag_and_Drop/de )
war das die Zeile wo Accept := true steht. Ab da hat sich der Cursor geändert.
Gibt es für Form1 ein Drag Over ?
war das die Zeile wo Accept := true steht. Ab da hat sich der Cursor geändert.
Gibt es für Form1 ein Drag Over ?
--
Just try it
Just try it
-
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Ja:
procedure DragOver(Source:TObject;X,Y:LongInt;State:TDragState;Var Accept:Boolean);
Mit Accept kann man festlegen, ob die Operation erlaubt ist (andernfalls bekommt man gleich das Einfahrt-Verboten-Schild), außerdem kann man den DragCursor ändern.
Es gibt einen OnDropFiles Event Handler. Den kann man definieren, um die Aktion festzulegen, die mit dem Fallenlassen einer Datei in einer Form ausgeführt werden soll.
OnDropFiles hat speziell bei Mac noch eine weitere Bedeutung: Es wird auch dann aktiviert, wenn man zum Starten des Programms eine Datei auf das Applicationicon fallen läßt, das übliche Paramstr wird bei Mac bei derartigen Aktionen nicht ausgewertet, sondern nur als wirklicher Kommandozeilenparameter.
Es gibt eine recht ausführliche Doku hier:
http://wiki.freepascal.org/Drag_and_Drop/de
procedure DragOver(Source:TObject;X,Y:LongInt;State:TDragState;Var Accept:Boolean);
Mit Accept kann man festlegen, ob die Operation erlaubt ist (andernfalls bekommt man gleich das Einfahrt-Verboten-Schild), außerdem kann man den DragCursor ändern.
Es gibt einen OnDropFiles Event Handler. Den kann man definieren, um die Aktion festzulegen, die mit dem Fallenlassen einer Datei in einer Form ausgeführt werden soll.
OnDropFiles hat speziell bei Mac noch eine weitere Bedeutung: Es wird auch dann aktiviert, wenn man zum Starten des Programms eine Datei auf das Applicationicon fallen läßt, das übliche Paramstr wird bei Mac bei derartigen Aktionen nicht ausgewertet, sondern nur als wirklicher Kommandozeilenparameter.
Es gibt eine recht ausführliche Doku hier:
http://wiki.freepascal.org/Drag_and_Drop/de
-
- Beiträge: 25
- Registriert: Mi 14. Nov 2012, 14:36
- OS, Lazarus, FPC: Linux Kernel 6.6 (L 3.0 FPC 3.2.2)
- CPU-Target: x86_64 Linux gtk2
Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Vielen Dank für Eure Antworten,
aber die angesprochenen Ereignisse wie DragOver werden nur bei Drag_and_Drop von Elementen innerhalb des Formulars ausgelöst. Bei File-Drop (von außerhalb, von anderen Programmen (wie Konqueror, Explorer, Thunderbird,etc...) wird das überhaupt nicht ausgelöst.
Deshalb meine Fragen. Das Wiki ist wirklich gut, aber in meinem speziellen Fall half es nicht weiter...
Trotzdem vielen Dank für Eure Mühe!
aber die angesprochenen Ereignisse wie DragOver werden nur bei Drag_and_Drop von Elementen innerhalb des Formulars ausgelöst. Bei File-Drop (von außerhalb, von anderen Programmen (wie Konqueror, Explorer, Thunderbird,etc...) wird das überhaupt nicht ausgelöst.
Deshalb meine Fragen. Das Wiki ist wirklich gut, aber in meinem speziellen Fall half es nicht weiter...
Trotzdem vielen Dank für Eure Mühe!
-
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Das habe ich jetzt auch bemerkt und muß mich selbst korrigieren: OnDropFiles ist singulär, DragOver gehört zu einer anderen Gruppe von Methoden, die nicht auf Dateien beschränkt ist. DragOver hat hier keine Wirkung. Ich kann nicht sagen, wie man beispielsweise das Einfahrt-Verboten Schild bei OnDropFiles erhält. Weiß jemand ob das überhaupt geht bzw. wie das geht?
Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Ein Form.AllowDropFiles := False bewirkt dies.Martin V hat geschrieben:wie man beispielsweise das Einfahrt-Verboten Schild bei OnDropFiles erhält
Windows: Will man nur ein bestimmtes Control und nicht das ganze Formular für das Ablegen von Files freigeben, kann man das HWND des Controls verwenden (siehe https://msdn.microsoft.com/en-us/librar ... s.85).aspx). Allerdings verliert man die ganze Logik der LCL und man muss sich selbst darum kümmern.
Will man die Files unterschiedlich "empfangen", reicht eine einfache Abfrage im Form.OnDropFiles z.B.:
Code: Alles auswählen
procedure TForm1.FormDropFiles(Sender: TObject;
const FileNames: array of String);
var
aControl: TControl;
begin
aControl := FindControlAtPosition(Mouse.CursorPos, True);
if aControl is TMemo then
TMemo(aControl).Lines.AddStrings(FileNames);
if aControl is TListBox then
TListBox(aControl).Items.AddStrings(FileNames);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 25
- Registriert: Mi 14. Nov 2012, 14:36
- OS, Lazarus, FPC: Linux Kernel 6.6 (L 3.0 FPC 3.2.2)
- CPU-Target: x86_64 Linux gtk2
Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??
Vielen Dank für Eure Antworten, tja, dann geht das einfach nicht mit Files.
Eine andere Frage: Kennt sich jemand unter Linux mit AKONADI aus?
Beim Drag_and_Drop einer EMail aus KMail bekomme ich nämlich keine Datei, sondern eine Akonadi-Referenz auf die Form, so in etwa:
TEXT:akonadi:?item=7914&type=message%2Frfc822&parent=16
Hat jemand eine Idee, ob es für Lazarus da schon eine Unit gibt, um auf die AKONADI-DB (Server?) zuzugreifen. Es gibt natürlich eine Beschreibung des API bei KDE, aber sich durch diese C++ Klassen durchzuwühlen... übersteigt bei weitem meine Fähigkeiten!
(Out-of-Topic: Aus Thunderbird gibt es unter Linux überhaupt kein OnDrop-Ereignis
, das geht nur unter Windows
Dort wird automatische eine eml-Textdatei im Temp-Ordner erstellt und diese als Datei übergeben bei OnFileDrop - genau wie man und frau sich das wünscht. Nur bei der Linux-Version von Thunderbird tut sich da gar nix - obwohl der Konqueror (!) eine Referenz auf die z.B. Inbox empfängt. Aber das ist nicht Lazarus Problem)
Eine andere Frage: Kennt sich jemand unter Linux mit AKONADI aus?
Beim Drag_and_Drop einer EMail aus KMail bekomme ich nämlich keine Datei, sondern eine Akonadi-Referenz auf die Form, so in etwa:
TEXT:akonadi:?item=7914&type=message%2Frfc822&parent=16
Hat jemand eine Idee, ob es für Lazarus da schon eine Unit gibt, um auf die AKONADI-DB (Server?) zuzugreifen. Es gibt natürlich eine Beschreibung des API bei KDE, aber sich durch diese C++ Klassen durchzuwühlen... übersteigt bei weitem meine Fähigkeiten!
(Out-of-Topic: Aus Thunderbird gibt es unter Linux überhaupt kein OnDrop-Ereignis




Dort wird automatische eine eml-Textdatei im Temp-Ordner erstellt und diese als Datei übergeben bei OnFileDrop - genau wie man und frau sich das wünscht. Nur bei der Linux-Version von Thunderbird tut sich da gar nix - obwohl der Konqueror (!) eine Referenz auf die z.B. Inbox empfängt. Aber das ist nicht Lazarus Problem)