Listbox und ini Datei mit Filter

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
matze78
Beiträge: 4
Registriert: Mo 22. Jun 2015, 12:09

Listbox und ini Datei mit Filter

Beitrag von matze78 »

HAllo Community,

lese eine ini per ini.ReadSections(ListBox1.Items); in Listbox.

Aufbau ini

[Variante 1]
Zahl1=test

[Variante 2]
Zahl1=test2

[Station 1]
Zahl1=test3

Ich hääte gern die Möglichkeit per edit Feld einen Suchbegriff eizugeben um dann die Listbox zu filtern.

Angenommen ich kenne nur ein Teil des Sectionname z.b *Var* nun soll die Listbox alle Einträge mit Variante anzeigen.

Suchbegriff *Var*

Listbox Ergebniss

Variante1
Variante2

Danke vorab...

Gruß
Matthias

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Listbox und ini Datei mit Filter

Beitrag von wp_xyz »

Du lädst die ini-Datei in eine Stringliste (StringList.LoadFromFile(...)), gehst diese vom Ende her Eintrag für Eintrag durch (for i := StringList.Count-1 downto 0) und prüfst, ob dein Filterausdruck vorkommt (if (pos(Filterausdruck, StringList[i]) > 0). Wenn nicht, löschst du den Eintrag aus der Stringliste (StringList.Delete(i)). Zum Schluss wird die gefilterte Stringliste den Items der Listbox zugewiesen (Listbox.Items.Assign(StringList)) und - ganz zum Schluss - freigegeben (StringList.Free).

matze78
Beiträge: 4
Registriert: Mo 22. Jun 2015, 12:09

Re: Listbox und ini Datei mit Filter

Beitrag von matze78 »

Danke für die Tipps---

Hat funktioniert.

Gibt es noch die Möglichkeit anstatt den Sectionname - einzelne Werte anzuzeigen.

[Variante 1]
Zahl1=Test
Zahl2=Test1

[Variante 2]
Zahl1=Test3
Zahl2=Test4





Ausgabe in Listbox

Test Test1
Test2 Test3

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Listbox und ini Datei mit Filter

Beitrag von wp_xyz »

- Öffne die Ini-Datei und lese die Namen der Sections in eine StringList ein (ini.ReadSections(sectionStringList)).
- Für jede Section, d.h. Eintrag in dieser StringList, lese die zugehörigen Zeilen in eine zweite Item-Stringliste ein (ini.ReadSection(sectionStringList[i], itemStringlist).
- Hole die Werte aus den ItemStringlist-Einträgen (ItemStringlist.ValueFromIndex[..]) und baue daraus einen String.
- Dieser wird an die Items der zuvor geleeren Listbox angehängt.

Etwa so, ungtestet:

Code: Alles auswählen

 
procedure TForm1.FilterIniSection(AFilter: String);
var
  ini: TIniFile;
  sectionList: TStringList;
  itemList: TStringList;
  i, j: Integer;
  s: String;
begin
  // Listbox löschen
  Listbox1.Items.Clear;
  // benötigten Objekte erzeugen
  sectionList := TStringList.Create;
  itemList := TStringList.Create;
  ini := TIniFile.Create('test.ini');
  try
    // Sections einlesen
    ini.ReadSections(sectionList);   
    for i:=0 to sectionList.Count-1 do begin
      // Sections, die nicht den Filterstring enthalten, übergehen
      if pos(AFilter, sectionList[i]) = 0 then 
        continue;
      // Zeilen, die zur Section gehören, einlesen
      ini.ReadSection(sectionList[i], itemList)
      // "value" (=Teil nach dem = Zeichen) zu String zusammenbauen
      s := '';
      for j:=0 to itemList.Count-1 do
        s := s + ' ' + itemList.ValueFromIndex[j]
      // Gesamtstring an die Listbox anhängen
      Listbox1.Items.Add(s);   
    end;
  finally
    // Benötigte Objekte aufräumen
    ini.Free;
    itemList.Free;
    sectionList.Free;
  end;
end;
Zuletzt geändert von wp_xyz am Di 23. Jun 2015, 13:09, insgesamt 2-mal geändert.

matze78
Beiträge: 4
Registriert: Mo 22. Jun 2015, 12:09

Re: Listbox und ini Datei mit Filter

Beitrag von matze78 »

Oha das klingt schon komplizierter...

Mein bisheriger Code..

Code: Alles auswählen

  sl: TStringList;
         SearchText: string;
         i: integer;
begin
 
 
    sl := TStringList.Create;
      sl.LoadFromFile('test.ini');
 
 
 
      SearchText := Edit1.Text;
 ListBox1.Items.Clear;
for i := 0 to sl.Count - 1 do
   if  (Pos(SearchText , sl[i]) > 0) then begin
     ListBox1.Items.Add(sl[i]);
           end;
 
                    end;     


Dabei gleich die Frage, wie kann ich die eckigen Klammern ausblenden? Mit - StringReplace funktioniert es nicht.

Für die zweite Option, habe ich leider keinen Lösungsansatz als Code..
Zuletzt geändert von Lori am Di 23. Jun 2015, 21:01, insgesamt 1-mal geändert.
Grund: Highlighter

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Listbox und ini Datei mit Filter

Beitrag von wp_xyz »

matze78 hat geschrieben:Oha das klingt schon komplizierter...

Hab oben ein Codebeispiel ergänzt. Es wird angenommen, dass lediglich die Sections gefiltert werden sollen.

matze78 hat geschrieben:wie kann ich die eckigen Klammern ausblenden?

Handarbeit:

Code: Alles auswählen

 
  Delete(sectionname, 1,1);
  Delete(sectionname, Length(sectionname), 1);
 

matze78
Beiträge: 4
Registriert: Mo 22. Jun 2015, 12:09

Re: Listbox und ini Datei mit Filter

Beitrag von matze78 »

Danke.

Zeichen ersetzen funktioniert nun so...

sl.Text := StringReplace(sl.Text,']','',[rfReplaceAll]);

Wo setzte ich bei deinem Codebeispiel den Suchtext ein (wonach im tstring gesucht werden soll)

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Listbox und ini Datei mit Filter

Beitrag von wp_xyz »

matze78 hat geschrieben:Wo setzte ich bei deinem Codebeispiel den Suchtext ein (wonach im tstring gesucht werden soll)

Wird als "AFilter" an die Prozedur übergeben, die ein paar Posts weiter oben enthalten ist.

matze78 hat geschrieben:Zeichen ersetzen funktioniert nun so...
sl.Text := StringReplace(sl.Text,']','',[rfReplaceAll]);

Und warum so kompliziert? Du weißt doch, dass die eckigen Klammern das erste und letzte Zeichen des Strings sein müssen, daher reicht es, wie oben gezeigt, das 1. und letzte Zeichen des Strings zu löschen, anstatt per StringReplace die Klammern erst zu suchen.

Antworten