Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listbox durchsuchen (https://www.delphipraxis.net/143317-listbox-durchsuchen.html)

Shubit 13. Nov 2009 09:30


Listbox durchsuchen
 
Ich würde gerne eine Listbox durchsuchen, allerdings ohne Items zu löschen oder ein extra Editfeld.
Der Nutzer soll einfach sein Suchwort eintippen und die Listbox springt dann automatisch zum ersten Item dessen String das Suchwort enthält.

Das funktioniert eigentlich auch ganz gut indem man einfach das Suchwort zwischenspeichert und bei jedem OnKeyPress den neuen char hinten anhängt und dann den ItemIndex auf das erste Item setzt dessen String das Suchwort enthält.
Allerdings funkt mir dann immer so ein doofer Automatismus der Listbox dazwischen: Wenn ein Itemstring mit dem gedrückten char beginnt setzt er den ItemIndex automatisch dahin und zwar total unabhängig davon was ich in OnKeyPress, OnKeyDown oder OnKeyUp mache. Kann man das irgendwie abschalten?

DeddyH 13. Nov 2009 11:49

Re: Listbox durchsuchen
 
Ich bin nicht sicher, aber bringt es etwas, wenn Du es mit BeginUpdate und EndUpdate versuchst? Pseudocode:
Delphi-Quellcode:
procedure TDeinForm.ListBoxKeyPress(Sender: TObject; var Key: Char);
begin
  ListBox.Items.BeginUpdate;
  try
    StringVar := StringVar + Key;
    ...
  finally
    ListBox.Items.EndUpdate;
  end;
end;
Wie gesagt, nur eine ungetestete Idee.

toms 13. Nov 2009 11:51

Re: Listbox durchsuchen
 
Delphi-Quellcode:
procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;

Shubit 13. Nov 2009 14:55

Re: Listbox durchsuchen
 
Ok, eigentlich hatte ich das schon durchprobiert, aber wohl nur bei KeyDown und KeyUp weil dort funktioniert es nicht, aber bei OnKeyPress geht es. Danke.

Nelphin 4. Dez 2009 06:36

Re: Listbox durchsuchen
 
Hallo,

ich habe ein ähnliches Problem, deshalb hänge ich es mal hier mit dran.
Ich lade eine datei in eine Listbox mit

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
listbox1.Items.LoadFromFile('G:\Datei.datei');
except
showmessage('laden ging schief');
end;
jetzt muss ich jede zeile der listbox nach einem bestimmten schlüsselwort durchsuchen und wenn dieses vorhanden ist, soll die zeile leben bleiben, wenn nicht kann sie gelöscht werden...

ich habe das so versucht:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
Zeilenzahl:Integer;
i:integer;
kandidat:integer;
begin
Zeilenzahl:=listbox1.items.count;
for i := 0 to Zeilenzahl - 1 do
   begin
     kandidat:= ListBox1.Items.IndexOf('schlüsselwort');
     if kandidat <0 then
      Listbox1.items.delete(i);
   end;
end;
dabei kommt aber nichts vernünftiges raus - vermutlich weil ich in der zeile mit dem indexof es nicht hinbekomme, das er auch nur in der zeile i sucht...

wie ihr merkt kenne ich mich nicht wirklich aus und das ist meine erste tlistbox überhaupt...
über anfängerfreundliche Antworten (leicht verständlich) freue ich mich wie immer sehr!

Gruß

mkinzler 4. Dez 2009 06:40

Re: Listbox durchsuchen
 
IndexOf durchsucht auch die komplette Liste und findet auch nur komplette Zeilen. Du musst also Zeile für Zeile suchen, z.B. mit Pos()

RWarnecke 4. Dez 2009 06:42

Re: Listbox durchsuchen
 
Statt mit IndexOf, würde ich hier mit der Funktion Delphi-Referenz durchsuchenPos oder Delphi-Referenz durchsuchenPosEx arbeiten.

leddl 4. Dez 2009 06:50

Re: Listbox durchsuchen
 
Und tu dir selbst den Gefallen und durchlaufe die ListBox nicht von vorne nach hinten, sondern von hinten nach vorne. ;) Sonst ist die Exception schon vorprogrammiert :zwinker:

mkinzler 4. Dez 2009 06:52

Re: Listbox durchsuchen
 
Da er eigentlich nicht löschen will (
Zitat:

allerdings ohne Items zu löschen
) sollte das egal sein

leddl 4. Dez 2009 06:53

Re: Listbox durchsuchen
 
Zitat:

Zitat von mkinzler
Da er eigentlich nicht löschen will (
Zitat:

allerdings ohne Items zu löschen
) sollte das egal sein

Trink noch nen Kaffee und lies dir den Thread danach nochmal durch :mrgreen:

mkinzler 4. Dez 2009 07:26

Re: Listbox durchsuchen
 
Deshalb gilt hier auch eigentlich: Neue Frage, neuer Thread!

leddl 4. Dez 2009 07:29

Re: Listbox durchsuchen
 
Zitat:

Zitat von mkinzler
Deshalb gilt hier auch eigentlich: Neue Frage, neuer Thread!

Deshalb gilt hier eigentlich vor allem: erstmal lesen vor dem Posten :zwinker:
(Sorry, den konnte ich mir nicht verkneifen :duck:)

Nelphin 6. Dez 2009 12:32

Re: Listbox durchsuchen
 
Zitat:

Zitat von mkinzler
Deshalb gilt hier auch eigentlich: Neue Frage, neuer Thread!

ok ich werds beherzigen :) - dachte weil ich in fremden threads so oft gelesen hab: "benutz doch die suche" soll man wenn ein verwandter thread schon existiert diesen benutzen.

Ich sage mal danke und zeige meine derzeitige Lösung:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
Zeilenzahl:Integer;
i:integer;
kandidat:integer;
a:integer;
begin
a:=0;
Zeilenzahl:=listbox1.items.count;
for i := 0 to Zeilenzahl-1 do
   begin
     kandidat:= pos('suchwort',listbox1.Items[i]);
     if kandidat <> 0 then
     begin
       listbox2.items[a]:=copy(listbox1.Items[i],0,100);
       a:=a+1;
     end;

   end;

end;
das mit der rückwärtslaufenden schleife zum löschen hab ich nicht so hinbekommen, aber fürs erste kann ich damit leben.

danke nochmal...

leddl 6. Dez 2009 14:05

Re: Listbox durchsuchen
 
Zitat:

Zitat von Nelphin
das mit der rückwärtslaufenden schleife zum löschen hab ich nicht so hinbekommen, aber fürs erste kann ich damit leben.

Solange du beim Durchlauf nichts löschst, ist das auch nicht weiter schlimm ;)
Solltest du es mal brauchen, die Syntax ist dann wie folgt:
Delphi-Quellcode:
for i := maxvalue downto 0 do

sx2008 6. Dez 2009 14:13

Re: Listbox durchsuchen
 
Man könnte der Listbox auch die Message LB_SELECTSTRING schicken und Windows die Arbeit überlassen.
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 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