ListItem ein- und ausblenden
Hallo!
Ich stehe vor einem ähnlichen Problem wie bei dem Thema TAdvListView oder TListview Inhalt filtern, wollte aber alten Thread nicht wieder aufleben lassen... Über eine Abfrage auf einer MS Access-Datenbank wird ein ListView gefüllt. Der Inhalt dieses ListView soll nun über eine Eingabemaske (ein TEdit) gefiltert werden können. Wird also z. B. ein 'k' eingetippt, sollen nur noch ListItems zu sehen sein, die in Caption ein 'k' oder 'K' haben. Löscht man das 'k' wieder aus dem Edit sollen auch wieder alle Einträge in der ListView sichtbar sein. Natürlich würde sich da eine entsprechend modifizierte Abfrage der Datenbank geradezu anbieten, nur leider ist die Sache dann (bei großer Anzahl Datensätze) viel zu langsam. Denn zuerst muss der Inhalt des ListViews komplett gelöscht werden, die Abfrage ausgeführt und übertragen und anschließend der Inhalt wieder in den ListView geschrieben werden, wobei die Abfrage (da aus vielen Tabellen erstellt) den größten zeitlichen Aufwand hält. Da eine Änderung der Datenbank (zumindest momentan) keine Option ist, spiele ich mit dem Gedanken den ListView zum Filtern zu Missbrauchen. Mein Versuch mit CustomDrawItem die Zeilen zu beeinflussen hat allerdings nicht den erwarteten Effekt:
Delphi-Quellcode:
Zwar geht es recht schnell, doch hinterlassen die ausgeblendeten Zeilen Platz, sodass Lücken im ListView entstehen statt einer gekürzten Liste.
procedure TForm.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin DefaultDraw:= (Edit1.Text='') or (Pos(Edit1.Text,Item.Caption)>0); end; Was mache ich falsch? Oder kennst jemand eine bessere Lösung ListItems auszublenden? Gruß e-gon |
AW: ListItem ein- und ausblenden
Ich würde sehr zu einer TVirtualStringTree raten:
http://www.soft-gems.net/index.php/c...rtual-treeview Abgesehen davon, dass die um Größenordnungen schneller ist, was man gerade bei Filteroperationen usw. sehr braucht, kennt die auch schon direkt die Möglichkeit einen Eintrag ein- oder auszublenden. Da brauchst du gar nicht selbst zeichnen oder irgendetwas. |
AW: ListItem ein- und ausblenden
Wenn man clientseitig eine Liste der Datensätze vorhält (TClientDataset oder etwas eigenes, völlig egal), dann kann man doch auch clientseitig einfach filtern. Man könnte z.B. eine Filterfunktion mit Callback deklarieren, dann könnte das z.B. so aussehen:
Delphi-Quellcode:
type
TMatchFunc = function(SomeElement: TListElement): Boolean; procedure TIrgendwas.Filter(MatchFunc: TMatchFunc); var i: integer; Item: TListItem; begin ListView.Items.BeginUpdate; try ListView.Items.Clear; for i := 0 to Liste.Count - 1 do if Assigned(MatchFunc) and MatchFunc(Liste[i]) then begin Item := ListView.Items.Add; Item.Caption := Liste[i].SomeStringProperty; (* etc. pp. *) end; finally ListView.Items.EndUpdate; end; end; |
AW: ListItem ein- und ausblenden
Danke für die schnellen Antworten!
@DeddyH: Die Idee ist nicht schlecht. Doch der zeitliche Aufwand für das Löschen und erneute Schreiben im TreeView wäre dann immer noch nötig. @jaenicke: Delphi 6 scheint nicht oder nur bedingte Unterstützt zu sein. Vielleicht sollte ich beim Ausblenden die Zeilenhöhe auf 0 stellen... Gruß e-gon |
AW: ListItem ein- und ausblenden
Wieviele Items wären das denn im Schnitt? Wenn man BeginUpdate/EndUpdate benutzt, sind nach meiner Erfahrung ein paar Tausend kein großes Problem. Du kannst es ja einfach mal versuchen, so groß ist der Tippaufwand ja nicht ;)
|
AW: ListItem ein- und ausblenden
Zitat:
Zitat:
|
AW: ListItem ein- und ausblenden
Eine ListView im Virtualmode ist dafür doch geeignet. Filtern geht dabei in Echtzeit.
|
AW: ListItem ein- und ausblenden
Dann benutzt man die Listview eben virtuell.
|
AW: ListItem ein- und ausblenden
Zitat:
|
AW: ListItem ein- und ausblenden
Hier ist ein Beispiel (bei den Delphi-Demos ist aber IIRC auch eins dabei).
|
AW: ListItem ein- und ausblenden
Zitat:
Gut, man benutzt dafür nur die Standardkomponente, aber ist das so wichtig? |
AW: ListItem ein- und ausblenden
Hast Du eigentlich ein generelles Problem mit anderer Leute Meinung? Ich will ja nichts gegen den VST sagen, das ist eine super Komponente, aber man muss sich auch da erst einmal einarbeiten und hat recht viel Code zu tippen.
|
AW: ListItem ein- und ausblenden
Zitat:
Zitat:
Hinzufügen eines Eintrags ist eine Zeile Code. Genau wie bei einer virtuellen ListView. NodeDataSize muss man setzen. Eine Zeile mehr, geht aber auch im Objektinspektor. OnGetText muss man implementieren. Das gilt für die TListView mit OnData aber auch. Insgesamt ähnelt sich die Menge an Code sehr. Bei der VirtualTree muss ich nun aber nur durchgehen und kann einfach mit IsVisible umschalten welche Knoten sichtbar sind. Das ist sehr viel weniger Aufwand als alles neu zu befüllen oder ähnliches und ist obendrein auch viel schneller. |
AW: ListItem ein- und ausblenden
Zitat:
- Mit Bordmitteln zu arbeiten, also keine extra Komponente, - kein extra Einarbeiten, - kein potentielles Einstellen des Supports (was macht Mike Lischke eigentlich heute?) - keine potentiellen versteckten Fehler, die so mancher Freewarekomponente zueigen ist sondern einfach: die paar Zeilen hinschmeißen und fertig. Zitat:
Zitat:
Also nochmal: Wenn jemand einen anderen Vorschlag macht, ohne ihn zu begründen, dann ist der erst einmal gleichwertig. Wenn *Du* Dir dabei nichts denken kannst, dann ist das *dein* Defizit, was bedauerlich, aber eben temporär. Edit: Das Durchlaufen durch eine VST, um die Knoten sichtbar/unsichtbar zu machen, ist nicht gerade im Sinne des Viewmodel-Gedankens, das nur mal am Rande. Das ist es doch viel einfacher, im Viewmodel eine Liste der sichtbaren Items zu erstellen, das im virtuellen Modus an die TListView zu flanschen und fertig (geht vermutlich auch mit VST). Wenn man allerdings Zeit hat, mit dem Layout rumzuspielen, ist eine VST generell vorzuziehen. |
AW: ListItem ein- und ausblenden
Hallo!
Ich habe das ganze nun mit einem virtuellen ListView realisiert. VirtualTree wäre bestimmt auch gut geeignet gewesen und ich hätte auch nicht davor zurückgeschreckt eine weitere Komponente einzubinden, das Ko-Kriterium war allerdings dass VirtualTree auch noch ThemeManager benötigt hätte... Gruß und danke an alle! e-gon |
AW: ListItem ein- und ausblenden
Zitat:
Ein Tutorial zur VirtualStringTree steht aber bei mir auf der ToDo. ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 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