![]() |
Live Stichwortsuche
Hallo DP,
Ich habe folgende ini-Datei erstellt: [Delphi] Delphi in die Praxis umsetzen=Jederzeit Delphi in die Tat umsetzen=Aber sicher Was ist Delphi eigentlich=Schön Mein Name ist Borland=Nicht wirklich Folgender Code bietet eine Art live-suche mit Filter:
Delphi-Quellcode:
procedure FilterItems(const sl: TStrings; const substr: string);
var i: integer; begin sl.BeginUpdate; try for i := Pred(sl.Count) downto 0 do if not StrUtils.AnsiContainsText(sl[i],substr) then sl.Delete(i); finally sl.EndUpdate; end; end;
Delphi-Quellcode:
2 Kleine Probleme gibt es dabei noch:
procedure TForm1.e_inputChange(Sender: TObject);
begin if e_input.text <> '' then begin FilterItems(Listbox1.Items, e_input.Text); end; if e_input.text = '' then begin mif.ReadSectionValues(ComboBox1.Text, Listbox1.items); end; end; a) Tippt man Delphi in das Editfeld, werden richtigerweise die ersten drei Einträge angezeigt: ... Delphi in die Praxis umsetzen=Jederzeit Delphi in die Tat umsetzen=Aber sicher Was ist Delphi eigentlich=Schön ... Wenn ich nun als 2. Wort umsetzen eintippe, sollten nur noch die ersten beiden Einträge sichtbar sein: ... Delphi in die Praxis umsetzen=Jederzeit Delphi in die Tat umsetzen=Aber sicher ... Das klappt leider noch nicht ganz. Muss ich das gefilterte Ergebnis erneut durchsuchen? b) Sobald man einen Tippfehler macht und ein Wort wieder aus dem Editfeld löscht, wird das bis dahin gefilterte Ergebnis nicht mehr angezeigt. Kann man das mit einer Hilfs-Stringlist umgehen ? Und noch eine Frage bezüglich ini-Dateien: Gibt es eine ini-funktion, welche den Key und die Section getrennt lesen kann? Ich würde gerne beide Werte getrennt in einem Editfeld darstellen. Bisher habe ich aber immer nur den VALUE Wert über den KEY ausgelesen. Vielen Dank, Jaimy |
AW: Live Stichwortsuche
Du musst nach jedem Suchwort einzeln suchen. Dazu musst du aber auch vorher den Suchtext in einzelne Worte auftrennen und dann der Suchroutine übergeben (z.B. als Array)
|
AW: Live Stichwortsuche
Und Du wirst schon 2 Stringlisten brauchen, wenn Du nicht nach jedem Verkleinern des Filters alles neu abrufen willst. Ich denke da an so etwas (Sir Rufos Vorschlag gleich mit übernommen):
Delphi-Quellcode:
Ungetestet, hat bestimmt auch noch Optimierungspotential, sollte aber funktionieren.
procedure FilterItems(const SrcList, DestList: TStrings; const substr: array of string);
var Line, SearchwordIndex: integer; Containing: Boolean; begin Assert(Assigned(SrcList), 'Keine gültige Quellliste'); Assert(Assigned(DestList), 'Keine gültige Zielliste'); DestList.BeginUpdate; try DestList.Clear; for Line := 0 to SrcList.Count - 1 do begin Containing := true; for SearchwordIndex := Low(substr) to High(substr) do if not AnsiContainsText(SrcList[Line], substr[SearchwordIndex]) then begin Containing := false; break; end; if Containing then DestList.Add(SrcList[Line]); end; finally DestList.EndUpdate; end; end; |
AW: Live Stichwortsuche
Ganz habe ich die Frage nicht verstanden.
Lies aus dem IniFile mit
Code:
um Wertepaare zu erhalten und
ReadSectionValues('Delphi', LValues)
greife auf die einzelnen Werte über
Code:
zu.
LValues.Values['Delphi in die Praxis umsetzen']
Andere umständliche Variante wäre. Lade die IniFile in eine TMemIniFile Instanz und lösche die nicht benötigten Sections raus und anschließend den Eintrag für die Section selbst.
Delphi-Quellcode:
LMemIniFile.EraseSection('Another');
LMemIniFile.GetStrings(LStrList); (* Hier den Section Eintrag '['Delphi']' löschen*) Zitat:
|
AW: Live Stichwortsuche
Zitat:
Was ist, wenn das 2. Wort noch nicht vollständig ausgeschrieben ist, aber die Filterfunktion schon mit dem bisher eingegebenen Buchstaben bereits lossuchen soll ? Oder denk ich viel zu kompliziert? |
AW: Live Stichwortsuche
Ich glaube ja ;)
Nehmen wir doch mal den Text hier
Code:
und das als Sucheingabe
Delphi in die Praxis umsetzen
Code:
Jetzt prüfen wir ja mit
Delphi ums
Delphi-Quellcode:
ob das erste Wort enthalten ist ("Delphi") und ob das zweite Wort enthalten ist ("ums").
StrUtils.AnsiContainsText( Zeile, SuchWort )
Und, was denkst du liefert uns die Funktion jeweils zurück? ;) |
AW: Live Stichwortsuche
Guten Morgen,
Ja
Code:
wird das gewünschte Ergebnis liefern allerdings mache ich mir sorgen um:
StrUtils.AnsiContainsText( Zeile, SuchWort )
Delphi-Quellcode:
, da das ja kein
Edit.Text
Delphi-Quellcode:
ist. Ich habe mich gefragt, wie ich zur Laufzeit aus
Array of string
Delphi-Quellcode:
ein dynamisches
Edit.Text
Delphi-Quellcode:
erstelle. Ich weiß ja zu Beginn meiner Eingabe nicht, wie viele Suchbegriffe ich eingeben muss bis die gewünschte Zeile herausgefiltert wird.:?:
Array of string
|
AW: Live Stichwortsuche
Indem du den string durch einen kleinen Parser schickst?
Jedesmal wenn du auf ein Whitespace-Zeichen (Trenner für Worte) triffst, dann wird das Wort an das Array gehängt. |
AW: Live Stichwortsuche
Als ich "Tippfehler" gelesen habe, musste ich an den Wikipedia:
![]() Hier im Forum: ![]() |
AW: Live Stichwortsuche
Ich bin gerade dabei den "Parser" zu erstellen, welcher mir während der Editfeld-Eingabe ein Array erstellt. Das Leerzeichen soll als Trenner dienen.
Ich hab das Array auf 3 Elemente limitiert, da ich davon ausgehen kann dass man nach 3 Wörtern den gewünschten Eintrag herausfiltern kann.
Delphi-Quellcode:
Das funktioniert natürlich nur bis zum 1. Leerschritt, beim 2. knallts. Ich vermute mal da werde ich Pos und PosEx bemühen müssen um mir die Whitespace zu merken?
procedure TForm1.e_inputChange(Sender: TObject);
var i:integer; my_arr: Array[1..3] of String; begin if e_input.text <> '' then begin //Nicht leer for i := 1 to length(e_input.text) do begin if e_input.text[i] = ' ' then begin //add to array my_arr[i] := e_input.Text; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz