![]() |
Wo bekomme ich Rect bei OnCustomDrawSubItem von TListView?
Ich hab vor in ListView in einer Spalte etwas zu zeichnen. Soweit ist ja alles vorhanden, nur der Rect-Wert des SubItems fehlt mir.
Kann mir einer sagen wie ich an den drankomme? |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Eine Möglichkeit wäre mit ListView_GetSubItemRect.
Delphi-Quellcode:
...
var SubItemRect: TRect; begin if CommCtrl.ListView_GetSubItemRect(Sender.Handle, item.Index, 1, LVIR_LABEL, @SubItemRect) then ... |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Ach, da kommt ListView_GetSubItemRect her. Die Funktion ist mir bei der Suche im Internet schon öfters aufgefallen, aber ich konnte sie nirgendwo zuordnen, da sie ohne CommCtrl nicht funktioniert und in keinem Beispiel auf die Unit hingewiesen wurde. Hats mir auf jeden Fall sehr geholfen.
Ähm, wo wir schon dabei sind, sehe gerade etwas, du weißt nicht zufällig wieso nach dem Einsatz in OnCustomDrawSubItem die restlichen SubItems fett geschrieben werden? |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Hallo,
vielleicht hast du den Font-Style in einer deiner CustomDraw-Routinen verändert und nicht wieder zurückgesetzt. Grüße vom marabu |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Eigentlich nicht. Ich greife nur auf OnCustomDrawSubItem zu und dort nur auf eine Spalte. Und in der Zeichne ich nur ein Rechteck.
Die Folge ist, daß alle Spalten danach fette Schrift (eventuell auch Terminal Schrift die nur fett aussieht) haben. |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Welche Delphiversion hast du?
Das Phänomen tritt anscheinend nur bei Versionen kleiner Delphi 10 auf, wenn man versucht auf dem Canvas des TListView zu zeichnen. |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Zitat:
Meinst du es ist ein Versionsbug? |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Hallo,
unter D7 kann man bei den Ereignissen OnCustomDrawItem() und OnCustomDrawSubItem() nur Konfigurationen vornehmen, keine Canvas-Ausgaben - es sei denn man schaltet DefaultDrawing aus und malt alles selbst. Eines verstehe ich nicht: Wenn du Rectangle() für ein SubItem verwendest, dann musst du doch sowieso selbst malen, sonst wischt dir das DefaultDrawing doch alles wieder weg. Ich würde lediglich den Hintergrund einfärben und auf den Rahmen verzichten - da erspart man sich eine Menege an Arbeit. Freundliche Grüße |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
![]() Vier 4 Beispiele. EDIT Anfang: in allen Beispielen soll ein Rechteck in der fünften Spalte gezeichnet werden. In den ersten drei Beispielen wird zwar der Hintergrund verändert, aber kein Rechteck gezeichnet. Es geht in den ersten drei Beispielen nicht drum nur den Hintergrund zu ändern. EDIT Ende. Die ersten drei mit DefaultDraw := True;. Im ersten Beispiel ist der Text ok. In der fünften Spalte mit der Grafik hat der Hintergrund die Farbe von Brush.Color angenommen. Es wird auch in der sechsten leeren Spalte der Hintergrund verändert, obwohl die das nichts ein soll. Im zweiten Beispiel fehlt die sechste Spalte. Dafür werden alle Texte in einer anderen Schrift geschrieben. Im dritten Beispiel habe ich eine sechste und siebte Spalte erstellt, dieses Mal mit Text. Alle Texte vor der fünten Spalte haben jetzt normale Schrift, dafür haben die sechste und siebte Spalte eine falsche Schrift. Im vierten Beispiel mit DefaultDraw := False;. Die Grafik wird korrekt gezeichnet, aber die Texte davor werden nicht ausgegeben. |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Für die erste 3 brauchst du doch eigentlich nicht auf dem TCanvas zeichnen, sondern nur die Farbe vom Hintergrund ändern.
Delphi-Quellcode:
Nur beim 4. Beispiel müsstest du wegen dem Rahmen auf dem TCanvas zeichnen. Außerdem müsstest du doch auch dann die Subitems abfragen und je nach dem DefaultDraw aktivieren oder nicht.
if SubItem = 4 then
Sender.Canvas.Brush.Color:= clBlue else Sender.Canvas.Brush.Color:= graphics.clBtnHighlight |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Liste der Anhänge anzeigen (Anzahl: 1)
Statt Prosa eine kleine Gehhilfe im Anhang.
|
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Zitat:
|
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Zitat:
Edit: Füg mal deinem Code diese Zeilen bei:
Delphi-Quellcode:
procedure TDemoForm.ListViewCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); var R: TRect; begin with Sender.Canvas do begin Font.Style := Font.Style - [fsBold]; Brush.Color := clWindow; Font.Color := clBlack; case SubItem of 1: Font.Style := Font.Style + [fsBold]; 2: Brush.Color := clYellow; 3: Font.Color := clRed; end; if SubItem = 4 then begin //uses CommCtrl CommCtrl.ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @R); with R do Rectangle(Left, Top, Left + 100, Bottom); end; end end; |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Steckt doch bitte *Beide* die Faust in die Tasche und zählt dann bis Zehn.
von 0 bis 9 oder von 1 bis 10 :-) Müde bin ich, geh zur Ruh', decke meine beiden Äuglein zu... |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Ich hoffe nicht, daß das eine Antwort auf die Frage war.
|
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Moin, Popov.
Mit dem Code aus Beitrag #11 wollte ich meine Prosa aus Beitrag #8 untermauern. Das Besondere an diesem Code sind nicht die vorhandenen Zeilen, sondern die nicht vorhandenen. Zitat:
Mein Code zeigt, wie du die ersten drei Beispiele aus deinem Beitrag #9 ohne seltsame Effekte kodieren kannst. Rectangle() ist eine Ausgabe und wenn du daran festhalten willst, dann musst du das Zeichnen der Subitems vollständig selbst übernehmen. Den Aufwand würde ich mir ersparen, da Rectangles nicht sehr ästhetisch rüber kommen, wenn sie sich berühren. Zitat:
Zitat:
Freundliche Grüße |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Du könntest ansonsten auch das Ereignis onAdvancedCustomDrawSubItem anstatt onCustomDrawSubItem verwenden, da hast du dann wenigstens nicht die Probleme mit dem fetten Text und der falschen Darstellung.
Zitat:
Zitat:
![]() |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Mal eines vorweg, da es wohl kleine Missverständnisse gibt und immer wieder drauf eingegangen wird - ich hab nicht vor nur ein Rechteck zu zeichnen. Das Rechteck ist nur ein einfaches Beispiel, später wird ein Diagramm gezeichnet. Nur habe ich die Routine noch nicht programmiert und deshalb behelfe ich mir mit einem kleinen Rechteck. Also jetzt keine Empfehlungen bezüglich Rechtecke und Ästhetik, das wird später anders gemacht.
Zitat:
Zitat:
Delphi-Quellcode:
Aber die Grafik hat vorerst die höhere Priorität. Ich experimentiere noch ein wenig. Das Problem ist, daß ich viele ListViews und mir dann viel Arbeit mache wenn ich alle die Texte selbst ausgebe, aber wenn es sein muß, dann muß es sein.
Rectangle() ist eine Ausgabe und wenn du daran festhalten willst, dann musst du das Zeichnen der Subitems vollständig selbst übernehmen.
|
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Hallo,
Zitat:
Das ungeliebte Rectangle() ist auch bei mir nur als Platzhalter zu verstehen - gemeint ist jede Art von Ausgabe auf dem Canvas, also auch das Zeichnen eines Diagramms. Falls das mit den AdvancedCustomDraw-Ereignissen reibungslos funktioniert, würde ich bei Gelegenheit nochmal etwas Zeit für das Quellenstudium investieren. Ansonsten gehe ich davon aus, dass sich dieses VCL-Design nicht mit zwei Zeilen Code abändern lässt. Freundliche Grüße |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Um ganz ehrlich zu sein bin ich etwas ratlos was man da nehmen soll.
Code:
Das was man nehmen könnte funktioniert nicht so wie es soll, alles andere funktioniert, aber man muß sich in Arbeit stürzen. Für OnDrawItem muß ich OwnerDraw auf true setzen, muß dann aber auch alles selbst zeichnen, vor allem auch den Text. Da ich aber nur in einem SubItem etwas zeichnen will, erscheint mir OnCustomDrawSubItem interessant. Warum etwas anderes nehmen um dann selbst den Text ausgeben, wenn hier rein theoretisch das richtige Ereignis vorliegt. Die Fehler sind bekannt. Leicht besser, aber auch nicht fehlerfrei ist OnAdvancedCustomDrawSubItem. Hier wird zumindest nicht der Text aller Items und SubItems mit falscher Schrift ausgegeben, somit zumindest zum Teil ok, aber wenn nach dem Subiten ein weiterer Subitem folgt, dann ist das Problem mit der Schrift wieder da.
OnAdvancedCustomDraw
OnAdvancedCustomDrawItem OnAdvancedCustomDrawSubItem OnCustomDraw OnCustomDrawItem OnCustomDrawSubItem OnDrawItem Rein theoretisch könnte ich mit OnAdvancedCustomDrawSubItem leben, da ich meine Grafik im letzten Subitem ausgebe, das Problem tritt also hier nicht auf, allerdings kann es sein, daß ich mich entschließe doch noch ein SubItem hinzu zu fügen und dann habe ich das Problem. Also irgendwie muß es doch gehen. |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Und weil ein Unglück selten alleine kommt, funktioniert bsSolid bei Brush nicht.
![]() Wahrscheinlich muß ich es erst auf einer Bitmap zeichnen und dann kopieren. |
Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 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