AGB  ·  Datenschutz  ·  Impressum  







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

TVirtualStringtree mit viiielen Icons

Ein Thema von Mattze · begonnen am 9. Apr 2007 · letzter Beitrag vom 12. Apr 2007
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

TVirtualStringtree mit viiielen Icons

  Alt 9. Apr 2007, 18:48
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
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: TVirtualStringtree mit viiielen Icons

  Alt 9. Apr 2007, 18:51
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ß
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

Re: TVirtualStringtree mit viiielen Icons

  Alt 9. Apr 2007, 20:03
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
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#4

Re: TVirtualStringtree mit viiielen Icons

  Alt 9. Apr 2007, 20:14
Schau dir mal das Event OnAfterItemPaint an:
Delphi-Quellcode:
procedure TForm1.vstAfterItemPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
begin

end;
ItemRect ist die Position deiner Zelle.

Gruß
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#5

Re: TVirtualStringtree mit viiielen Icons

  Alt 10. Apr 2007, 11:50
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#6

Re: TVirtualStringtree mit viiielen Icons

  Alt 10. Apr 2007, 18:22
Hallo,

erstmal zu den Iconen im VirtualStringTree:
Ich hab's raus! Ich hab's wirklich raus!!!
Es geht in
Delphi-Quellcode:
procedure TForm1.VSTRechtsAfterCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellRect: TRect);
Man muss dann noch etwas mit Margin spielen und den "Textanfang" der Node berechnen.
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#7

Re: TVirtualStringtree mit viiielen Icons

  Alt 11. Apr 2007, 08:24
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.
MSDN-Library durchsuchenSHGetFileInfo
Delphi-Quellcode:
Var SystemImages: TImageList;

SystemImages.ShareImages := True;
SystemImages.Handle := SHGetFileInfoW('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_OPENICON);
Und dann halt nur noch den IconIndex besorgen.
Delphi-Quellcode:
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;
Eine "normale" TImageList greift ja intern auch nur auf auf die entsprechende WinAPI zu.

Was lädst du denn eigentlich für Bilder in die ImageList?

[add]
Zitat:
also ich kriege in die Imagelist so um die 500 rein
bevor ich direkt zur SystemImageList gewechselt bin, hatte ich auch mal mehrere 1000 Icons in einer Liste
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#8

Re: TVirtualStringtree mit viiielen Icons

  Alt 12. Apr 2007, 15:41
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#9

Re: TVirtualStringtree mit viiielen Icons

  Alt 12. Apr 2007, 15:57
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.


> Hier im Forum suchenhSync hab da auch schon mal weit über 100.000(200.000) Dateien dringehabt und da wär mir dann für jede Datei ein Icon zuviel gewesen.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#10

Re: TVirtualStringtree mit viiielen Icons

  Alt 12. Apr 2007, 17:30
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:34 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