Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Live Stichwortsuche (https://www.delphipraxis.net/179275-live-stichwortsuche.html)

Ajintaro 24. Feb 2014 14:06

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:
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;
2 Kleine Probleme gibt es dabei noch:

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

Sir Rufo 24. Feb 2014 14:22

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)

DeddyH 24. Feb 2014 14:34

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:
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;
Ungetestet, hat bestimmt auch noch Optimierungspotential, sollte aber funktionieren.

michaelthuma 24. Feb 2014 15:27

AW: Live Stichwortsuche
 
Ganz habe ich die Frage nicht verstanden.

Lies aus dem IniFile mit
Code:
ReadSectionValues('Delphi', LValues)
um Wertepaare zu erhalten und

greife auf die einzelnen Werte über
Code:
 LValues.Values['Delphi in die Praxis umsetzen']
zu.

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:

Zitat von Ajintaro (Beitrag 1249315)
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


Ajintaro 25. Feb 2014 18:22

AW: Live Stichwortsuche
 
Zitat:

Zitat von Sir Rufo (Beitrag 1249318)
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)

Kann ich denn zur Laufzeit ein dynamisches array mit den Buchstaben aus dem Edit Feld erstellen ? Wenn ich Hallo Welt in das Edit Feld schreibe, besteht mein Array aus 2 Elementen (der Leerschritt trennt die einzelnen Elemente?)
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?

Sir Rufo 25. Feb 2014 19:49

AW: Live Stichwortsuche
 
Ich glaube ja ;)

Nehmen wir doch mal den Text hier
Code:
Delphi in die Praxis umsetzen
und das als Sucheingabe
Code:
Delphi ums
Jetzt prüfen wir ja mit
Delphi-Quellcode:
StrUtils.AnsiContainsText( Zeile, SuchWort )
ob das erste Wort enthalten ist ("Delphi") und ob das zweite Wort enthalten ist ("ums").

Und, was denkst du liefert uns die Funktion jeweils zurück? ;)

Ajintaro 26. Feb 2014 07:38

AW: Live Stichwortsuche
 
Guten Morgen,

Ja
Code:
StrUtils.AnsiContainsText( Zeile, SuchWort )
wird das gewünschte Ergebnis liefern allerdings mache ich mir sorgen um:

Delphi-Quellcode:
Edit.Text
, da das ja kein
Delphi-Quellcode:
Array of string
ist. Ich habe mich gefragt, wie ich zur Laufzeit aus
Delphi-Quellcode:
Edit.Text
ein dynamisches
Delphi-Quellcode:
Array of string
erstelle. Ich weiß ja zu Beginn meiner Eingabe nicht, wie viele Suchbegriffe ich eingeben muss bis die gewünschte Zeile herausgefiltert wird.:?:

Sir Rufo 26. Feb 2014 07:46

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.

user0815 26. Feb 2014 08:38

AW: Live Stichwortsuche
 
Als ich "Tippfehler" gelesen habe, musste ich an den Wikipedia: Levenshtein-Distanz Algorithmus denken.
Hier im Forum: http://www.delphipraxis.net/58685-le...n-distanz.html

Ajintaro 26. Feb 2014 09:14

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:
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;
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf