Listbox und ini Datei mit Filter

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

Listbox und ini Datei mit Filter

Beitragvon matze78 » 22. Jun 2015, 11:18 Listbox und ini Datei mit Filter

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
matze78
 
Beiträge: 4
Registriert: 22. Jun 2015, 11:09

Beitragvon wp_xyz » 22. Jun 2015, 13:54 Re: Listbox und ini Datei mit Filter

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).
wp_xyz
 
Beiträge: 2837
Registriert: 8. Apr 2011, 08:01

Beitragvon matze78 » 22. Jun 2015, 14:51 Re: Listbox und ini Datei mit Filter

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
matze78
 
Beiträge: 4
Registriert: 22. Jun 2015, 11:09

Beitragvon wp_xyz » 22. Jun 2015, 15:48 Re: Listbox und ini Datei mit Filter

- Ö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 23. Jun 2015, 12:09, insgesamt 2-mal geändert.
wp_xyz
 
Beiträge: 2837
Registriert: 8. Apr 2011, 08:01

Beitragvon matze78 » 23. Jun 2015, 09:37 Re: Listbox und ini Datei mit Filter

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 23. Jun 2015, 20:01, insgesamt 1-mal geändert.
Grund: Highlighter
matze78
 
Beiträge: 4
Registriert: 22. Jun 2015, 11:09

Beitragvon wp_xyz » 23. Jun 2015, 12:04 Re: Listbox und ini Datei mit Filter

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);
 
wp_xyz
 
Beiträge: 2837
Registriert: 8. Apr 2011, 08:01

Beitragvon matze78 » 24. Jun 2015, 08:04 Re: Listbox und ini Datei mit Filter

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)
matze78
 
Beiträge: 4
Registriert: 22. Jun 2015, 11:09

Beitragvon wp_xyz » 24. Jun 2015, 17:21 Re: Listbox und ini Datei mit Filter

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.
wp_xyz
 
Beiträge: 2837
Registriert: 8. Apr 2011, 08:01

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried