Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Suchen in TListView! (https://www.delphipraxis.net/31060-suchen-tlistview.html)

TheMiller 3. Okt 2004 17:36


Suchen in TListView!
 
Hai!

Ich brächte ein wenig Hilfe, bei der Suchfunktion in einer ListView, die auf vsReport steht. Ich habe zuvor noch nie mit Suchfunktionen gearbeitet. Aber es ist immer irgendwann mal das "erste Mal" ;-)

Also, ich hatte schon eine Funktion, aber die reagierte nur, wenn das Wort exakt in der Liste steht, wie in dem Suchfeld. Damit meine ich die Groß-und-Kleinschreibung.

Außerdem fand er nichts, wenn ich nach dem Wort "AA" suchte und in einer Spalte "AA BB" drin stand.

Bitte helft mir! :wall:

CalganX 3. Okt 2004 17:45

Re: Suchen in TListView!
 
Hi,
es würde doch reichen, wenn du durch die ListView gehst und jeden Eintrag prüfst. Und ob etwas darin vorkommt, kannst du mit Delphi-Referenz durchsuchenpos und Delphi-Referenz durchsuchenAnsiLowerCase bzw. Delphi-Referenz durchsuchenAnsiUperCase überprüfen. ;)

Chris

TheMiller 3. Okt 2004 17:49

Re: Suchen in TListView!
 
Ok

das werde ich mal alles probieren. Wenn ich nicht zurecht komme, dann werde ich euch nochmal anstacheln, mir zu helfen :)

Danke!

alcaeus 3. Okt 2004 17:50

Re: Suchen in TListView!
 
Hi DJ-SPM,

ungetesteter Code:
Delphi-Quellcode:
procedure SucheText(SuchText: String);
var
  bMatch: Boolean;
  NewItem: TListItem;
  i, j: Integer;
begin
  for i := 0 to ListView1.Items.Count-1 do
  begin
    with ListView1.Items[i] do
    begin
      bMatch := False;
      if Pos(LowerCase(Suchtext),LowerCase(Caption)) > 0 then
        bMatch := True;
      for j := 0 to SubItems.Count-1 do
      begin
        if Pos(LowerCase(Suchtext),LowerCase(SubItems[j])) > 0 then
          bMatch := True;
      end;
      if bMatch then
      begin
        NewItem := ListView2.Items.Add;
        NewItem.Caption := Caption;
        for j := 0 to SubItems.Count-1 do
          NewItem.SubItems.Add(SubItems[j]);
      end;
    end;
  end;
end;
Erklärung: Der Code durchsucht alle Items und deren SubItems, und wenn der Suchbegriff enthalten ist (nicht case sensitive), so wird das Item in ListView2 hinzugefügt.

Greetz
alcaeus

PS: Code wurde nicht getestet oder compiliert.

[edit]da waren keine fehler im code[/edit]

TheMiller 3. Okt 2004 17:53

Re: Suchen in TListView!
 
Respekt :shock:

Danke vielmals. Werde aber erstmal versuchen, mit den von Chakotay genannten Begriffen zurecht zu kommen, bzw sie mir erstmal ansehen und dann deinen Code nachvollziehen... Finde ich Klasse. Danke!

TheMiller 3. Okt 2004 18:12

Re: Suchen in TListView!
 
Sorry, aber deine Funktion liefert eine Zugriffsverletzung zurück. Kann auch sein, dass es mein Fehler ist... Habe den Code so verändert:

Delphi-Quellcode:
procedure TForm2.SucheText(SuchText: String);
var
  bFound: Boolean;
  [b]bMatch: Boolean;[/b]
  NewItem: TListItem;
  [b]i,j:Integer;[/b]
begin
  for i := 0 to [b]Form2.ListView1.Items.Count-1[/b] do
  begin
    with Form2.ListView1.Items[i] do
    begin
      bMatch := False;
      if Pos(LowerCase(Suchtext),LowerCase(Caption)) > 0 then
        bMatch := True;
      for j := 0 to SubItems.Count-1 do
      begin
        if Pos(LowerCase(Suchtext),LowerCase(SubItems[j])) > 0 then
          bMatch := True;
      end;
      if bMatch then
      begin
       Form2.ListView1.ItemFocused.Caption:=SuchText;
    end;
  end;
 end;
end;
und dies ist mein Aufruf:

Delphi-Quellcode:
SucheText(Finddialog1.FindText);
Habe ich da was falsch gemacht? :gruebel:

Robert_G 3. Okt 2004 19:11

Re: Suchen in TListView!
 
Ich hätte es etwas allgemeiner geschrieben. (Vielleicht willst du ja auch in einem anderen LV suchen ;) )
Als Ergenis gibt's ein array of TListItem :
Delphi-Quellcode:
type UglyHelperType = array of TListItem;
  ...

function FindItems(aLV: TListView; const aSuchText: string;
                   aCaseSensitive: boolean): UglyHelperType;
var
  bMatch: Boolean;
  NewItem: TListItem;
  i, j, FoundItems: Integer;

  (* nested functions *)
  // getting an Item to the resultset
  procedure Add2Result(aLVI: TListItem);
  begin
    if FoundItems >= High(result) then
      setLength(result, FoundItems + 50);

    result[FoundKeys] := aLVI;
    inc(FoundLKeys);
  end;

  function Equals(const aString, aSearchWord): boolean;
  begin
    if aCaseSensitive then
      result := (Pos(LowerCase(aSearchWord), LowerCase(aString)) > 0)
    else
      result := (Pos(aSearchWord, aString) > 0);
  end;
end;
begin
  FoundKeys := 0;
  setLength(result, 50);

  for i := 0 to pred(aLV.Items.Count) do
    with aLV.Items[i] do
    begin
      bMatch := Equals(aSuchText, Caption);

      if not bMatch then
        for j := 0 to pred(SubItems.Count) do
        begin
          bMatch := Equals(aSuchText, SubItems[j]);
          if bMatch then
            Break();
        end;

      if bMatch then
        Add2Result(aLV.Items[i]);
    end;

  if FoundKeys > 0 then
    setLength(result, FoundKeys);
end;
Zitat:

Zitat von DJ-SPM
Habe ich da was falsch gemacht?

Scheint so...
Denn woher willst du wissen, dass es ein selektiertes Item im 2. LV gibt?
Zitat:

Zitat von DJ-SPM
Delphi-Quellcode:
      if bMatch then
      begin
       Form2.ListView1.ItemFocused.Caption:=SuchText;

Außerdem macht das so keinen Sinn. Du würdest doch bei 5 gefundenen Items immer wieder das _GLEICHE_ im 2. LV ändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz