AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Live Stichwortsuche

Ein Thema von Ajintaro · begonnen am 24. Feb 2014 · letzter Beitrag vom 27. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#1

Live Stichwortsuche

  Alt 24. Feb 2014, 15:06
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
Jaimy
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Live Stichwortsuche

  Alt 24. Feb 2014, 15:22
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.454 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Live Stichwortsuche

  Alt 24. Feb 2014, 15:34
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
michaelthuma
(Gast)

n/a Beiträge
 
#4

AW: Live Stichwortsuche

  Alt 24. Feb 2014, 16:27
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*)
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

Geändert von michaelthuma (24. Feb 2014 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#5

AW: Live Stichwortsuche

  Alt 25. Feb 2014, 19:22
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?
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Live Stichwortsuche

  Alt 25. Feb 2014, 20:49
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 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?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#7

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 08:38
Guten Morgen,

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

Edit.Text , da das ja kein Array of string ist. Ich habe mich gefragt, wie ich zur Laufzeit aus Edit.Text ein dynamisches 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.
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 08:46
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 09:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#10

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 10:14
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?
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.
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