AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListItem ein- und ausblenden

Ein Thema von e-gon · begonnen am 5. Feb 2014 · letzter Beitrag vom 7. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2      
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#1

ListItem ein- und ausblenden

  Alt 5. Feb 2014, 10:33
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:
procedure TForm.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  DefaultDraw:= (Edit1.Text='') or (Pos(Edit1.Text,Item.Caption)>0);
end;
Zwar geht es recht schnell, doch hinterlassen die ausgeblendeten Zeilen Platz, sodass Lücken im ListView entstehen statt einer gekürzten Liste.

Was mache ich falsch? Oder kennst jemand eine bessere Lösung ListItems auszublenden?

Gruß
e-gon
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 10:39
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 10:59
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 11:39
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 11:43
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 13:30
@jaenicke: Delphi 6 scheint nicht oder nur bedingte Unterstützt zu sein.
Wenn du auf der verlinkten Seite herunter scrollst, gibt es dort noch die Datei VTSourceOnly_4.8.7.zip, die noch auch für Delphi 6 war.

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
Bei einer Livefilterung hakt das schon relativ schnell. Bei der Virtual Tree geht das selbst mit zehntausenden Einträgen problemlos.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 14:03
Eine ListView im Virtualmode ist dafür doch geeignet. Filtern geht dabei in Echtzeit.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 14:04
Dann benutzt man die Listview eben virtuell.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 14:20
Zitat:
Eine ListView im Virtualmode
Was meint Ihr damit? Habe ich da was verpasst? Wo bekomme ich den Virtualmode?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

AW: ListItem ein- und ausblenden

  Alt 5. Feb 2014, 14:35
Hier ist ein Beispiel (bei den Delphi-Demos ist aber IIRC auch eins dabei).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 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