Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wo bekomme ich Rect bei OnCustomDrawSubItem von TListView? (https://www.delphipraxis.net/117825-wo-bekomme-ich-rect-bei-oncustomdrawsubitem-von-tlistview.html)

marabu 27. Jul 2008 17:39

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
 
Liste der Anhänge anzeigen (Anzahl: 1)
Statt Prosa eine kleine Gehhilfe im Anhang.

Popov 27. Jul 2008 23:26

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
 
Zitat:

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.

Popov 27. Jul 2008 23:43

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
 
Zitat:

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;

rotfc 27. Jul 2008 23:55

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

Popov 28. Jul 2008 01:21

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
 
Ich hoffe nicht, daß das eine Antwort auf die Frage war.

marabu 28. Jul 2008 07:28

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:

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:

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:

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

extrem 28. Jul 2008 09:12

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

Zitat von marabu
Zitat:

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 :stupid:

Popov 28. Jul 2008 12:35

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

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.

Delphi-Quellcode:
 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.

marabu 28. Jul 2008 13:27

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
 
Hallo,

Zitat:

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

Popov 28. Jul 2008 16:29

Re: Wo bekomme ich Rect bei OnCustomDrawSubItem von TListVie
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:12 Uhr.
Seite 2 von 3     12 3      

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