![]() |
Suchfunktion <> Listbox ?
hallo,
wie kann man eigentlich eine suchfunktion für eine listbox coden, ich meine wenn ich nach einen bestimmten wort suchen will ? mfg vader |
Re: Suchfunktion <> Listbox ?
Wenn das wort in dem listbox eintrag vorkommen kann, etwa so:
Delphi-Quellcode:
Falls der Listboxeintrag gleich dem suchwort ist, würdest du das
var i: integer;
Wort: string; begin for i:=0 to ListBox.Items.Count-1 do begin if pos(Wort,ListBox.Items[i])>0 then //ergebnise auflisten o.ä. end; end;
Delphi-Quellcode:
(ungetestet)
pos(Wort,ListBox.Items[i])>0
{ersetzen durch} ListBox.Items[i]=Wort |
Re: Suchfunktion <> Listbox ?
Ähm... per Schleife alle EInträge durchgehen und vergleichen? :roll:
|
Re: Suchfunktion <> Listbox ?
Hi vader,
welche Art von Suche stellst du dir vor? Locate (prefix search und markieren des ersten passenden Eintrags) oder Select (auswählen aller passenden Einträge, evtl. regex search). Soll der Suchbegriff extern vorgegeben werden (eigenes edit control) oder über key codes in der listbox erkannt werden? Grüße vom marabu |
Re: Suchfunktion <> Listbox ?
hi,
wenn das suchwort 1:1 in der listbox vorkommt würde auch das gehen:
Delphi-Quellcode:
if ListBox1.Items.IndexOf('blub') > -1 then
// gefunden |
Re: Suchfunktion <> Listbox ?
hallo marabu,
suche die (prefix search und markieren des ersten passenden Eintrags) methode ? mfg vader |
Re: Suchfunktion <> Listbox ?
hallo,
ich stelle mir eine suchfunktion so vor wie bei vielen progs wo ein neues fenster aufmacht und dort man das wort eingibt das was man suchen will ! mfg vader |
Re: Suchfunktion <> Listbox ?
Hi vader,
es gibt viele Möglichkeiten, hier ist eine:
Delphi-Quellcode:
Wenn sich der Inhalt von der ListBox nie ändert, dann könntest du die Übernahme der Items in die Stringlist (zum vereinfachten Suchen) bereits im FormCreate() und sl zu einer private Variablen der Form machen.
interface
type TDemoForm = class(TForm) ListBox: TListBox; PrefixEdit: TEdit; procedure FormCreate(Sender: TObject); procedure PrefixEditChange(Sender: TObject); end; implementation procedure TDemoForm.PrefixEditChange(Sender: TObject); var sl: TStringList; index: integer; begin sl := TStringList.Create; sl.Sorted := ListBox.Sorted; with ListBox do begin sl.Assign(Items); sl.Find(PrefixEdit.Text, index); if (PrefixEdit.Text <> '') and (index >= 0) and (index < sl.Count) and (AnsiUppercase(Copy(sl[index], 1, Length(PrefixEdit.Text))) = AnsiUppercase(PrefixEdit.Text)) then ItemIndex := index else ItemIndex := -1; end; sl.Free; end; Statt des Feldes PrefixEdit kannst du auch mit InputQuery() arbeiten. Kommst du zurecht? marabu |
Re: Suchfunktion <> Listbox ?
hallo marabu,
ganz komme ich nicht zurecht, den code habe ich ohne fehler compilieren können aber wenn ich jetzt ein wort in das editfeld eingeben und den code ausführe passiert nichts ? ich kann deinen code nicht ganz interpredieren, sollt bei deinen code das gesuchte wort in der listbox makiert sein wenn es gefunden wurde ??? mfg vader |
Re: Suchfunktion <> Listbox ?
Richtig - sobald ein passender Präfix eingegeben wurde wird das übereinstimmende Item in der ListBox markiert. Um Umsetzungsfehler auszuschließen und die korrekte Funktionsweise zu sehen könntest du einfach mal ein Leerprojekt anlegen, auf dem sich nur die beiden Controls befinden, wobei du über den Object Inspector ein paar Items in die ListBox eingeben solltest.
Viel Glück, marabu Ich gehe jetzt kurz mal den Rasen sprengen KRAWOOOM (das ist jetzt ohne Bezug zu der gerade laufenden Revolution) |
Re: Suchfunktion <> Listbox ?
hallo marabu,
im leerproject funzt es mit ein paar eingaben, wenn ich aber in meinem prog was suche da makiert er nichts !!! mfg vader |
Re: Suchfunktion <> Listbox ?
Wie kann ich dir da weiter helfen?
marabu |
Re: Suchfunktion <> Listbox ?
hallo
hab die eine PN geschickt mit meinen project ich hoffe es ist angekommen ! mfg vader |
Re: Suchfunktion <> Listbox ?
Sagen wir mal so - du hast es probiert. Angekommen ist bei mir nichts.
marabu |
Re: Suchfunktion <> Listbox ?
hallo
jetzt muß es geklappt haben ! mfg vader |
Re: Suchfunktion <> Listbox ?
Hai Vader,
noch eine kleine Idee für die Suche. Wenn Du kein extra Feld für die Suche möchtest könntest Du auch mit einem Timer und einer extra Variablen arbeiten um in der Listbox zu suchen wenn diese den Focus besitzt. Wenn also jemand ein "C" drückt wird zum ersten Eintrag gesprungen der mit "C" anfängt. Wenn er jetzt innerhalb einer bestimmten Zeitspanne (dafür der Timer) einen weiteren Buchstaben drückt wird dieser zu den vorhandenen hinzugefügt und es wird "weiter gesprungen" |
Re: Suchfunktion <> Listbox ?
Hi Vader,
deine ListBox ist unsortiert - die von mir verwendete Methode Find() funktioniert nur mit sortierten Strings. Das Vorgehen bei unsortierten Strings demonstriert Button2:
Delphi-Quellcode:
Grüße vom marabu
procedure MarkFirstLine(lb: TListBox; const prefix: string);
var i: integer; s: TStrings; begin s := lb.Items; lb.ItemIndex := -1; for i := 0 to s.Count - 1 do if (AnsiUppercase(Copy(s[i], 1, Length(prefix))) = AnsiUppercase(prefix)) then begin lb.ItemIndex := i; if lb.MultiSelect then lb.Selected[i] := true; Exit; end; end; procedure TForm1.Button1Click(Sender: TObject); var sl: TStringList; index: integer; begin sl := TStringList.Create; sl.Sorted := ListBox1.Sorted; with ListBox1 do begin sl.Assign(Items); // funktioniert nur wenn sl.Sorted = true sl.Find(Edit1.Text, index); if (Edit1.Text <> '') and (index >= 0) and (index < sl.Count) and (AnsiUppercase(Copy(sl[index], 1, Length(Edit1.Text))) = AnsiUppercase(Edit1.Text)) then ItemIndex := index else ItemIndex := -1; end; sl.Free; end; procedure TForm1.Button2Click(Sender: TObject); begin MarkFirstLine(ListBox1, Edit1.Text); end; |
Re: Suchfunktion <> Listbox ?
hallo,
herzlichendank es funzt !!! mfg vader |
Re: Suchfunktion <> Listbox ?
hallo,
kann ich die suchfunktion auch auf eine neue form platzieren, so wie das bei den meisten programmen ist, wo über den menüpunkt "bearbeiten-suchen " ein neues fenster geöffnet wird und dort dann den suchbegriff eingibt ? wie muß ich die beiden units oder forms verbinden ? mfg vader |
Re: Suchfunktion <> Listbox ?
Hi vader,
klar kannst du. Zitat:
Delphi-Quellcode:
Grüße vom marabu
var
searchText: string; begin searchText := '42'; // Initialisierung if InputQuery('Suchen nach', 'Suchtext', searchText) and (searchText <> '') then begin // dein Code für die Suche nach searchText end; end; |
Re: Suchfunktion <> Listbox ?
hallo marabu,
das check ich nicht mit "InputQuery()" ? // dein Code für die Suche nach searchText usw...... ? mfg vader |
Re: Suchfunktion <> Listbox ?
Im einfachsten Fall dann so:
Delphi-Quellcode:
marabu
procedure TForm1.SearchButtonClick(Sender: TObject);
var searchText: string; begin searchText := '42'; // Initialisierung if InputQuery('Suchen nach', 'Suchtext', searchText) and (searchText <> '') then begin MarkFirstLine(ListBox1, searchText); end; end; |
Re: Suchfunktion <> Listbox ?
hallo
das funktioniert zwar mit dem pos aber der findet bei uns nur den eintrag aus zeile 1. woran könnte das liegen? mfg alex |
Re: Suchfunktion <> Listbox ?
Pos liefert die Position der ersten Fundstelle zurück . Verwende PosEx um die Suche an dieser Stelle als Offset fortzusetzten.
|
Re: Suchfunktion <> Listbox ?
Zitat:
denn PosEx sucht ab dem Index, welcher angegeben wird und wenn man den Index angibt, wo vorher was gefunden wurde, dann findet PosEx ja immer wieder das Alte und nicht das danach.
Code:
i := Pos(Wort, ListBox.Items[i]);
While i > 0 do Begin ... // i = Index des Gefundenen i := PosEx(Wort, ListBox.Items[i], i [b]+ 1[/b]); End; |
Re: Suchfunktion <> Listbox ?
Beitrag #23 war vermutlich ein Irrläufer - aber trotzdem:
Delphi-Quellcode:
Grüße vom marabu
function FindCount(s: TStrings; const subStr: String): Integer;
var i, iPos: Integer; begin Result := 0; for i := 0 to Pred(s.Count) do begin iPos := Pos(subStr, s[i]); while iPos > 0 do begin Inc(Result); iPos := PosEx(subStr, s[i], iPos + Length(subStr)); end; end; end; |
Re: Suchfunktion <> Listbox ?
Na, um die Codes noch zu vervollständigen ... mit dem aus der CodeLib und .Text geht's och :mrgreen:
Code-Library -> Object-Pascal / Delphi-Language > ![]()
Delphi-Quellcode:
Anzahl := CountString(searchText, StringList.Text);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 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