77 Stimmen

Delphi/Lazarus: Markierte Items aus ListBox mit ENTF-Taste löschen

Tipp von Stefan Trost | Letztes Update am 27.01.2023 | Erstellt am 09.01.2016

Heute möchte ich euch zeigen, wie ihr in Lazarus oder Delphi implementiert, dass eine TListBox auf die Entfernen-Taste (ENTF) reagiert und entsprechend alle markierten Einträge aus der Liste entfernt, falls ein Nutzer diese Taste gebraucht während die ListBox den Fokus hat.

Wir weisen unserer ListBox dafür ein OnKeyDown-Event zu, in dem wir den folgenden Code verwenden, um die gedrückten Tasten abzufangen:

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState);
var
  i: integer;
begin
  if Key = $2E then begin
    Listbox1.Items.BeginUpdate;

    for i := ListBox1.Items.Count - 1 downto 0 do begin
      if ListBox1.Selected[i] then ListBox1.Items.Delete(i);
    end;

    ListBox1.Items.EndUpdate;
  end;
end;

Die Variable "Key" enthält den Code der gedrückten Taste. Da wir auf die Taste ENTF reagieren möchten, fragen wir zunächst ab, ob Key = $2E ist. $2E ist der virtuelle Keycode der ENTF-Taste in hexadezimaler Schreibweise (die dezimale Schreibweise ist 46 und der Wert ist darüber hinaus auch in der Konstanten VK_DELETE gespeichert, den wir hier auch einsetzen könnten).

Falls diese Prüfung TRUE ergibt, die Taste also gedrückt wurde, gehen wir alle Items der ListBox durch und löschen diese, falls sie markiert sind (die Eigenschaft Selected[i] des Items ist dann TRUE). Wichtig ist, dass wir die Einträge rückwärts durchlaufen (downto), da wir sonst unter Umständen auf nicht mehr existierende Einträge mit unserer Schleife zugreifen, die wir zuvor in der selben Schleife gelöscht haben (ListBox1.Items.Count enthält beim Starten der Schleife die Anzahl aller Elemente, diese Zahl verringert sich mit dem Löschen jedes Eintrags). Außerdem sollten wir BeginUpdate und EndUpdate benutzen, damit die ListBox nicht nach jeder Löschung neu gezeichnet werden muss sondern nur ein einziges Mal nach dem Durchgehen und Prüfen aller Items.

Löschen über die DeleteSelected-Funktion

Neuere Version von Delphi und Lazarus machen uns das Löschen von Items aus einer ListBox sehr viel einfacher, da der TListBox-Komponente inzwischen die Funktion DeleteSelected hinzugefügt wurde. Damit müssen wir nur noch (wie oben beschrieben) auf die ENTF-Taste prüfen und die DeleteSelected-Funktion aufrufen falls diese Taste gedrückt wurde (und uns um den Rest nicht mehr kümmern brauchen):

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState);
var
  i: integer;
begin
  if Key = $2E then begin
    Listbox1.DeleteSelected;
  end;
end;

Trotzdem behält die oben beschriebene Methode auch heute noch ihre Berechtigung, da wir diesen Code um weitere Prüfungen erweitern können, bevor eine Löschung stattfindet. Zum Beispiel könnten wir vor dem Löschen einen Dialog anzeigen und die Löschung nur durchführen wenn der Nutzer sein Okay dazu gegeben hat oder andere Bedingungen prüfen, was mit dem bloßen Aufruf von DeleteSelected nicht möglich wäre.

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

Delphi: Systemweiter HotKey

Tutorial | 3 Kommentare

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.