Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Listbox suche (Live) Buchstabenfolge (https://www.delphipraxis.net/142678-listbox-suche-live-buchstabenfolge.html)

Detrox 1. Nov 2009 15:18


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

mkinzler 1. Nov 2009 15:20

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

Detrox 1. Nov 2009 15:23

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

DeddyH 1. Nov 2009 15:25

Re: Listbox suche (Live) Buchstabenfolge
 
Wieso heißt das Ereignis wohl OnChange?

mkinzler 1. Nov 2009 15:30

Re: Listbox suche (Live) Buchstabenfolge
 
Ich dachte auch eher an den KeyPress-Event

Matze 1. Nov 2009 15:39

Re: Listbox suche (Live) Buchstabenfolge
 
Hast du die Suche bemüht?
Listbox mit einer Suchfunktion durchsuchen?

DeddyH 1. Nov 2009 15:44

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 ^^).

Detrox 1. Nov 2009 16:20

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 :)

DeddyH 1. Nov 2009 16:28

Re: Listbox suche (Live) Buchstabenfolge
 
Zitat:

Zitat von Detrox
..., logich weil ich ja den nicht gelöschten Inhalt wieder in die Listbox einfügen muss.

Das versteh ich nicht. Die Routine löscht ja nur die nicht passenden Einträge heraus, alle anderen bleiben erhalten. Und je länger der Filterstring, desto restriktiver die Filterung.

Detrox 1. Nov 2009 16:33

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.

DeddyH 1. Nov 2009 16:36

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.

Matze 1. Nov 2009 16:37

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)?

Detrox 1. Nov 2009 16:39

Re: Listbox suche (Live) Buchstabenfolge
 
ah ich verstehe, versuch ich mal umzusetzen...


Naja es können schon an die 400 Werden denke ich

DeddyH 1. Nov 2009 16:41

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.

Detrox 1. Nov 2009 16:51

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;

Matze 1. Nov 2009 16:53

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;

Detrox 1. Nov 2009 16:56

Re: Listbox suche (Live) Buchstabenfolge
 
Der sinn dahinter ist, das die aktuellen Listboxeinträge abzüglich der gelöschten den neuen Wert ergeben.

DeddyH 1. Nov 2009 16:58

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]

Detrox 1. Nov 2009 17:05

Re: Listbox suche (Live) Buchstabenfolge
 
Wie bin ich denn drauf :wall:

du hast recht mit

Delphi-Quellcode:
if Suchedit.text='' then
Mailerlistbox.items.text:=Mailerliste
ist es schon getan wenn ich zu beginn den Listboxinhalt speichere.

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:

DeddyH 1. Nov 2009 17:08

Re: Listbox suche (Live) Buchstabenfolge
 
Dann schreib das doch in ein Event des Edits (OnKeyPress oder OnChange).

Detrox 1. Nov 2009 17:10

Re: Listbox suche (Live) Buchstabenfolge
 
steht alles im KeyPress des Edits.

DeddyH 1. Nov 2009 17:11

Re: Listbox suche (Live) Buchstabenfolge
 
Dann schreib es mal ins OnChange, das hat außerdem den Vorteil, dass Du auf die Zwischenablage reagieren kannst.

Matze 1. Nov 2009 17:11

Re: Listbox suche (Live) Buchstabenfolge
 
Guck mal, du hast folgenden Code:

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;
Schöner wäre es übrigens so:

Delphi-Quellcode:
procedure TForm1.SucheditKeyPress(Sender: TObject; var Key: Char);
begin
  if Suchedit.text <> '' then
    Mailerlistbox.Items.Text := Merkliste;
    FilterItems(Mailerlistbox.Items, Suchedit.Text);
end;
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):

Delphi-Quellcode:
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;
Gleiches gilt für deine "then else"-Lösung.

Du kannst es natürlich auch so machen:

Delphi-Quellcode:
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;
Edit: Und richtig, OnChange ist besser geeignet.

Detrox 1. Nov 2009 17:23

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

Detrox 1. Nov 2009 17:32

Re: Listbox suche (Live) Buchstabenfolge
 
So funktionierts

Delphi-Quellcode:
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;
Ich danke euch :)

DeddyH 1. Nov 2009 17:33

Re: Listbox suche (Live) Buchstabenfolge
 
"else" sagt Dir aber etwas? :zwinker:

Detrox 1. Nov 2009 17:38

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:

if blabla = blabla then
  begin
    blabla := blabla;
    muma:=muma end

else
1 Bedingung GEHT
Delphi-Quellcode:

if blabla = blabla then
  begin
    blabla := blabla end

else

DeddyH 1. Nov 2009 17:41

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 06:47 Uhr.

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