Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Suchen im Listview


Breslfezn - Do 03.02.11 15:51
Titel: Suchen im Listview
Hallo Leute!

Da ich noch ein Anfänger in Turbo Delphi bin, habe ich eine Frage:

Wie kann man in einem ListView Daten über ein Edit-Feld suchen und dann durch eine Markierung sichtbar machen???
Vielen Dank im Vorraus

Breslfezn


elundril - Do 03.02.11 16:18

Hallo und :welcome: im Delphi-Forum!

Kommt drauf an. Willst du es im kompletten Listview suchen oder nur einer Spalte vom ListView (wenn es auf Report gestellt ist)? Auf jeden Fall wirst du nicht um eine Schleife rum kommen die die ListView vom ersten bis zum letzten Eintrag durchgeht und dann vergleicht.

lg elundril


Narses - Do 03.02.11 16:21

Moin und :welcome: im Forum!

Probier das mal hier, vielleicht kommst du damit weiter (Listviews sind für Anfänger schon etwas schwer zu durchschauen :?):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
  var
    i: Integer;
begin
  for i := 0 to ListView1.Items.Count-1 do // alle Einträge durchsuchen
    if (ListView1.Items.Item[i].Caption = Edit1.Text) then begin // gefunden?
      ListView1.Items.Item[i].Selected := TRUE; // markieren
      ListView1.Items.Item[i].Focused := TRUE; // auswählen
      Exit; // abbrechen
    end;
  ShowMessage('Nicht gefunden!');
cu
Narses


Webo - Do 03.02.11 16:24

Es hängt davon ab, inwiefern du suchen willst. Wenn du nur die Einträge mit dem Edit-Text vergleichen willst, also auf vollständige Funde überprüfen möchtest, dann ist das relativ einfach. Du gehst sämtliche Einträge und vergleichst, ob der Name des Items, welches du grade hast gleich dem Text des Edits ist. Dann kann man mit ListView1.Items.Item[0].Selected := True; dieses Element markieren.


Delete - Do 03.02.11 16:41


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
function SearchInListView(text: string; AListView: TListView; bCaseInsensitive: Boolean = true): Boolean;
var
  i,j: integer;
  ACompareText: String;
begin
  Result := False;
  if bCaseInsensitive then
    text := lowercase(text);
  AListView.Items.BeginUpdate;
  try
    for i := 0 to AListView.Items.Count -1 do
    begin
      ACompareText := AListView.Items[i].Caption;
      if bCaseInsensitive then
        ACompareText := lowercase(ACompareText);
      if pos(text,ACompareText)>0 then
      begin
        AListView.ItemIndex := i;
        Result := True;  // Exit(true);  für neuere delphi-Versionen
        Exit;
      end;

      for j := 0 to AListView.Items[i].SubItems.Count -1 do
      begin
        ACompareText := AListView.Items[i].SubItems[j];
        if bCaseInsensitive then
          ACompareText := lowercase(ACompareText);
        if pos(text,ACompareText)>0 then
        begin
          AListView.ItemIndex := i;
          Result := True;  // Exit(true);  für neuere delphi-Versionen
          Exit;
        end;
      end;
    end;
  finally
    AListView.Items.EndUpdate;
  end;
end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// ListView1 = vsreport
// hideselection = false
//
  if key = #13 then
  begin
    key := #0;
    if not SearchInListView(Edit1.Text,ListView1) then
      ShowMessage('Nix gefunden.');
  end;
end;