Listbox und ini Datei mit Filter
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
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
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) > 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).
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
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
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, 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:
- Für jede Section, d.h. Eintrag in dieser StringList, lese die zugehörigen Zeilen in eine zweite Item-Stringliste ein (ini.ReadSection(sectionStringList, 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.
Re: Listbox und ini Datei mit Filter
Oha das klingt schon komplizierter...
Mein bisheriger Code..
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..
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;
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
Grund: Highlighter
Re: Listbox und ini Datei mit Filter
Hab oben ein Codebeispiel ergänzt. Es wird angenommen, dass lediglich die Sections gefiltert werden sollen.matze78 hat geschrieben:Oha das klingt schon komplizierter...
Handarbeit:matze78 hat geschrieben:wie kann ich die eckigen Klammern ausblenden?
Code: Alles auswählen
Delete(sectionname, 1,1);
Delete(sectionname, Length(sectionname), 1);
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)
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)
Re: Listbox und ini Datei mit Filter
Wird als "AFilter" an die Prozedur übergeben, die ein paar Posts weiter oben enthalten ist.matze78 hat geschrieben:Wo setzte ich bei deinem Codebeispiel den Suchtext ein (wonach im tstring gesucht werden soll)
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.matze78 hat geschrieben:Zeichen ersetzen funktioniert nun so...
sl.Text := StringReplace(sl.Text,']','',[rfReplaceAll]);