TListViewFilterEdit

Rund um die LCL und andere Komponenten
Antworten
BerlinerBaer
Beiträge: 16
Registriert: Sa 9. Jan 2021, 15:07
OS, Lazarus, FPC: Windows (L 2.0.10 FPC 3.2.0)
CPU-Target: 32/64Bit

TListViewFilterEdit

Beitrag von BerlinerBaer »

Hallo Freunde des Lazarus.

In Common Controls kann man TListViews der Form hinzufügen. Ich habe diesbezüglich eine Suchfunktion mit zwei For-Schleifen. Einmal für Caption und einmal für die SubItems. Die Suche funktioniert, jedoch nicht so, wie ich es mir vorgestellt habe. Dennoch reicht es "erstmal" aus.

Nun habe ich, worauf ich eigentlich hinaus will, unter LazControls TListViewFilterEdit entdeckt. Ich dachte: Hey, ich denke, das ist genau das, was ich brauche. Ein Filter.
Ich setzte die Komponente ein, und aktivierte auch den Verweis zur ListView. Getestet, doch meine ListView wurde nach dem Setzen des ersten Zeichens leer. Also setzte ich mich nun intensiver damit auseinander. Die Wiki-Seite sagte nur, dass es das gibt.

Soweit mir meine Englischkennntnisse verraten, funktioniert eine Filterung nicht auf herkömmliche Art und Weise, sondern die Datensätze müssen in TListViewFilterEdit.Items aufgerufen werden.
his control can filter a ListView. Properties:

FilteredListView -- must be assigned to the desired TListView control either at design time or run time.

Data should be added to TListViewFilterEdit.Items, not to the container ListView.

ToDo...

You can also attach a filter to a ListView which contains existing data. Then the existing items are copied to the filter's items initially.
Gibt es irgendwie, irgendwo und nicht irgendwann ein Tutorial dazu? Oder irgendetwas, wo man sich diesbezüglich belesen kannn? Vorzugsweise auf deutsch.

https://wiki.freepascal.org/LazControls ... FilterEdit

Grüße aus Berlin
Die deutsche Rechtschreibung ist Freeware. Man darf sie kostenlos nutzen. Allerdings ist sie nicht Open Source. Das heißt, sie darf weder verändert, noch in veränderter Form veröffentlicht werden.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TListViewFilterEdit

Beitrag von theo »

Ein Tutorial gibt es dazu wahrscheinlich nicht. Das ist ist so eine kleine Ergänzung, die afaik in der IDE verwendet wird.
You can also attach a filter to a ListView which contains existing data. Then the existing items are copied to the filter's items initially.
Wenn du mit dem Designer Daten in die ListView geschrieben hast, sollte es diese automatisch übernehmen.

Ansonsten müsstest du vielleicht konkreter fragen, bzw. beschreiben was nicht klappt, dann könnte jemand vielleicht auch konkreter antworten.

Mit Property "ByAllFields"=true filtert er anscheinend auch in Untereinträgen.

BerlinerBaer
Beiträge: 16
Registriert: Sa 9. Jan 2021, 15:07
OS, Lazarus, FPC: Windows (L 2.0.10 FPC 3.2.0)
CPU-Target: 32/64Bit

Re: TListViewFilterEdit

Beitrag von BerlinerBaer »

Hallo theo,

danke für eine Antwort.

Ich hole mir die Daten aus der Datenbank und schicke diese an die unten stehende Procedure (Kategorien). Dadurch wird meine ListView mit den zuvor ausgegeben Daten befüllt. Das klappt wie erwartet.

Code: Alles auswählen

procedure Kategorien (KatID, KatName, KatBeschreibung : String);
var
  item : TListItem;
begin
  item:=FormMain.LVKat.Items.Add;
  item.Caption:=KatID;
  item.SubItems.Add(KatName);
  item.SubItems.Add(KatBeschreibung);
end;
Jetzt setze ich in FormMain einfach die Komponente ListViewFilterEdit1 ins Formular, setze den Verweis: FilteredListView auf LVKat und folge der Anweisung, die du gegeben hast. Also AllByField auf True.

Und rufe ich die Form auf, die ListView wird befüllt. So klappt alles. Gebe ich nun etwas in den Filter ein, ist die ListView leer. Lösche ich den Inhalt des Filters, so bleibt die ListView weiterhin leer.

Schade, dass es dafür kein Tutorial oder andere Informationen gibt.
Die deutsche Rechtschreibung ist Freeware. Man darf sie kostenlos nutzen. Allerdings ist sie nicht Open Source. Das heißt, sie darf weder verändert, noch in veränderter Form veröffentlicht werden.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TListViewFilterEdit

Beitrag von theo »

Aber du hast ja oben selber zitiert, dass die Daten nach ListViewFilterEdit1.Items und nicht direkt ins ListView gehen müssen.

Code: Alles auswählen

item:=ListViewFilterEdit1.Items.Add;   
Hast du das denn auch gemacht?

BerlinerBaer
Beiträge: 16
Registriert: Sa 9. Jan 2021, 15:07
OS, Lazarus, FPC: Windows (L 2.0.10 FPC 3.2.0)
CPU-Target: 32/64Bit

Re: TListViewFilterEdit

Beitrag von BerlinerBaer »

Hallo theo

wenn ich dein Vorschlag übernehme, verlangt er TListViewDateItem.
listviewfilteredit.pas(147,14) Error: Found declaration: Add(const TListViewDataItem):LongInt;

