Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TListView + OwnerData + CustomDrawItem (https://www.delphipraxis.net/172803-tlistview-ownerdata-customdrawitem.html)

mentaltec 23. Jan 2013 15:50

TListView + OwnerData + CustomDrawItem
 
Hallo,

ich hab da mal n Problem:

ich hab n TListView mit OwnerData und CustomDrawItem/CustomDrawSubItem erstellt; ViewStyle Report

die Daten werden auch korrekt dargestellt, also OnData füllt Item.Caption und SubItems entsprechend Item.Index

wenn aber OnCustomDrawItem aufgerufen wird steht im übergebenen Item.Index (meistens) Sender.ItemIndex; also der Index das selectierten Eintrages; CustomDrawState hingegen wird korrekt übergeben
bei nem 12 Zeiligen Listview ruft er 12x OnCustomDrawItem auf, aber jedesmal steht in item.index ne Null; nur für die erste Zeile ist cdsSelected in State
bei OnCustomDrawSubitem liefert er korrekte Indecees

ohne OwnerData läufts korrekt

hat das schonmal wer gesehen, oder hab ich's selbst verbockt?

nochmal konkreter: mit

procedure Txx.CustomDrawItem(...);
begin
OutputDebugString(PChar(format('CustomDrawItem : %d %s %s',[item.Index,item.Caption, StateToStr(State)])));
end;

procedure Txx.CustomDrawSubItem(...);
begin
OutputDebugString(PChar(format('CustomDrawSubItem : %d %d %s',[item.Index, subitem, item.Caption])));
end;

bekomm ich mit OwnerData ca. folgenden DebugOutput
CustomDrawItem : 0 1.Zeile [cdsSelected]
CustomDrawSubItem : 0 0 1.Zeile
CustomDrawItem : 0 1.Zeile []
CustomDrawSubItem : 1 0 2.Zeile
CustomDrawItem : 0 1.Zeile []
CustomDrawSubItem : 2 0 3.Zeile
CustomDrawItem : 0 1.Zeile []
CustomDrawSubItem : 3 0 4.Zeile
CustomDrawItem : 0 1.Zeile []
CustomDrawSubItem : 4 0 5.Zeile

ohne OwnerData: (und so erwarte ich es auch mit Ownerdata)
CustomDrawItem : 0 1.Zeile [cdsSelected]
CustomDrawSubItem : 0 0 1.Zeile
CustomDrawItem : 1 2.Zeile []
CustomDrawSubItem : 1 0 2.Zeile
CustomDrawItem : 2 3.Zeile []
CustomDrawSubItem : 2 0 3.Zeile
CustomDrawItem : 3 4.Zeile []
CustomDrawSubItem : 3 0 4.Zeile
CustomDrawItem : 4 5.Zeile []
CustomDrawSubItem : 4 0 5.Zeile

sowohl mit als auch ohne Ownerdata werden die korrekten Strings im Listview angezeigt, ich hab aber keine Möglichkeit, die Zeilen entsprechend des Indexes einzufärben o.ä
und natürlich ändert meine OnData-Fkt nicht den Item.Index

mfg

Volker Z. 23. Jan 2013 22:34

AW: TListView + OwnerData + CustomDrawItem
 
Hallo,

vielleicht hilft Dir ein Blick in die OH:

Zitat:

Mit OwnerData true legen Sie fest, dass die Listenansicht virtuell ist.
Zitat:

Beim Erzeugen einer virtuellen Listenansicht müssen Sie die Eigenschaft Count auf die Anzahl der Einträge in der virtuellen Liste setzen.
Gruß

mentaltec 24. Jan 2013 11:02

AW: TListView + OwnerData + CustomDrawItem
 
ok, ich habs gefunden :

in OnCustomDrawItem / OnCustomDrawSubItem darf man nicht Sender.ItemIndex lesen
die Information kann man ja auch aus State = cdsSelected holen
zum Beweis lustiges Debuglog:

Code:
procedure Txx.OnCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  OutputDebugString(PChar(format('OnDrawItemA : %d %s',[item.Index, Item.Caption])));
  DefaultDraw := sender.itemindex <> -6; // Lesezugriff auf ItemIndex -- DefaultDraw ist und bleibt immer true
  OutputDebugString(PChar(format('OnDrawItemB : %d %s',[item.Index, Item.Caption])));
end;
Debug-Ausgabe: OnDrawItemA : 0 Item#0 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemB : 1 Item#1 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemA : 1 Item#1 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemB : 1 Item#1 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemA : 2 Item#2 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemB : 1 Item#1 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemA : 3 Item#3 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemB : 1 Item#1 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemA : 4 Item#4 Prozess vlvdemo.exe (4868)
Debug-Ausgabe: OnDrawItemB : 1 Item#1 Prozess vlvdemo.exe (4868)

sender.ItemIndex war 1;
wenn sender.ItemIndex = -1 tritt der Effekt nicht auf

mfg


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