66 Stimmen

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.

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.