![]() |
TVirtualStringtree mit viiielen Icons
Hallo,
vielleicht könnt Ihr mir helfen: Ich habe einen riesigen TVirtualStringtree mit "tausenden" Nodes. (Es sind nicht ganz soviel, aber es verdeutlicht das Problem!) Alle diese Nodes haben ein anderes Bildchen (Icon). Nun gibt es aber nur eine TImagelist und ein Imageindex aus dieser Liste für das Icon einer Node. (Oder?) Eine Imagelist ist jedenfalls viiiel zu klein, um die vielen Icons aufzunehmen. Wie zeige ich die dann an? Gibt es da eine Variante? (Eigentlich muss es da etwas geben. TVirtualExplorerListvie kann's doch auch... Ich finde es aber einfach nicht...) Gruß Matthias |
Re: TVirtualStringtree mit viiielen Icons
Moin,
hast du mal versucht die Icons selber zu zeichnen ? Ich wusste gar nicht, das die ImageList ein Limit hat. Wieviele passen da denn rein ? Gruß |
Re: TVirtualStringtree mit viiielen Icons
Hallo,
also ich kriege in die Imagelist so um die 500 rein - wenn ich mich recht erinnere. Nur die Systemimagelist wird wohl anders verwaltet. So mit einer Art Verkettung. Da passen dann mehr rein. (Habe ich mal irgendwo gelesen.) Ich habe mal versucht, die Bilder selber zu zeichnen. (Als Data.image an eine Node rangehängt und dann bei Bedarf wieder vorgeholt.) Das geht auch ganz gut, aber: Klappt nicht so ganz, weil man scheinbar nicht an alle Daten rankommt, um das Zeichenrechteck ordentlich zu bestimmen. Jedenfalls habe ich es nicht geschafft - wahrscheinlich, weil ich nicht richtig weiß, in welchem Ereignis man das am besten macht. Gruß Matthias |
Re: TVirtualStringtree mit viiielen Icons
Schau dir mal das Event OnAfterItemPaint an:
Delphi-Quellcode:
ItemRect ist die Position deiner Zelle.
procedure TForm1.vstAfterItemPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect); begin end; Gruß |
Re: TVirtualStringtree mit viiielen Icons
Also ich dachte och daß die EInzige Grenze für 'ne ImageList der Speicher sei ... ich hab da jedenfalls noch von einer Begrenzung nichts gemerkt.
In die SystemImageList von Windows passen ja auch alle Icons aller Dateien und noch viel mehr rein. OnGetImageIndexEx der TreeView kannst du nicht nur den ImageIndex, sondern auch eine andere ImageList zuweisen. Damit sollte es dir ein Leichtes sein auch mehrere ImageLists zu nutzen. |
Re: TVirtualStringtree mit viiielen Icons
Hallo,
erstmal zu den Iconen im VirtualStringTree: Ich hab's raus! Ich hab's wirklich raus!!! Es geht in
Delphi-Quellcode:
Man muss dann noch etwas mit Margin spielen und den "Textanfang" der Node berechnen.
procedure TForm1.VSTRechtsAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellRect: TRect); Das ist aber leicht! Die VirtualTrees.pas macht es vor! Malen sollte man die mit DrawIconEx. Macht sich am besten und man braucht vieles nicht zu beachten. Das geschieht dann automatisch! Zu den Imagelisten: Es ist Euch vielleicht noch nicht aufgefallen, aber ich bin da schon ziemlich schmerzhaft an die Grenze gekommen - soll heißen: Ich habe eine Weile gebraucht, um zu kapieren, dass es die Liste selber ist, die begrenzt ist! Dazu steht übrigens auch etwas in irgendeinem Forum. (Nicht von mir!) Bei der Systemimagelist wird das alles etwas anders (vom System) verwaltet. Die macht wohl so eine Art Verkettung, wie Ihr sie ja mit OnGetImageIndexEx vermutet. Ich kennen diese Funktion nicht und habe auch noch nicht weiter danach geguckt... Ich habe gerade noch mal geguckt. Bei mir (Delphi 7 Pro) gibt es das EX nicht, nur ohne! Natürlich kann man immer auch mit mehreren Imagelisten hantieren kann, eine ordentliche Verwaltung dafür ist aber ein riesiger Aufwand. Ausserdem nutze ich keine VCL-Treeviews mehr. Der Virtualtreeview von Mike Liscke ist unvergleichbar viel besser! Gruß Matthias |
Re: TVirtualStringtree mit viiielen Icons
Hab hier auch "nur" D7 und ich glaub VTV v4.4.3 drauf.
Die SystemImageList ist im Grunde auch nur 'ne normale ImageList ... nur daß die sozusagen halt "alle" Icons des Systems enthält. ![]()
Delphi-Quellcode:
Und dann halt nur noch den IconIndex besorgen.
Var SystemImages: TImageList;
SystemImages.ShareImages := True; SystemImages.Handle := SHGetFileInfoW('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_OPENICON);
Delphi-Quellcode:
Eine "normale" TImageList greift ja intern auch nur auf auf die entsprechende WinAPI zu.
Procedure TMainForm.VirtualStringTree1GetImageIndexEx...
... If SHGetFileInfoW(PChar(PWideChar(ProgressForm._DC.GetFullName(Index, False))), 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_OPENICON) <> 0 Then ImageIndex := SFI.iIcon; Was lädst du denn eigentlich für Bilder in die ImageList? [add] Zitat:
|
Re: TVirtualStringtree mit viiielen Icons
Hallo,
vielen Dank. Ich habe natürlich beim VCL-Treeview nachgeguckt, nicht beim VTV. Da habe ich das dann auch gefunden. Aber, wie gesagt, es geht jetzt eigentlich sehr gut. Mit der Imagelist kann ich nur sagen, was mir schon öfter passiert ist - gar nicht mit sehr großen Bildern - und was ich auch schon oft in Foren dazu gelesen habe. Ich wollte ja eigentlich nur mal was probieren... Die meisten Komprimiertools (Winrar usw.) zeigen die Archive mit Iconen für die Dateien an. Nun habe ich mich einfach gefragt, wie die das machen. Die Dateien zu dekomprimieren, dass Icon zu suchen und dann anzuzeigen ist vom Laufzeitverhalten sicherlich nicht vertretbar - bei sehr großen Archiven. Ich habe einen Weg mit dem VTV gefunden. Es werden die auf dem Computer registrierten Typen und deren Icons genutzt. Ich habe nun für jede Node ihr Icon ermittelt und an sie rangehängt. Das ist sicherlich keine saubere und günstige Lösung, weil dann eben einige Icons ein paar 100 mal da sind. Eine Stringlist mit Erweiterungen und zugehörigen Icons wäre sicherlich die bessere Lösung. Aber es geht erst mal... Gruß Matthias |
Re: TVirtualStringtree mit viiielen Icons
Den Code mit der SystemImageList nutze ich selber ... hätte es auch beinah erst so gemacht, daß ich an jede Datei/Node das Icon dranlade, allerdings fiehl mir dann auch ein, daß ich viele Icons ja eigentlich nur einmal brauch und bevor ich dann mit der Überlegung fertig war, wie ich die verwalten will, bin ich halt darauf gekommen.
> ![]() Ich will zwar mal versuchen rauszufinden wie lange der Index für ein Icon in der SystemImageList gültig ist (könnte ja anscheinend ewig gelten), aber derzeit laß ich mir noch für die angezeigten Dateien jedesmal vorm Anzeigen den "aktuellen" Index geben und soweit ich sehe, ist das eigentlich schon schnell genug. |
Re: TVirtualStringtree mit viiielen Icons
Hallo,
ich habe zuerst mal einfach im Programm alles in die Systemimagelist reinaddiert. Erstaunlicherweise war das nach Ende des Programmes (und, wenn ich mich recht erinnere, auch während der Laufzeit) für andere Programme nicht sichtbar. (Ich habe mir mal ein Programm geschrieben, das mir nur die Systemimagelist anzeigt!) Aber das ging alles irgendwie recht langsam. Mit der Stringliste geht es ganz gut. Habe ich eben probiert. Allerdings musst Du tatsächlich immer den Listindex der node kurz vor dem "Malen" suchen lassen. Die Stringlist wird ja automatisch sortiert. Wenn Du also das Bild für eine Node aufnimmst, können sich die Indizes für die anderen Nodes ändern. Ist mir gerade passiert! Deswegen kam ich drauf. Ist aber vom Laufzeitverhalten noch alles akzeptabel! (Ich habe das eben mit der Driver.cab ausprobiert und die enthält immerhin über 4000 Einträge.) Das ist so wahrscheinlich die günstigste Variante. Alles andere wird scheinbar langsamer. (Außer die Iconen pro Node zu speichern. Aber das ist nicht viiiel schneller und hat einen enormen Ressourcenverbrauch!) Gruß Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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