Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Mi 08.06.11 16:29 
Folgendes:

Ich habe folgenden Code programmiert mit hilfe von den DelphiTreff Tutorials.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm2.E_ArtikelSucheKeyPress(Sender: TObject; var Key: Char);
var
  i:integer;
  suchstring:string[50];
begin
suchstring:=E_ArtikelSuche.Text;
  for i := 0 to LB_Artikel.Count -1 do
  begin
    if Pos(suchstring, LB_Artikel.Items[i]) > 0 then
    begin
      LB_Artikel.ItemIndex := i;
      break;
    end;
  end
end;


nun möchte ich in meiner Listbox nach etwas suchen, zum Beispiel 512...jetzt soll er bei Eingabe im Edit Feld alle anderen Items ausblenden und nur die Items mit 512 anzeigen.
Wenn ich nun weiter Tippe, also 512MB, soll er mir nur noch die Items mit 512MB anzeigen.

Mache ich jedoch den Text im Edit Feld wieder weg, soll er mir wieder alle Anzeigen, wie kann ich das am Besten Realisieren?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 08.06.11 16:36 
Indem du deine Datenspeicherung von der Anzeige trennst.

D.h. Du hast irgendwo im Hintergrund in einer geeigneten Struktur (z.B. eine ObjectList) deine Daten gespeichert. Und dann kannst du auswählen, welche dieser Daten du in der Listbox angezeigt haben willst.

_________________
We are, we were and will not be.
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 08.06.11 16:38 
evtl. mit ner 2ten Liste ?
deine jetzige Listbox hälst du nur noch im Hintergrund, für die Anzeige nimmst du eine neue,
beim suchen nimmst du aus deiner hintergrundliste alle treffer in deine neue liste und fertig, wenn suche = leer, dann einfach alle aus hintergrundliste in anzeigeliste.

Edit: grmpf, etwas zu spät ...

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 08.06.11 16:41 
Wobei es beim Filtern schneller ist, zwar die Daten im Hintergrund zu halten, aber dennoch bereits die visuellen Knoten vorzuhalten und nur passende sichtbar zu machen.

Das geht mit der TVirtualStringTree sehr gut.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Mi 08.06.11 16:51 
Also, die Listbox1 fülle ich mit daten aus einer Exceltabelle.
Wenn ich nun im suchfeld eingebe, 512, dann wird nur ein item markiert, welches die 512 enthält.

Ich habe mir schon folgende Gedanken gemacht, sagt mir, ob das ein Guter Anfang ist.

mit ListCount die Anzahl der Einträge herausfinden.
in einer Schleife bis zum letzten Item alles zu durchsuchen, was mit 512 zu tun hat.
Nun alle Items in der Listbox1 "entfernen" und die neuen Items, welche 512 enhalten in Listbox1 reinschreiben.
bei einem neuen zeichen wird die liste weiter reduziert.
bis dann nur noch ein Item übrig bleibt...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 08.06.11 16:53 
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
in einer Schleife bis zum letzten Item alles zu durchsuchen, was mit 512 zu tun hat.
Nun alle Items in der Listbox1 "entfernen" und die neuen Items, welche 512 enhalten in Listbox1 reinschreiben.
Wenn, dann umgekehrt, zuerst die ListBox komplett leeren, dann deine Daten durchgehen und alle Einträge hinzufügen, die passen.

Aber wie gesagt: Viel einfacher und schneller geht es mit den VirtualTrees. Auch wenn man sich am Anfang etwas einarbeiten muss.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Mi 08.06.11 16:56 
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 08.06.11 17:01 
Ja, da lernst du wie du damit umgehst. Und dann kannst du einfach die Sichtbarkeit entsprechend setzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  CurrentNode, FirstVisible: PVirtualNode;
begin
  CurrentNode := vstYourList.RootNode.FirstChild;
  FirstVisible := nil;
  while Assigned(CurrentNode) do
  begin
    ... vstYourList.GetNodeData(CurrentNode)^
    vstYourList.IsVisible[CurrentNode] := FilterMatches...;
    if not Assigned(FirstVisible) and vstYourList.IsVisible[CurrentNode] then
      FirstVisible := CurrentNode;
    CurrentNode := CurrentNode.NextSibling;
  end;
  vstYourList.ClearSelection;
  vstYourList.FocusedNode := nil;
  if Assigned(FirstVisible) then
  begin
    vstYourList.Selected[FirstVisible] := True;
    vstYourList.FocusedNode := FirstVisible;
  end;
Das ist so ca. der Standardfiltercode, den ich immer benutze.