![]() |
VirtualStringTree: Problem mit ImageIndex
Moin Leute,
ich habe ein seltsames Problem mit meinem VirtualStringTree. Ich habe eine ImageList mit 9 verschiedenen Icons, und diese ImageList ist dem VirtualStringTree bei der Eigenschaft Images zugewiesen. Wenn ich jetzt in der Funktion
Code:
den ImageIndex auf 8 setze, müsste jeder Node das Bild vom 9ten Icon in der ImageList bekommen. Tut es aber nicht. Icons mit dem Index 0 - 4 werden richtig dargestellt, alles was über Index 4 is, wird als Icon #0 dargestellt. Falls nich nachvollziehbar, stell ich das gesamte Projekt hier mal auf Anfrage als Download bereit.
procedure TFormMain.VST1GetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); begin ImageIndex := 8; end; Vielen Dank für eure (hoffentlich) kommenden Antworten :) mfg phXql |
Re: VirtualStringTree: Problem mit ImageIndex
Sowas hatte ich auch schonmal. Das 5. Image wurde vom 0. überlagert.
Habe dann die Images nicht als "normale" sondern als "StateImages" zugewiesen. Seitdem gehts. :gruebel: |
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
|
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
|
Re: VirtualStringTree: Problem mit ImageIndex
okay, ich hab die Lösung des Problems gefunden. die ersten 4 icons kann man als overlay-icons benutzen. um das zu verhindern bei der GetImageIndex auf den Parameter Kind prüfen, wenn dieser NICHT ikNormal oder ikSelected ist, dann einfach den ImageIndex auf -1 setzen. sonst den "normalen" image-index zurückgeben. Dann gehts auch.
Mir aber nicht verständlich, warum das in KEINEM tutorial auftaucht... |
Re: VirtualStringTree: Problem mit ImageIndex
Also bei mir geht es...
Sag mal, hast du ne "normale" TImageList genommen? Ich hab nämlich TJvImageList von JEDI. Zweitens, hast du ne TreeView- oder Grid-Darstellung? Ich hatte das Prob bei der TreeView-Darstellung Kannst ja mal das Projekt posten. Hier mal mein Code:
Delphi-Quellcode:
[edit]
procedure TFMain.VSTLibraryGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); var QueryRec: PQueryRec; begin if Column = 12 then begin QueryRec := Sender.GetNodeData(Node); ImageIndex := -1; case QueryRec.ABitRate of 0..47: ImageIndex := 0; // >48 48..52: ImageIndex := 1; // 48 53..60: ImageIndex := 2; // 56 61..70: ImageIndex := 3; // 64 71..100: ImageIndex := 4; // 96 101..116: ImageIndex := 5; // 112 117..140: ImageIndex := 6; // 128 141..180: ImageIndex := 7; // 160 181..216: ImageIndex := 8; // 192 217..240: ImageIndex := 9; // 224 241..280: ImageIndex := 10; // 256 281..320: ImageIndex := 11; // 320 else ImageIndex := 12; end; end; end; Verdammt zu spät :wall: [/edit] |
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
Delphi-Quellcode:
procedure TBookmarkForm.BookmarkTreeGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: Integer; var Index: Integer); var NodeData: ^rTreeData; begin NodeData := Sender.GetNodeData(Node); case Kind of ikState: // for the case the state icon has been requested Index := -1; ikNormal, ikSelected: // normal or the selected icon is required Index := NodeData.ImageIndex; end; end; |
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
|
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
Ich habe jetzt ein neues Tutorial geschrieben. Teil 1 ist fertig und Teil 2 in Arbeit. Zu finden auf meiner HP: ![]() Im Teil 2 beschreibe ich diesen Sachverhalt genau. mfg Wolfgang |
Re: VirtualStringTree: Problem mit ImageIndex
Der Beitrag ist von 2004.
|
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
Der Beitrag ist im Forum und es können ihn auch heute noch alle lesen. Es gab damals keine Erklärung und damit ist er genauso aktuell wie 2004, da es seit damals KEINE brauchbarere Beschreibung als die von Phillip und Sven gab und seit dem auch eine Weiterentwicklung erfolgte. Dem trage ich Rechnung und poste hier eben den aktuellen Stand. Wenn du ein Spezialist auf dem Bereich des Virtual TreeView bist, dann trage doch was dazu bei, daß andere es leichter haben, diese tolle Komponente einzusetzen. Deine konstruktiven Beiträge sind gerne willkommen. mfg Wolfgang |
Re: VirtualStringTree: Problem mit ImageIndex
Danke für den Hinweis, denn ich hatte bis vor ein paar Monaten noch Delphi5 und kein VirtualTreeView im Einsatz. Wollte jetzt mit D2007 schon längst mal die Komponente anschauen und das verschoben... was ich aber die Tage mit dem Tutorial mal nachholen werden.
|
Re: VirtualStringTree: Problem mit ImageIndex
Tutorials gibt es viele:
Bei uns hier als Video: ![]() oder im Delphi-Treff: ![]() Im Entwickler Magazin:
|
Re: VirtualStringTree: Problem mit ImageIndex
Auch noch ein Tipp von mir
Delphi-Quellcode:
Viele wissen nicht genau, was man mit UserData anfangen kann.
function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode;
Es ist aber ganz nützlich, weil man damit Daten noch vor dem OnInitNode Event dem Knoten zuweisen kann. Der Parameter UserData wird dabei direkt auf die ersten 4 Bytes des Records gesetzt. D.h.
Delphi-Quellcode:
Da kommen die Daten rein. Dabei muss es sich nicht um ein Pointer handeln, auch eine Klasseninstanz oder Interface geht - also alles was 4 Byte beansprucht. Nur sollte im Record auch wirklich ein 4 Byte Typ stehen und nicht etwa weniger. Sonst kommt es gerne mal zu Nebenwirkungen.
Type
PMyNodeData = ^TMyNodeData; TMyNodeData = record MyData : Pointer; <-- UserData aus AddChild Rest ... end; Wenn man UserData benutzt, bekommt der Knoten einen State zugewiesen, so dass man dies in OnInitNode überprüfen kann :
Delphi-Quellcode:
Wichtig zu wissen ist dabei, dass der var Parameter InitialStates von OnInitNode nicht diesen Status enthält.
if vsInitialUserData in Node.States then
|
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
Ich kann mir momentan noch keine Vorstellung für einen sinnvollen Einsatz machen. LG Wolfgang |
Re: VirtualStringTree: Problem mit ImageIndex
Naja,
wenn du deine Daten nin OnInitNode initialisieren willst, dann kannst du da gleich z.b. ein Objekt reinstecken, so dass du weitere Berechnungen eben in dieser Funktion machen kannst. Dann gibt es noch das Problem, dass zwischen AddChild und ein folgendes GetNodeData viel passieren kann, so z.B. kann mit toAutoSort der Tree automatisch sortiert werden. Da werden dann nicht initialisierte Daten verglichen. |
Re: VirtualStringTree: Problem mit ImageIndex
Ich habe das genau entgegengesetzte Problem: Ich habe eine ImageList mit 4 Overlay-Icons und dahinter den normalen Icons. Im OnGetImageIndex weise ich passend den ImageIndex zu ... aber man sieht keine Overlay Icons. Muss man noch eine Option zuschalten oder was muss ich tun, damit er die Overlay-Icons auch zeichnet?
|
Re: VirtualStringTree: Problem mit ImageIndex
Meistens sind es eher Fehler im entwickelten Quelltext.
|
Re: VirtualStringTree: Problem mit ImageIndex
Zitat:
Tutorial: ![]() Wenn du mir ein Beispiel geben könntest für die Verwendung (Notwendigkeit) von OverlayIcons, dann würde ich mir das mal näher ansehen. LG Wolfgang |
Re: VirtualStringTree: Problem mit ImageIndex
Hallo,
um die Bilder als Overlay nutzen zu können, muss man sie einmalig anmelden:
Delphi-Quellcode:
Gruß Hawkeye
procedure TForm1.FormCreate (Sender: TObject);
begin Tree.Images := ImageList1; // über OI zuweisen ImageList1.Overlay(21, 0); // Bild #21 wird Overlay-Icon #0 ImageList1.Overlay(42, 1); // Bild #42 wird Overlay-Icon #1 end; procedure TForm1.TreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); begin case Kind of ikNormal, ikSelected: ImageIndex := Random(16); ikOverlay: ImageIndex := Node.Index and 1; else ImageIndex := -1; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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