AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wo bekomme ich Rect bei OnCustomDrawSubItem von TListView?
Thema durchsuchen
Ansicht
Themen-Optionen

Wo bekomme ich Rect bei OnCustomDrawSubItem von TListView?

Ein Thema von Popov · begonnen am 25. Jul 2008 · letzter Beitrag vom 29. Jul 2008
Antwort Antwort
Seite 2 von 3     12 3      
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#11

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 27. Jul 2008, 18:39
Statt Prosa eine kleine Gehhilfe im Anhang.
Angehängte Dateien
Dateityp: zip lvcstdrw_211.zip (1,9 KB, 20x aufgerufen)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#12

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 00:26
Zitat von extrem:
Für die erste 3 brauchst du doch eigentlich nicht auf dem TCanvas zeichnen, sondern nur die Farbe vom Hintergrund ändern.
Ja, es sieht zwar so aus, aber 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 eigentlich sollte ein Rechteck gezeichnet werden. Es geht in den ersten drei Beispielen nicht drum nur den Hintergrund zu ändern. Alle vier Beispiele haben den gleichen Code. Der ändert sich nur bei DefaultDraw := True; oder False; und menge der Spalten.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#13

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 00:43
Zitat von marabu:
Statt Prosa eine kleine Gehhilfe im Anhang.
Ich versuche noch das Besondere an deinem Code zu finden, denn viel anders habe ich nicht programmiert. Auch ich habe nur mit Wasser gekocht, bis auf, daß ich eine Grafik zeichnen will. Ich prüfe dein Code noch etwas genauer, aber ich sehe nicht was ich in Gegensatz falsch gemacht habe.

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;
  Mit Zitat antworten Zitat
rotfc
(Gast)

n/a Beiträge
 
#14

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 00:55
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...
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#15

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 02:21
Ich hoffe nicht, daß das eine Antwort auf die Frage war.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 08:28
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 von Popov:
... Füg mal deinem Code diese Zeilen bei ...
Genau diese Zeilen verstoßen gegen die Regel. Nochmal mit anderen Worten: Du darfst in deinen CustomDraw-Routinen nichts auf dem Canvas ausgeben, oder du musst gleich die komplette Arbeit übernehmen. In Beitrag #6 ist das auch schon angedeutet worden. Keine Ahnung, ob das in jüngeren Delphi-Versionen geändert wurde. Da nehme ich die Aussage von extrem einfach mal so hin.

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 von Popov:
... Im vierten Beispiel mit DefaultDraw := False;. Die Grafik wird korrekt gezeichnet, aber die Texte davor werden nicht ausgegeben.
Vielleicht weißt du es nicht: Mit DefaultDraw steuerst du auch und besonders die Textausgabe mit DrawText().

Zitat von rotfc:
Steckt doch bitte *Beide* die Faust in die Tasche und zählt dann bis Zehn.
Das verstehe ich nicht, Roland. Hast du eventuell im falschen Thread gepostet?

Freundliche Grüße
  Mit Zitat antworten Zitat
extrem

Registriert seit: 27. Mai 2008
72 Beiträge
 
#17

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 10:12
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 von Popov:
... Im vierten Beispiel mit DefaultDraw := False;. Die Grafik wird korrekt gezeichnet, aber die Texte davor werden nicht ausgegeben.
Da hast du aber auch in jeder Spalte DefaultDraw auf False gesetzt, auch in denen du das Rechteck nicht zeichnen möchtest oder nicht?

Zitat von marabu:
Zitat von rotfc:
Steckt doch bitte *Beide* die Faust in die Tasche und zählt dann bis Zehn.
Das verstehe ich nicht, Roland. Hast du eventuell im falschen Thread gepostet?
Nicht der erste Beitrag solcher Art von ihm
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#18

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 13:35
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 von marabu:
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 von Popov:
... Füg mal deinem Code diese Zeilen bei ...
Genau diese Zeilen verstoßen gegen die Regel. Nochmal mit anderen Worten: Du darfst in deinen CustomDraw-Routinen nichts auf dem Canvas ausgeben, oder du musst gleich die komplette Arbeit übernehmen. In Beitrag #6 ist das auch schon angedeutet worden. Keine Ahnung, ob das in jüngeren Delphi-Versionen geändert wurde. Da nehme ich die Aussage von extrem einfach mal so hin.
So langsam bekomme ich mit was du sagen willst, allerdings kann ich die Regel so nicht in der Hilfe erkennen. Da steht zwar: "Setzen DefaultDraw auf false, wenn das Steuerelement den Text der Unterelemente nicht zeichnen soll, nachdem die Ereignisbehandlungsroutine beendet ist.", was bedeuten soll, daß bei False der Text nicht ausgegeben wird, man es also selbst machen muß, aber die klare Aussage, daß man nicht zeichnen soll, die kann ich nicht erkennen. Vielleicht sehe ich vor lauter Bäume den Wald nicht. Ich glaube dir, aber woher hast du die Info? Ich frage nur interessehalber.

Zitat:
Mein Code zeigt, wie du die ersten drei Beispiele aus deinem Beitrag #9 ohne seltsame Effekte kodieren kannst.
Dein Code ist interessant, da ich ich bei ListView noch nie Farben eingesetzt habe und das jetzt auch tun wollte, so daß du mir ein nettes Beispiel geliefert hat.

 Rectangle() ist eine Ausgabe und wenn du daran festhalten willst, dann musst du das Zeichnen der Subitems vollständig selbst übernehmen. 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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#19

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 14:27
Hallo,

Zitat von Popov:
... So langsam bekomme ich mit was du sagen willst, allerdings kann ich die Regel so nicht in der Hilfe erkennen. ...
Ich glaube dir, aber woher hast du die Info? ...
mit der Hilfe ist das immer so eine Sache. Sie wird in der Regel nicht vom Entwickler geschrieben, sondern von einem Technical Writer. Dann kommt noch die Übersetzung hinzu und schon können Feinheiten verloren gehen. Ich bin vor Jahren (D4?) einmal über dein Problem gestolpert und habe mir diese Regel zurecht gelegt. Wenn das Verhalten in neueren Versionen von Delphi geändert wurde, dann scheint es sich wohl um einen VCL-Quirk by Design zu handeln. Ich kann damit leben.

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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#20

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie

  Alt 28. Jul 2008, 17:29
Um ganz ehrlich zu sein bin ich etwas ratlos was man da nehmen soll.

Code:
OnAdvancedCustomDraw
OnAdvancedCustomDrawItem
OnAdvancedCustomDrawSubItem

OnCustomDraw
OnCustomDrawItem
OnCustomDrawSubItem

OnDrawItem
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.

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 01:25 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