Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   VirtualTreeView, no image list was supplied (https://www.delphipraxis.net/192641-virtualtreeview-no-image-list-supplied.html)

norwegen60 7. Mai 2017 22:35


VirtualTreeView, no image list was supplied
 
Hallo,

ich habe auf Delphi XE 10.2 und VirtualTreeView 6.6 upgedatet. Jetzt bekomme ich bei einem Projekt folgende Fehlermeldung
Zitat:

An Image Index was supplied for TTVImagekind.ikNormal but no image list was supplied
Der Fehler tritt nur auf wenn ich mit der Maus über einen Eintrag mit einem Image fahre. Die Images werden wie folgt zugewiesen:
Delphi-Quellcode:
procedure Tfo1ProjNr.vrdbtProjNrGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: TImageIndex);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);

  { Rote LED vor Projekte, bei denen Meilensteinen überschritten sind }
  if Column=1 then
  begin
    if (Data^[4].asString = 'O') then
    begin
      if (Data^[6].asString='1') then  // sehr wichtig
        ImageIndex:=5    //ROT mit !
      else
        ImageIndex:=4;  //ROT
    end
    else if (Data^[4].asString = 'Y') then
    begin
      if (Data^[6].asString='1') then
        ImageIndex:=3    //GELB mit !
      else
        ImageIndex:=2;  //GELB
    end
    else if (Data^[3].asString = 'A') then
    begin
      if (Data^[6].asString='1') then
        ImageIndex:=1    //GRÜN mit !
      else
        ImageIndex:=0;  //GRÜN
    end
    else if (Data^[3].asString = 'T') then
    begin
      if (Data^[6].asString='1') then
        ImageIndex:=7    //blau mit !
      else
        ImageIndex:=6;  //blau
    end;
  end;
end;
Danke für eure Unterstützung

Aviator 7. Mai 2017 23:57

AW: VirtualTreeView, no image list was supplied
 
Du musst der Komponente auch eine ImageList zuweisen aus der du die Images laden möchtest. Entweder per OI oder per Code
Delphi-Quellcode:
vrdbtProjNr.ImageList := ImageList1;
. Natürlich angepasst an deinen ImageList Komponenten Namen.

Zusätzlich solltest du auch noch den ImageKind abfragen. Du kannst je nach Status der Node einen anderen ImageIndex übergeben. Also in etwa so:

Delphi-Quellcode:
procedure Tfo1ProjNr.vrdbtProjNrGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: TImageIndex);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  if (Kind <> ikSelected) then begin  // Das solltest du noch einfügen, da du ansonsten die Meldung nochmal bekommst. Nur mit der Meldung "An Image Index was supplied for TTVImagekind.ikSelected but no image list was supplied"
    // Hier dann deine Images zuweisen
  end;
end;
Alternativ zu der Abfrage kannst du der Property SelectedImages auch die gleiche ImageList nochmal zuweisen.

norwegen60 8. Mai 2017 08:43

AW: VirtualTreeView, no image list was supplied
 
Ich habe die TreeView seit Jahren nicht mehr angefasst. Bisher war die ImageList nur dem Property
Delphi-Quellcode:
StateImages
zugewiesen und von Delphi 7 bis XE10 hatte es so auch funktioniert.

Das Property
Delphi-Quellcode:
ImageList
gibt es nicht. Ich habe
Delphi-Quellcode:
vrdbtProjNr.Images = ImageList
gesetzt, dann funktioniert es. Allerdings zeigt es dann bei allen nicht selektierten Einträgen zwei LED an.

Ich habe testweise die Zuweisung nur bei
Delphi-Quellcode:
Images
gemacht und bei
Delphi-Quellcode:
StateImages
gelöscht. Dann kommt die Fehlermeldung wieder.
Nach etwas rum probieren, die Hilfe ist zu StateImages recht dürftig, bin ich auf folgendes Setting gekommen das wieder einwandfrei läuft:

Delphi-Quellcode:
Images nicht zuweisen
StateImages = ImageList1;

procedure Tfo1ProjNr.vrdbtProjNrGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: TImageIndex);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  if (Kind = ikState) then begin // Verhindert die Meldung "An Image Index was supplied for TTVImagekind.ikSelected but no image list was supplied"
    // Ad hier Images zuweisen
  end;
end;

Aviator 8. Mai 2017 15:53

AW: VirtualTreeView, no image list was supplied
 
Hallo.

Sorry. Ja die Property heißt nur
Delphi-Quellcode:
Images
und nicht
Delphi-Quellcode:
ImageList
.

In deinem SourceCode solltest du daher auch nicht wie oben von mir beschrieben nur auf ungleich
Delphi-Quellcode:
ikSelected
sondern auf
Delphi-Quellcode:
if (Kind in [ikNormal, ikSelected]) then
prüfen. Das verhindert, dass er die Exception wirft. Wenn du auch je nach State (also Node selektiert oder nicht) auch ein Image hinterlegen willst, dann muss du das Set entsprechend um
Delphi-Quellcode:
ikState
erweitern und dem Tree auch eine
Delphi-Quellcode:
StateImages
ImageList zuweisen. Das kann natürlich die gleiche sein wie die, die du der
Delphi-Quellcode:
Images
Property zugewiesen hast.

Der letzte Kind ist
Delphi-Quellcode:
ikOverlay
der entsprechend über eine bereits gezeichnetes Image drüber gemalt wird. Habe ich bisher aber auch noch nicht verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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