Code: Alles auswählen

procedure Kategorien (KatID, KatName, KatBeschreibung : String);
var  
  item : TListViewFilterEdit; 
begin
  item:=FormMain.LVKatFilter.Items.Add;
  item.Caption:=KatID;
  item.SubItems.Add(KatName);
  item.SubItems.Add(KatBeschreibung);
end;
Selbst wenn ich anspasse, kommen Fehlermeldungen. Er bekommt ein String, akzeptiert aber nur "TListViewDataItem".

Code: Alles auswählen

procedure Kategorien (KatID, KatName, KatBeschreibung : String);
begin
  FormMain.LVKatFilter.Items.Add(KatID);
  FormMain.LVKatFilter.Items.Add(KatName);
  FormMain.LVKatFilter.Items.Add(KatBeschreibung);
end;
Und wenn ich dem item den Typ "TListViewDataItem" im oberen Beispiel zuweise, kommt uDatenbank.pas(54,17) Error: Incompatible types: got "TFPGList<ListViewFilterEdit.TListViewDataItem>" expected "TListViewDataItem"

Vielleicht sollte ich erwähnen, dass meine ListView (LVKat) auf vsReport gestellt ist.

Was mir jedoch aufgefallen ist, wenn ich der ListView zuvor per Objektinspektor Items erstelle, dann funktioniert der Filter.
Die deutsche Rechtschreibung ist Freeware. Man darf sie kostenlos nutzen. Allerdings ist sie nicht Open Source. Das heißt, sie darf weder verändert, noch in veränderter Form veröffentlicht werden.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TListViewFilterEdit

Beitrag von theo »

Dann fülle das ListView zuerst normal und hänge dann den ListViewFilterEdit ein, wie hier beschrieben:
https://forum.lazarus.freepascal.org/in ... #msg235194
Vor dem erneuten Füllen wieder aushängen..
Also z.B.

Code: Alles auswählen

var
  item: TListItem;
  i: integer;
begin
  ListViewFilterEdit1.FilteredListview := nil;  //Aushöngen
  ListViewFilterEdit1.items.Clear;
  ListViewFilterEdit1.Clear;
  for i := 0 to 10 do
  begin
    item := ListView1.Items.Add;
    item.Caption := 'KatID' + IntToStr(i);
    item.SubItems.Add('KatName' + IntToStr(i));
    item.SubItems.Add('KatBeschreibung' + IntToStr(i));
  end;
  ListViewFilterEdit1.FilteredListview := ListView1; //Einhängen
end;      
Wenn das auch nicht geht, probiere VirtualStringTree.

BerlinerBaer
Beiträge: 16
Registriert: Sa 9. Jan 2021, 15:07
OS, Lazarus, FPC: Windows (L 2.0.10 FPC 3.2.0)
CPU-Target: 32/64Bit

Re: TListViewFilterEdit

Beitrag von BerlinerBaer »

Danke theo,

Code: Alles auswählen

var
  item: TListItem;
begin
  ListViewFilterEdit1.FilteredListview := nil;  //Aushöngen
  ListViewFilterEdit1.items.Clear;
  ListViewFilterEdit1.Clear;

  item := ListView1.Items.Add;
  item.Caption := KatID;
  item.SubItems.Add(KatName);
  item.SubItems.Add(KatBeschreibung);

  ListViewFilterEdit1.FilteredListview := ListView1; //Einhängen
end;
Bei der Schleife fügt er die entsprechende Zahl mit hinzu. Die Schleife habe ich damit entfernt, und es funktioniert.
Das erspart mir eine ganze Menge arbeit und ersetzt somit meine alte, unübersichtliche und nicht effektive Suchfunktion:

Code: Alles auswählen

var
  i, j : Integer;
  SuchTitel, SuchInhalt, SuchBegriff, Zeile : String;
begin
  // ##########################
  // Kategorien durchsuchen #####

  Self.MIKatUebersichtClick(Self);

  SuchTitel:='Kategorie durchsuchen';
  SuchInhalt:='Nach welchen Kategorien soll gesucht werden?';

  // Variablen aus der Eingabeaufforderung (InputQuery) laden.
  InputQuery(SuchTitel, SuchInhalt, SuchBegriff);
  // Vorhandene Auswahl (Selection) entfernen und Mehrfachauswahl (Multiselect) aktivieren.
  LVKat.ClearSelection;
  LVKat.MultiSelect:=True;

  // Suchfunktion ausführen.
  if UTF8LowerString(SuchBegriff) <> '' then
    begin
      for i:=0 to pred(LVKat.Items.Count) do
        for j:=0 to pred(LVKat.Items[i].SubItems.Count) do
          begin
            Zeile:=UTF8LowerString(LVKat.Items.Item[i].SubItems[j]);
            if UTF8Pos(UTF8LowerString(SuchBegriff), Zeile) > 0 then
              begin
                LVKat.SetFocus;
                LVKat.Items[i].Selected:=True;
              end;
          end;
    end;
  // Mehrfachauswahl wieder deaktivieren.
  LVKat.MultiSelect:=False;  
end;
Ich danke dir vielmals.
Die deutsche Rechtschreibung ist Freeware. Man darf sie kostenlos nutzen. Allerdings ist sie nicht Open Source. Das heißt, sie darf weder verändert, noch in veränderter Form veröffentlicht werden.

Antworten