![]() |
Listview, CustomDrawSubItem, Text wird schwarz
Hallo,
ich habe mit dem folgenden Code das CustomDrwawSubItem-Event befüllt. Der Testrahmen wird auch prima gezeichnet, die normal darzustellenden Spalten jedoch erhalten einen schwarzen Kasten, wenn text enthalten ist, Das aber auch nur, wenn der Cursor/Maus nach unten bewegt wird. Die Richtung nach oben erfolgt korrekt.
Delphi-Quellcode:
ListView ist vom Typ vsReport
procedure TInfoAuftrDlg.PlanViewCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); var r : TRect; i : Integer; begin if SubItem<5 then begin DefaultDraw:=true; exit; end; r := Item.DisplayRect(drBounds); for i := 0 to SubItem-1 do begin r.Left := r.Left + PlanView.Columns.Items[i].Width; r.Right := r.Left + PlanView.Columns.Items[i+1].Width; end; if SubItem=5 then PlanView.Canvas.Pen.Color := clRed else PlanView.Canvas.Pen.Color := clBlue; PlanView.Canvas.Rectangle(r.Left, r.Top, r.Right, r.Bottom); DefaultDraw := False; end; Jemand eine zündene Idee? Danke und ciao Frank |
AW: Listview, CustomDrawSubItem, Text wird schwarz
ich verwende Listview eigentlich nie, aber so bekomme ich das IMHO gewünschte Ergebnis:
(kann sicher noch optimiert werden)
Delphi-Quellcode:
var r : TRect;
i : Integer; s : String; begin PlanView.Canvas.Brush.Color := clWhite; PlanView.Canvas.Brush.Style := bsclear; if SubItem<1 then begin DefaultDraw:=true; exit; end; r := Item.DisplayRect(drbounds); for i := 0 to SubItem-1 do begin r.Left := r.Left + PlanView.Columns.Items[i].Width; r.Right := r.Left + PlanView.Columns.Items[i+1].Width; end; if SubItem=1 then PlanView.Canvas.Pen.Color := clRed else PlanView.Canvas.Pen.Color := clBlue; PlanView.Canvas.FillRect(r); PlanView.Canvas.Rectangle(r.Left, r.Top, r.Right, r.Bottom); r.Left := r.Left +1; r.Right := r.Right - 1; r.Top := r.Top + 1; r.Bottom := r.Bottom - 1; if item.SubItems.Count >= SubItem then s := item.SubItems[SubItem-1]; PlanView.Canvas.TextRect(r,s); DefaultDraw := false; end; |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Thomas,
danke für deinen Einsatz, ich habe mich nur etwas blöd ausgedrückt. Nicht der Text in dem selbstgemalten SubItem, sondern alle Anderen werden schwarz. Un das nur, wenn Cursor oder Maus auf dem Weg nach unten sind, nach oben ist alles sichtbar. siehe Bild Anhang 35420 Noch eine Idee? Ciao Frank |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Genau das selbe Problem habe ich jetzt auch mit Delphi Tokyo: Wenn Items ausgewählt werden, wird der Text schwarz, wie auf dem Bildschirmfoto im letzten Post zu sehen. Hat da jemand in den letzten Jahren schon eine Lösung gefunden?
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Liste der Anhänge anzeigen (Anzahl: 1)
Habe das mit 10.2.3 als Minimalbeispiel umgesetzt und es funktioniert bei mir ohne schwarze Felder...
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
![]() Zitat:
Gerade seh ich Rot und eine Whookie Lösung... ich schick die Info trotzdem ab:) |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Danke, aber bei beiden Lösungen ist das Problem, dass der Text in der der Spalte, die rechts neben der Owner-Draw-Spalte liegt, pixelig und fett wird. Ein manuelles setzten der Font schafft keine Abhilfe. Die Schrift ist immer pixelig und fett...
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Poste noch mal Dein Projekt damit es nachvollziehen kann.
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Liste der Anhänge anzeigen (Anzahl: 2)
Hier das Projekt zum Testen und ein Screenshot mit dem Fehler (Text wird pixelig und fett)
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Das ist nicht pixelig und fett, das ist eine andere Schriftart.
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Zitat:
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Ich habe alles was nicht zum Projekt gehört gelöscht so das nurnoch
Delphi-Quellcode:
übrig blieb.
Projekt1.dpr, Project1.res, Unit1.dfm, Unit1.pas
Delphi Tokyo mit der .dpr gestartet, auf Release gestellt, kompiliert, alles hat die gleiche Schrift. Ich kann Fehler nicht reproduzieren. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Zitat:
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Ahh ok, ich nutze Windows Version 7. Ich schau mal im Code wegen Custom-Font setzen.
edit Jetzt habe ich Deine .exe mal gestartet. Da erscheint der Fehler wie auf dem Bild. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Delphi-Quellcode:
könntest du mal ausprobieren, ob es was ändert. (beim DefaultDraw=True)
Sender.Canvas.Font.Assign(Sender.Font);
Sowas wie SetBkMode an der VCL vorbei und nicht wieder zurücksetzen. Das kann auch Probleme bereiten. Sich nicht auf einwas zu einigen und dann abwechselnd Sender.Canvas oder PlanView.Canvas zu nutzen bereitet oftmals keine großen Probleme, aber ist dennoch keine gute Idee. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Ich habe ein wenig gelesen und das hier soll wohl helfen, da ich Fehler nicht habe kann ichs nicht testen.
Delphi-Quellcode:
Ps: Zweimal damit eine Veränderung eintritt.
procedure TForm1.PlanViewCustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer;
State: TCustomDrawState; var DefaultDraw: Boolean); var r: TRect; i: Integer; begin PlanView.Canvas.Font.Style := [fsItalic]; PlanView.Canvas.Font.Style := []; //ab hier wie im Original weiter |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Zitat:
siehe..@himitsu
Delphi-Quellcode:
Sender.Canvas.Font.Assign(Sender.Font);
Zitat:
Zitat:
Aber verstehe nicht was du da machst. Du möchtest selbst die Schrift zeichnen mit OwnerDraw? Wenn dem so ist warum wurde OwnerDraw nicht aktiviert. So.. Und wenn du es aktivierst dann bist du für das zeichnen der Schrift Font etc.. selbst verantwortlich. Da scheint mir ein mismatch zwischen OwnerDraw und zeichnen der eigenen Komponente zu sein. gruss |
AW: Listview, CustomDrawSubItem, Text wird schwarz
@EWeiss: Wenn ich sein 10mb Kompilat aus dem Anhang starte ist Font "verändert", wenn ich beiliegenden Source selbst kompiliere, auf Release eine 2mb Datei, da erscheint alles ohne Probleme.
|
AW: Listview, CustomDrawSubItem, Text wird schwarz
Zitat:
gruss |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Im Anhang ist das Projekt für viele Delphis verfügbar mit gleicher Font in allen Feldern. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Danke an alle! Insbesondere an KodeZwerg: Seine zuletzt gepostete Löung funktioniert eiwandfrei. Das Problem geistert ja seit mehreren Jahren durch diverse Foren und Newsgroups und wurde nie gelößt. Ich bin begeistert!
Edit: Die Lösung von himitsu funktioniert auch, wenn man sie leicht modifiziert: Sender.Canvas.Font.Assign(TListView(Sender).Font); Edit2: Die Lösung von himitsu funktioniert manchmal doch nicht. Beim nächsten Start ist der Text manchmal trotzdem fett. Ganz komisch. Die Lösung von KodeZwerg läuft immmer. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Defaultdraw False dann True scheint die Font zu beeinflussen.
Ich habe ja nichts gegen himitsus Vorschlag, nur bringt der leider nichts. Es muss effektiv einmal eine Fontveränderung eintreten sonst bleibts beim Fehler. Wenn Du die selbstgemalte Spalte nach ganz rechts verlagerst ist Fehler auch behoben. Freut mich das ich helfen konnte. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Das ist übrigens die Standardschrift die Windows setzt, wenn man ohne VCL arbeitet und man keine Schrift setzt*, entweder in der Dialog-Ressource oder im Fenster per Code. Ich nehme das OwnerDraw arbeitet ähnlich: "Du willst selber zeichnen? Dann musst du aber auch alles selber zeichnen. Und mir sagen, was du für eine Schrift willst."
*) Siehe dazu meine Screenshots aus meinen nonVCL Tutorials von den ersten Demos. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
DevExpress-Grigs und auch teilweise die VCL-Grids/List-Komponenten setzen oft vor den CustomDrawEvents den Pen/Brush/Font.
Klar, "falls" man dann im CustomDraw was Anderes setzt, ist das dann doppelt (Zeitverschwendung), aber es gibt weniger Probleme, vor allem wenn man dann doch nicht alles selber zeichnet. (z.B. nur Hintergrund- oder Textfarbe ändern und den Rest wieder das DefaulDraw machen lassen) |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Zitat:
![]() Dabei spielt es keine rolle ob man das über Win32 API mitteln macht oder in der VCL. Das andere ist alles ein Workaround mag funktionieren die Lösung ist aber nicht das gelbe vom Ei. (Meine persönliche Meinung) Wenn man schon OwnerDraw verwendet dann bitte richtig mit allen Konsequenzen. Zitat:
Ich möchte einen Porsche, Kohle fehlt also nehme ich einen Käfer und rüste ihn mit den Schlufen eines Porsche aus. So in etwa geht das hier ab. gruss |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Mit fehlt da die Erfahrung aber ich kenn da jemand der ist Experte in OwnerDraw hehe
Tutorials darüber sind auch rar gesät. |
AW: Listview, CustomDrawSubItem, Text wird schwarz
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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