Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Wörterbuch Datei (https://www.delphipraxis.net/142209-woerterbuch-datei.html)

DeddyH 25. Okt 2009 18:38

Re: Wörterbuch Datei
 
Dann musst Du eben nachschauen, ob der gesuchte String enthalten ist. Sei doch mal etwas kreativ.

Delphi-Narr 25. Okt 2009 19:18

Re: Wörterbuch Datei
 
Delphi-Quellcode:
var
i:integer;
SL:TStringlist   ;
Position:integer;
begin
     ListeD.Clear;
     ListeE.Clear;
     Sl:=TStringlist.Create;
     SL.LoadFromFile('C:\Users\Neu.txt');
     for i:=0 to SL.Count-1 do
         begin
              if Odd(i)=False then begin
              Position:=Pos(SucheD.text,SL[i]);
              if Position<>0 then begin
                 ListeD.Items.Add(SL[i]);
                 ListeE.Items.Add(SL[i+1]);
              end;
              end;
         end;      
end;
Klappt bisher ganz gut - dauert nur ewig lange... Kann ich den Suchvorgang im Hintergrund laufen lassen, sodass man etwas neues eingeben kann, während gesucht wird? Oder den Suchvorgang beschleunigen?
Und dann noch eine Sache: Wenn man im linken Feld scrollt, soll im rechten ebenfalls gescrollt werden, damit man nicht in der Zeile verrutscht. ->erledigt

olee 25. Okt 2009 19:37

Re: Wörterbuch Datei
 
Also erstmal solltest du bitte mal an deiner Code-formatierung arbeiten :roll:

Und um deine Frage zu beantworten kuck mal das an: Application.ProcessMessages

Der Code unten enthält diese Anwendung.

WICHTIG: Es ist nicht ratsam, diese Anweisung nach jedem Schleifendurchlauf aufzurufen, da sonst deine Suchfunktion bestimmt mal 10fach so lange dauert,
da ProcessMessages je nach Situation einiges an Zeit verbrät.

Deswegen ist die Bedingung (i mod 1000) = 0 drin, die dafür sorgt, das ProcessMessages nur alle 1000 Durchläufe aufgerufen wird ... das sollte mehr als genug sein.

Delphi-Quellcode:
var
  i       : integer;
  SL      : TStringlist;
  Position : integer;
begin
  ListeD.Clear;
  ListeE.Clear;
  Sl:=TStringlist.Create;
  SL.LoadFromFile('C:\Users\Lennart\Desktop\Vokabeltrainer Sonja\Datafiles\cfmdoffsfm-80141116124-9u69a\Neu.txt');
  for i := 0 to SL.Count-1 do
  begin
    if Odd(i) = False then
    begin
      Position:=Pos(SucheD.text,SL[i]);
      if Position<>0 then
      begin
        ListeD.Items.Add(SL[i]);
        ListeE.Items.Add(SL[i+1]);
      end;
    end;
    If (i mod 1000) = 0 then Application.ProcessMessages;
  end;      
end;
MFG

himitsu 25. Okt 2009 20:41

Re: Wörterbuch Datei
 
Was sind ListeD und ListeE eigentlich?

Womöglich sollte man da man über BeginUpdate/EndUpdate nachdenken.

olee 25. Okt 2009 20:50

Re: Wörterbuch Datei
 
Ich denke das sind die Listbox-Felder für die Ergebnisse.

MFG

Delphi-Narr 25. Okt 2009 20:52

Re: Wörterbuch Datei
 
Die Listen sind Listboxes, ListeD ist die, wo die Deutschen Wörter drinstehen und die andere die mit den Englischen

Also ich möchte, dass OnChange gesucht wird, also beim verändern die aktuelle Suche beendet wird und dafür die neue gestartet wird - mit einem Buchstaben mehr.

Also:

H ->Suche wird gestartet
Dann WÄHREND der Suche noch das a
Suche nach H wird abgebrochen und mit Ha neu gestartet usw. Selbst wenn ich ProcessMessages alle 2 mal durchlaufe, klappt das nicht...

Kann man die Prozeduren nicht irgendwie parallel laufen lassen, sodass ich was eingeben kann (und nicht 5 Sekunden warten muss, bis sich was tut) und der gleichzeitig sucht?

himitsu 25. Okt 2009 22:29

Re: Wörterbuch Datei
 
Das Application.ProcessMessages mach ich nie von einer Anzahl mit unbestimmter Zeiabhängig.
Dafür merke ich mir die Startzeit (GetTickCount) und führe dann alle x Millisekunden (100 bis 200) dieses aus.
Dort kann man dann auch mitbekommen, ob sich die Startbedingung geändert hat und beginnt die Suche von Neuem.

Abgesehn davon würde ich diese Liste noch parallel mit einer Index-Hashliste versehn oder, da man hier schön Alphabetisch sortieren kann, alles auf meherere Sublisten verteilen, so daß ich nicht immer alles durchsuchen muß.

olee 26. Okt 2009 12:44

Re: Wörterbuch Datei
 
Du solltest das dann so machen, dass in der Suchschleife das zu suchende wort sich in jedem durchlauf aus dem editfeld geholt wird.

Außerdem sollte nicht nachdem man einen weiteren Buchstaben ins Feld eingibt, sofort die ganze Suche neu gestartet werden, sondern eben
a) Die momentan laufende angepasse (siehe oben)
b) Die bisher gefundenen Einträge gefiltert werden (wenn der neu eingegebene Buchstabe bisherige Ergebnisse ausschließt)

Das solltest du mit ein wenig Nachdenken lösen können

MFG

Delphi-Narr 26. Okt 2009 13:23

Re: Wörterbuch Datei
 
Das mit den bisherigen Ergebnissen filtern hatte ich auch schon überlegt, aber der braucht ja 20 Sekunden, bis er die Suche nach 'H' abgeschlossen hat.
Wenn ich nach 5 Sekunden 'a' drücke, dann sind die Suchergebnisse der letzten 15 Sekunden nicht dabei und der durchsucht nur die bisherigen Funde... Mit dem alphabetisch sortieren guck ich mir mal an...

Wäre es eventuell sinnvoll, die Liste am Anfang einmal zu laden, sodass nicht bei jeder Veränderung eine Liste mir 28000000 Zeichen und 1,5 Mio Zeilen laden muss?!

himitsu 26. Okt 2009 13:46

Re: Wörterbuch Datei
 
Zitat:

Zitat von Delphi-Narr
aber der braucht ja 20 Sekunden,

hast du den Tipp auf Delphi-Referenz durchsuchenBeginUpdate/Delphi-Referenz durchsuchenEndUpdate beachtet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.
Seite 4 von 5   « Erste     234 5      

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