77 Stimmen

Lazarus: FormDropFiles einer bestimmten ListView zuordnen

Tutorial von Stefan Trost | Letztes Update am 20.01.2023 | Erstellt am 24.10.2013

Jedes Formular eines Lazarus Programms stellt die praktische Routine OnFormDropFiles zur Verfügung, die es uns sehr leicht macht, mit Dateien zu arbeiten, die per Drag and Drop aus einem Ordner auf das Programm gezogen wurden.

Wenn man allerdings mehrere Controls (zum Beispiel mehr als eine ListViews) auf seiner Form platziert hat, die alle Dateien aufnehmen könnten, stellt sich natürlich die Frage, welche ListView die Dateien empfangen hat und anzeigen soll. Die Frage ist also, über welcher ListView oder über welchem sonstigen Control der User die Maus losgelassen hat.

Wie man dieses Problem löst, möchte ich euch heute vorstellen. Dazu schauen wir uns zunächst den erforderlichen Code an:

procedure Tprog.FormDropFiles(Sender: TObject; 
  const FileNames: array of String);
var
  c:  TControl;
  i:  integer;
  li: TListItem;
begin

  c := FindControlAtPosition(Mouse.CursorPos, false);

  if c is TListView then begin
     for i := 0 to length(FileNames)-1 do begin
         li := (c as TListView).Items.Add;
         li.Caption := FileNames[i];
     end;
  end else begin
     showmessage('Hier kann man keine Dateien ablegen.');
  end;

end;   

Das Prinzip ist relativ einfach: In dem Moment, indem FormDropFiles() ausgelöst wird, erfragen wir mit der Funktion FindControlAtPosition() das Control, das sich gerade unter unserer Maus befindet. Dazu lesen wir mit der Hilfe von Mouse.CursorPos die aktuelle Position der Maus aus und übergeben die ermittelte Position an FindControlAtPosition(). Diese Funktion gibt uns dann das Control zurück, das wir hier in der Variablen c speichern.

Anschließend prüfen wir mit "if c is TListView", ob dieses Control auch wirklich eine TListView ist / vom Typ TListView ist (es könnte schließlich auch ein Button oder ein Label sein oder jegliches andere Control auf unserem Formular). Wenn dies der Fall ist, fügen wir zu genau dieser ListView unserer Datei hinzu. Wir sollten die Prüfung übrigens in jedem Fall durchführen um Access Violations vorzubeugen, da uns FindControlAtPosition() auch nil zurückgeben kann, falls kein Control gefunden wurde.

In dem Fall, dass unser Control unter der Maus keine ListView ist, zeigen wir dem Nutzer eine kleine Meldung an, dass er hier keine Dateien ablegen kann. Diese Meldung kann man natürlich aber auch weglassen.

Alternativ lässt sich das Beispiel von oben natürlich auch auf jedes andere Control wie zum Beispiel eine TListBox oder ein Memo übertragen, indem man statt auf die ListView auf dieses Control prüft und die Dateien entsprechend verarbeitet.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.