Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualStringTree: Problem mit ImageIndex (https://www.delphipraxis.net/29873-virtualstringtree-problem-mit-imageindex.html)

phXql 15. Sep 2004 22:06


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:
procedure TFormMain.VST1GetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
begin
  ImageIndex := 8;
end;
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.
Vielen Dank für eure (hoffentlich) kommenden Antworten :)

mfg

phXql

djmasi 15. Sep 2004 22:28

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:

phXql 15. Sep 2004 22:43

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von djmasi
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:

hmm, weise ich dem die ImageList als StateImages zu, gehen alle Images mit Index < 6. bin ich zu blöd für den VirtualStringTree oder is da wirklich ein Bug drin?

djmasi 15. Sep 2004 22:45

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von phXql
hmm, weise ich dem die ImageList als StateImages zu, gehen alle Images mit Index < 6. bin ich zu blöd für den VirtualStringTree oder is da wirklich ein Bug drin?

Ich hab bis jetzt nur 5 Images :gruebel: In den Foren/News hab ich noch nichts drüber gelesen.

phXql 16. Sep 2004 07:50

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...

djmasi 16. Sep 2004 07:54

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:
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;
[edit]
Verdammt zu spät :wall:
[/edit]

djmasi 16. Sep 2004 08:03

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von phXql
Mir aber nicht verständlich, warum das in KEINEM tutorial auftaucht...

:oops: Doch, in der Hilfe zum VirtualTreeView -> Step by Step
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;

phXql 16. Sep 2004 09:11

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von djmasi
Zitat:

Zitat von phXql
Mir aber nicht verständlich, warum das in KEINEM tutorial auftaucht...

:oops: Doch, in der Hilfe zum VirtualTreeView -> Step by Step

verdammt. da steht aber auch nix von dem ikOverlay...

kaaeton 9. Sep 2009 12:40

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von phXql
Mir aber nicht verständlich, warum das in KEINEM tutorial auftaucht...

Ganz einfach, weil es die, die es verstanden haben nicht der Mühe wert fanden, es zu beschreiben und die anderen haben die Hintergründe nicht wirklich verstanden und nur so lange probiert, bis es irgendwie funktioniert hat.

Ich habe jetzt ein neues Tutorial geschrieben.
Teil 1 ist fertig und Teil 2 in Arbeit.
Zu finden auf meiner HP: http://home.tele2.at/karahoan/technav.html

Im Teil 2 beschreibe ich diesen Sachverhalt genau.

mfg Wolfgang

generic 9. Sep 2009 14:32

Re: VirtualStringTree: Problem mit ImageIndex
 
Der Beitrag ist von 2004.

kaaeton 9. Sep 2009 15:53

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von generic
Der Beitrag ist von 2004.

Ja, und wo ist das Problem?
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

Satty67 9. Sep 2009 16:08

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.

generic 9. Sep 2009 17:01

Re: VirtualStringTree: Problem mit ImageIndex
 
Tutorials gibt es viele:

Bei uns hier als Video:
http://www.delphipraxis.net/videos#Stammtisch_2

oder im Delphi-Treff:
http://www.delphi-treff.de/no_cache/...eeview/page/1/

Im Entwickler Magazin:
  • Entwickler Magazin (Ausgabe: 02.08/13.02.2008) Artikel: Von Bäumen und Listen - Komponente VirtualStringTree im Detail
  • Entwickler Magazin (Ausgabe: 03.08/14.04.2008) Artikel: Von Bäumen und Listen Teil 2 - Komponente VirtualStringTree im Detail
  • Entwickler Magazin (Ausgabe: 04.08/12.06.2008) Artikel: Von Bäumen und Listen Teil 3 - Komponente VirtualStringTree im Detail

Dezipaitor 10. Sep 2009 12:38

Re: VirtualStringTree: Problem mit ImageIndex
 
Auch noch ein Tipp von mir

Delphi-Quellcode:
function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode;
Viele wissen nicht genau, was man mit UserData anfangen kann.
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:
Type
  PMyNodeData = ^TMyNodeData;
  TMyNodeData = record
    MyData : Pointer; <-- UserData aus AddChild
    Rest ...
  end;
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.

Wenn man UserData benutzt, bekommt der Knoten einen State zugewiesen, so dass man dies in OnInitNode überprüfen kann :
Delphi-Quellcode:
if vsInitialUserData in Node.States then
Wichtig zu wissen ist dabei, dass der var Parameter InitialStates von OnInitNode nicht diesen Status enthält.

kaaeton 17. Sep 2009 19:53

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von Dezipaitor
Auch noch ein Tipp von mir ...
Viele wissen nicht genau, was man mit UserData anfangen kann. ...
Wenn man UserData benutzt, bekommt der Knoten einen State zugewiesen, so dass man dies in OnInitNode überprüfen kann.

Danke, aber kannst du mir auch ein Anwendungsbeispiel nennen?
Ich kann mir momentan noch keine Vorstellung für einen sinnvollen Einsatz machen.

LG Wolfgang

Dezipaitor 17. Sep 2009 21:53

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.

Codewalker 7. Mär 2010 09:47

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?

Dezipaitor 7. Mär 2010 10:30

Re: VirtualStringTree: Problem mit ImageIndex
 
Meistens sind es eher Fehler im entwickelten Quelltext.

kaaeton 7. Mär 2010 20:47

Re: VirtualStringTree: Problem mit ImageIndex
 
Zitat:

Zitat von Codewalker
Ich habe das ... Problem: ... 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?

Schau dir mal meinen 2.Teil des Tutorials an. Da hab ich mich mit den Icons beschäftigt. Für die OverlayIcons hab ich auch noch keine brauchbare Erklärung für die Verwendung. Ich kann mir auch noch nichts darunter vorstellen und wozu man das verwenden könne.
Tutorial: www.delphipraxis.net/topic166359,0,asc,0.html
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

Hawkeye219 7. Mär 2010 21:43

Re: VirtualStringTree: Problem mit ImageIndex
 
Hallo,

um die Bilder als Overlay nutzen zu können, muss man sie einmalig anmelden:

Delphi-Quellcode:
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;
Gruß Hawkeye


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