Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suchfunktion <> Listbox ? (https://www.delphipraxis.net/52810-suchfunktion-listbox.html)

Vader 4. Sep 2005 15:33


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

emteg 4. Sep 2005 15:39

Re: Suchfunktion <> Listbox ?
 
Wenn das wort in dem listbox eintrag vorkommen kann, etwa so:
Delphi-Quellcode:
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;
Falls der Listboxeintrag gleich dem suchwort ist, würdest du das
Delphi-Quellcode:
pos(Wort,ListBox.Items[i])>0
{ersetzen durch}
ListBox.Items[i]=Wort
(ungetestet)

malo 4. Sep 2005 15:40

Re: Suchfunktion <> Listbox ?
 
Ähm... per Schleife alle EInträge durchgehen und vergleichen? :roll:

marabu 4. Sep 2005 15:54

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

NicNacMan 4. Sep 2005 16:02

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

Vader 4. Sep 2005 17:32

Re: Suchfunktion <> Listbox ?
 
hallo marabu,

suche die (prefix search und markieren des ersten passenden Eintrags) methode ?

mfg vader

Vader 4. Sep 2005 17:39

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

marabu 4. Sep 2005 18:08

Re: Suchfunktion <> Listbox ?
 
Hi vader,

es gibt viele Möglichkeiten, hier ist eine:

Delphi-Quellcode:
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;
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.

Statt des Feldes PrefixEdit kannst du auch mit InputQuery() arbeiten.

Kommst du zurecht?

marabu

Vader 4. Sep 2005 18:33

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

marabu 4. Sep 2005 18:40

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)

Vader 4. Sep 2005 19:05

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

marabu 4. Sep 2005 19:14

Re: Suchfunktion <> Listbox ?
 
Wie kann ich dir da weiter helfen?

marabu

Vader 4. Sep 2005 19:39

Re: Suchfunktion <> Listbox ?
 
hallo

hab die eine PN geschickt mit meinen project ich hoffe es ist angekommen !

mfg vader

marabu 4. Sep 2005 19:49

Re: Suchfunktion <> Listbox ?
 
Sagen wir mal so - du hast es probiert. Angekommen ist bei mir nichts.

marabu

Vader 4. Sep 2005 20:03

Re: Suchfunktion <> Listbox ?
 
hallo

jetzt muß es geklappt haben !


mfg vader

Sharky 4. Sep 2005 20:11

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"

marabu 4. Sep 2005 21:25

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:
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;
Grüße vom marabu

Vader 5. Sep 2005 13:16

Re: Suchfunktion <> Listbox ?
 
hallo,

herzlichendank es funzt !!!
mfg vader

Vader 6. Sep 2005 08:10

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

marabu 6. Sep 2005 09:51

Re: Suchfunktion <> Listbox ?
 
Hi vader,

klar kannst du.

Zitat:

Statt des Feldes PrefixEdit kannst du auch mit InputQuery() arbeiten.
Delphi-Quellcode:
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;
Grüße vom marabu

Vader 6. Sep 2005 11:04

Re: Suchfunktion <> Listbox ?
 
hallo marabu,

das check ich nicht mit "InputQuery()"

? // dein Code für die Suche nach searchText usw...... ?

mfg vader

marabu 6. Sep 2005 12:05

Re: Suchfunktion <> Listbox ?
 
Im einfachsten Fall dann so:

Delphi-Quellcode:
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;
marabu

alexkoe 10. Mär 2006 09:23

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

mkinzler 10. Mär 2006 10:11

Re: Suchfunktion <> Listbox ?
 
Pos liefert die Position der ersten Fundstelle zurück . Verwende PosEx um die Suche an dieser Stelle als Offset fortzusetzten.

himitsu 10. Mär 2006 10:29

Re: Suchfunktion <> Listbox ?
 
Zitat:

Zitat von mkinzler
Verwende PosEx um die Suche an dieser Stelle als Offset fortzusetzten.

An der Stelle danach, ;)
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;

marabu 10. Mär 2006 11:44

Re: Suchfunktion <> Listbox ?
 
Beitrag #23 war vermutlich ein Irrläufer - aber trotzdem:

Delphi-Quellcode:
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;
Grüße vom marabu

himitsu 10. Mär 2006 15:48

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 > (Teil)String in anderem String suchen/zählen > CountString


Delphi-Quellcode:
Anzahl := CountString(searchText, StringList.Text);


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