Delphi/Lazarus: Mit STRG+A in ListView alles markieren
Tipp von Stefan Trost | Letztes Update am 18.11.2022 | Erstellt am 04.10.2013
Wenn man in Delphi oder auch Lazarus ein Programm geschrieben hat, das eine TListView mit einigen Einträgen enthält, ist es ganz schön, wenn man diese auch mit der Tastatur und dem Tastenkürzel STRG und A komplett markieren kann. Leider unterstützt eine normale ListView diese Funktion nicht automatisch.
Wir können aber schnell Abhilfe schaffen, indem wir den folgenden Code in das OnKeyDown-Event unserer ListView hinein schreiben:
procedure Tprog.ListView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i: integer; begin if (Shift = [ssCtrl]) and (key = ord('A')) then begin ListView1.Items.BeginUpdate; for i := 0 to ListView1.Items.Count - 1 do ListView1.Items[i].Selected := true; ListView1.Items.EndUpdate; end; end;
Der Code überprüft zunächst, welche Tasten gedrückt wurden. Sind es die Tasten "STRG" (Shift = [ssCtrl] - die Shift-Taste ist gedrückt) und "A" (key = ord('A') oder auch key = 65), gehen wir alle Einträge der ListView durch und setzen die Eigenschaft "Selected" jedes einzelnen Items auf "true". Damit die ListView nicht nach jeder dieser einzelnen Änderungen neu gezeichnet wird, rufen wir vor und nach dem Durchgehen der Elemente .BeginUpdate und .EndUpdate auf. Natürlich kann man hier auch noch Bedingungen für andere Tasten oder Tastenkombinationen hinzufügen.
Wichtig: Damit wir überhaupt mehrere Einträge in der ListView markieren können, müssen wir die Eigenschaft "MultiSelect" unserer ListView vorher (zum Beispiel über den Object Inspector) auf true setzen. Diese Eigenschaft ist ansonsten per Default deaktiviert sodass sich gleichzeitig nur ein Element der ListView auswählen lässt.
Allgemeinere Lösung
In unserem ersten Codebeispiel arbeiten wir direkt mit einer konkreten ListView, die den Namen ListView1 trägt. Man kann es auf diese Weise machen, in manchen Fällen bietet sich aber eine allgemeinere Lösung an. Zum Beispiel wenn wir mehrere ListViews haben und alle auf die gleiche Weise auf unsere Tastenkombination reagieren sollen. In diesem Fall können wir eine allgemeine Prozedur schreiben, die wir dann jeder ListView zuweisen können, ohne den gleichen Code mehrfach schreiben zu müssen.
Wir machen uns dabei der Variable "Sender" zu Nutze, die eine Referenz zu der aufrufenden ListView enthält. So wissen wir, welche ListView den Code aufgerufen hat und können mit dieser ListView weiterarbeiten. Ein allgemeiner Code könnte entsprechend folgendermaßen aussehen:
procedure Tprog.ListViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var AListView: TListView; i: integer; begin if not (Sender is TListView) then exit; AListView := (Sender as TListView); if (Shift = [ssCtrl]) and (key = 65) then begin AListView.Items.BeginUpdate; for i := 0 to AListView.Items.Count - 1 do AListView.Items[i].Selected := true; AListView.Items.EndUpdate; end; end;
Viel hat sich gegenüber dem ersten Code nicht geändert. Statt direkt auf "ListView1" zuzugreifen, arbeiten wir jedoch dieses Mal mit einer Variable, die wir "AListView" genannt haben. Damit es zu keinem Fehler kommt falls die Procedure von einem anderen Controltyp aufgerufen wird, prüfen wir zunächst in der ersten Zeile, ob der Sender wirklich vom Typ TListView ist. Falls nicht, brechen wir sofort ab. Falls doch, können wir weitermachen und gemäß dem Vorgang, den wir oben besprochen haben, alle Elemente der aufrufenden ListView selektieren.
Über den Autor
Software 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
Lazarus: FormDropFiles einer bestimmten ListView zuordnen
Tutorial | 0 Kommentare
Firefox: 15 nützliche Tastaturkürzel, die niemand kennt
Artikel | 0 Kommentare
Delphi/Lazarus: ListView - PopupMenü nur anzeigen, wenn ein Eintrag ausgewählt ist
Tipp | 0 Kommentare
MySQL: Aktuelles Datum oder Zeit in Spalte schreiben
Tutorial | 0 Kommentare
Delphi: Systemweiter HotKey
Tutorial | 3 Kommentare
Delphi/Lazarus: Mit ENTF-Taste markierte Einträge aus ListView löschen
Tipp | 0 Kommentare
Delphi/Lazarus: Item bzw. Zeile zu ListView hinzufügen
Info | 0 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.