Ereignis VOR OnDropFiles - etwa DragFilesOver ??

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
volker
Beiträge: 24
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Rosa Linux Desktop R8 (L 1.6, FPC 2.6.4)
CPU-Target: 32Bit

Ereignis VOR OnDropFiles - etwa DragFilesOver ??

Beitrag von volker »

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!

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
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 ??

Beitrag von corpsman »

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 ?
--
Just try it

Martin V
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 ??

Beitrag von Martin V »

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

volker
Beiträge: 24
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Rosa Linux Desktop R8 (L 1.6, FPC 2.6.4)
CPU-Target: 32Bit

Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??

Beitrag von volker »

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!

Martin V
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 ??

Beitrag von Martin V »

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?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??

Beitrag von Michl »

Martin V hat geschrieben:wie man beispielsweise das Einfahrt-Verboten Schild bei OnDropFiles erhält
Ein Form.AllowDropFiles := False bewirkt dies.

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/library/windows/desktop/bb776406(v=vs.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; 

volker
Beiträge: 24
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Rosa Linux Desktop R8 (L 1.6, FPC 2.6.4)
CPU-Target: 32Bit

Re: Ereignis VOR OnDropFiles - etwa DragFilesOver ??

Beitrag von volker »

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 :evil: :evil: :evil: , das geht nur unter Windows :cry:
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)

Antworten