AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TListView + OwnerData + CustomDrawItem
Thema durchsuchen
Ansicht
Themen-Optionen

TListView + OwnerData + CustomDrawItem

Ein Thema von mentaltec · begonnen am 23. Jan 2013 · letzter Beitrag vom 24. Jan 2013
Antwort Antwort
mentaltec

Registriert seit: 28. Sep 2012
60 Beiträge
 
#1

TListView + OwnerData + CustomDrawItem

  Alt 23. Jan 2013, 16:50
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

Geändert von mentaltec (24. Jan 2013 um 01:16 Uhr)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: TListView + OwnerData + CustomDrawItem

  Alt 23. Jan 2013, 23:34
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ß
Volker Zeller
  Mit Zitat antworten Zitat
mentaltec

Registriert seit: 28. Sep 2012
60 Beiträge
 
#3

AW: TListView + OwnerData + CustomDrawItem

  Alt 24. Jan 2013, 12:02
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
  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 10:19 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