![]() |
Listbox suche (Live) Buchstabenfolge
HuHu,
Ich melde mich wieder mal mit ner kleinen Frage.. Und zwar möchte ich in einer Listbox suchen, das stellt ja kein Problem dar, aber ich möchte nicht nach einem Eintarg suchen, sondern nach zusammenhängenden Buchstaben . Ich habe ein Editfeld und einen Timer der soll die Buchstaben überprüfen die ich eingebe und in der Listbox alle anderen Einträge entfernen. Ich hoffe ihr wisst wie ich das meine LG Detrox |
Re: Listbox suche (Live) Buchstabenfolge
Eventuell gibt es schon fertige ListBoxen die das unterstützen Ich würde hierbei aber nicht mit einem Timer arbeiten, sondern bei Eingabe reagieren
|
Re: Listbox suche (Live) Buchstabenfolge
Ja da hast du recht bei Eingabe ist wahrscheinlich Resourcenschonender, da stellt sich mir aber die Frage das zu realisieren, es gibt zwar ein Change Ereigniss, aber das wird ja nicht nach jedem Zeichen was ich schreibe ausgeführt oder?!
Zur Komponente, ich möchte das Programm so schlank wie möglich halten , wenn es gute Listboxenkomponenten gibt kannst du villeicht mal ein Beispiel nennen? LG Detrox |
Re: Listbox suche (Live) Buchstabenfolge
Wieso heißt das Ereignis wohl OnChange?
|
Re: Listbox suche (Live) Buchstabenfolge
Ich dachte auch eher an den KeyPress-Event
|
Re: Listbox suche (Live) Buchstabenfolge
|
Re: Listbox suche (Live) Buchstabenfolge
Ich wusste gar nicht mehr, dass ich das schon einmal geschrieben hatte :oops:. Bin ich wohl doch härter auf die Birne gefallen als ich dachte (oder es liegt am Alter ^^).
|
Re: Listbox suche (Live) Buchstabenfolge
Deddy , danke für den thread :)
Der Code leuchtet ein
Delphi-Quellcode:
uses StrUtils;
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; aber funktioniert halt nicht im onKeyPress, logich weil ich ja den nicht gelöschten Inhalt wieder in die Listbox einfügen muss. Nur habe ich keine AHnung wie, villeicht ein kleiner Denkansatz , würde mich freuen :) |
Re: Listbox suche (Live) Buchstabenfolge
Zitat:
|
Re: Listbox suche (Live) Buchstabenfolge
Ja ist richtig, aber ich lösche ja auch Buchstaben wenn ich mich Beispielsweise verschreibe, also muss ich irgendwie an die nicht gelöschten Items kommen.
|
Re: Listbox suche (Live) Buchstabenfolge
Die nicht gelöschten stehen ja noch drin :mrgreen:. Ich denke, Du meinst die bereits gelöschten. Wie ich im zitierten Thread bereits angedeutet hatte, muss man sich die "Original-Items" dann halt in einer internen TStringlist auf Vorrat halten und kann dann ggf. resetten.
|
Re: Listbox suche (Live) Buchstabenfolge
Du kannst auch die StringList in die ListBox kopieren und bei der Eingabe leerst du die ListBox, läuft die StringList durch und fügst die passenden Einträge hinzu. Dann ist egal, ob du Buchstaben löscht oder hinzufügst.
Umgekehrt geht's natürlich auch: Die ListBox vorm Filtern komplett füllen und dann entsprechend die Einträge löschen. In welcher Größenordnung befinden wir uns denn, was die Anzahl der Einträge betrifft (wegen der Performance)? |
Re: Listbox suche (Live) Buchstabenfolge
ah ich verstehe, versuch ich mal umzusetzen...
Naja es können schon an die 400 Werden denke ich |
Re: Listbox suche (Live) Buchstabenfolge
Das ist ja nicht sooo viel. Wenn Du BeginUpdate und EndUpdate einsetzt, sollte das in adäquater Zeit zu machen sein.
|
Re: Listbox suche (Live) Buchstabenfolge
SO klappt ganz gut, nur irgendwie hat es einen kleinen haken, es ist schwierig zu erklären, also wenn ich jetzt etwas lösche dan wird auch geupdatet, nur nicht ganz richtig mal ein Beispiel:
Einträge: Wolf Motte Wohnung Molle Ich schreibe: Mo .... passiert nix erst wenn ich jetzt noch einmal irgednetwas eingebe dann wird gefiltert.
Delphi-Quellcode:
procedure FilterItems(const sl: TStrings; const substr: string);
var i: integer; begin sl.BeginUpdate; Merkliste:=Form1.MailerListbox.Items.Text; Form1.Mailerlistbox.Items.Text:=Merkliste; try for i := Pred(sl.Count) downto 0 do if not StrUtils.AnsiContainsText(sl[i],substr) then sl.Delete(i); finally sl.EndUpdate; end;
Delphi-Quellcode:
procedure TForm1.SucheditKeyPress(Sender: TObject; var Key: Char);
begin if Suchedit.text='' then else Mailerlistbox.Items.Text:=Merkliste; FilterItems(Mailerlistbox.Items,Suchedit.Text); end; |
Re: Listbox suche (Live) Buchstabenfolge
Ohne den Rest des Codes durchgeschaut zu haben: Was ist denn der Sinn dahinter?
Delphi-Quellcode:
Merkliste:=Form1.MailerListbox.Items.Text;
Form1.Mailerlistbox.Items.Text:=Merkliste; |
Re: Listbox suche (Live) Buchstabenfolge
Der sinn dahinter ist, das die aktuellen Listboxeinträge abzüglich der gelöschten den neuen Wert ergeben.
|
Re: Listbox suche (Live) Buchstabenfolge
Der steht doch anschließend sowieso in der Listbox.
[edit] Noch einmal zum generellen Vorgehen: Du befüllst Deine Listbox, erstellst Dir eine Stringliste und weist dieser die Items der Listbox zu. Wenn nun gefiltert werden soll, leerst Du die Listbox und fügst die passenden Einträge aus der Stringliste ein. Da Du Dir das Original ja gemerkt hast, kannst Du das beliebig oft wiederholen, ohne dass Dir ursprüngliche Einträge verloren gehen. [/edit] |
Re: Listbox suche (Live) Buchstabenfolge
Wie bin ich denn drauf :wall:
du hast recht mit
Delphi-Quellcode:
ist es schon getan wenn ich zu beginn den Listboxinhalt speichere.
if Suchedit.text='' then
Mailerlistbox.items.text:=Mailerliste Nur ne kleine Macke hats noch lösche ich alles bis nichts mehr im Edit steht, dann muss ich noch 1 mal auf löschen klicken bis die Liste wieder drinn ist. (vielleicht muss ich auf die Löschtaste separat reagieren) :roll: |
Re: Listbox suche (Live) Buchstabenfolge
Dann schreib das doch in ein Event des Edits (OnKeyPress oder OnChange).
|
Re: Listbox suche (Live) Buchstabenfolge
steht alles im KeyPress des Edits.
|
Re: Listbox suche (Live) Buchstabenfolge
Dann schreib es mal ins OnChange, das hat außerdem den Vorteil, dass Du auf die Zwischenablage reagieren kannst.
|
Re: Listbox suche (Live) Buchstabenfolge
Guck mal, du hast folgenden Code:
Delphi-Quellcode:
Schöner wäre es übrigens so:
procedure TForm1.SucheditKeyPress(Sender: TObject; var Key: Char);
begin if Suchedit.text='' then else Mailerlistbox.Items.Text:=Merkliste; FilterItems(Mailerlistbox.Items,Suchedit.Text); end;
Delphi-Quellcode:
Ich vermute, die beiden Anweisungen nach dem "else" sollen nur ausgeführt werden, wenn der String leer ist, also fehlen hier "begin" und "end (oder auch nicht, wenn es so gewollt ist):
procedure TForm1.SucheditKeyPress(Sender: TObject; var Key: Char);
begin if Suchedit.text <> '' then Mailerlistbox.Items.Text := Merkliste; FilterItems(Mailerlistbox.Items, Suchedit.Text); end;
Delphi-Quellcode:
Gleiches gilt für deine "then else"-Lösung.
procedure TForm1.SucheditKeyPress(Sender: TObject; var Key: Char);
begin if Suchedit.text <> '' then begin Mailerlistbox.Items.Text := Merkliste; FilterItems(Mailerlistbox.Items, Suchedit.Text); end; end; Du kannst es natürlich auch so machen:
Delphi-Quellcode:
Edit: Und richtig, OnChange ist besser geeignet.
procedure TForm1.SucheditKeyPress(Sender: TObject; var Key: Char);
begin if Suchedit.text = '' then // fülle die ganze ListBox else begin Mailerlistbox.Items.Text := Merkliste; FilterItems(Mailerlistbox.Items, Suchedit.Text); end; end; |
Re: Listbox suche (Live) Buchstabenfolge
Ja funzt, aber das alte Problem, wenn ich den letzten Buchstabe lösche, dann macht er das nochmal durch und danach müsste er es nochmal machen macht er aber nicht. logich, denn ich lösche den letzten Buchstaben den erkennt er noch als bedingung und die '' bedingung wird nicht aufgerufen
|
Re: Listbox suche (Live) Buchstabenfolge
So funktionierts
Delphi-Quellcode:
Ich danke euch :)
procedure TForm1.SucheditChange(Sender: TObject);
begin if Suchedit.text <> '' then begin Mailerlistbox.Items.Text := Mailerliste; FilterItems(Mailerlistbox.Items, Suchedit.Text); end; if Suchedit.text = '' then Mailerlistbox.Items.Text := Mailerliste; end; |
Re: Listbox suche (Live) Buchstabenfolge
"else" sagt Dir aber etwas? :zwinker:
|
Re: Listbox suche (Live) Buchstabenfolge
DeddyH gut das du das ansprichst, da ich da immer ein problem habe und das dann sos chreibe wie du es da siehst.
also wenn zwei Sachen eintreten kann ich kein else mehr schreiben da spinnt mein Delphi rum. 2 Bedingungen GEHT NICHT
Delphi-Quellcode:
1 Bedingung GEHTif blabla = blabla then begin blabla := blabla; muma:=muma end else
Delphi-Quellcode:
if blabla = blabla then begin blabla := blabla end else |
Re: Listbox suche (Live) Buchstabenfolge
Sicher, dass Du keinen anderen Fehler machst? So wie beschrieben sollte das eigentlich immer gehen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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