Delphi-PRAXiS

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 TListView, in 1. Spalte Rechteck in bestimmter Farbe (https://www.delphipraxis.net/114911-tlistview-1-spalte-rechteck-bestimmter-farbe.html)

hoika 2. Jun 2008 19:23


TListView, in 1. Spalte Rechteck in bestimmter Farbe
 
Hallo,

wie der Titel schon sagt,
will ich die erste Spalte eines ListViews farbich darstellen.

OnAdvancedCustomDrawItem: keine Info
AdvancedCustomDrawSubItem: nur SubItems

Wie geh ich vor ?


Danke

Heiko

mkinzler 2. Jun 2008 19:27

Re: TListView (Caption) 1. Spalte farbich
 
Was meinst du mit kein Info?

hoika 2. Jun 2008 19:39

Re: TListView (Caption) 1. Spalte farbich
 
Hallo,

ich will SubItem 0, also die 1. Spalte farbich machen,
keine Info = keine Ahnung, was gerade gemalt wird.

Bei AdvancedCustomDrawSubItem wird das SubItem übergeben,
aber leider erst ab 1 (also das 1. SubItem).


Heiko

mkinzler 2. Jun 2008 20:59

Re: TListView (Caption) 1. Spalte farbich
 
OnAdvancedCustomDrawItem gilt für ein Item und seine SubItems.
Soll, das für diese nicht gelten, sorg in AdvancedCustomDrawSubItem dafür

IceTube 2. Jun 2008 21:01

Re: TListView (Caption) 1. Spalte farbich
 
Würd so gehen denke ich

Delphi-Quellcode:

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
//Farbige Zeilen
(Sender As TListView).Canvas.Brush.Color := clSilver;
(Sender As TListView).Canvas.Font.Color := clBlack;
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
//SubItem Color
(Sender As TListView).Canvas.Brush.Color := clWhite;
lg

hoika 2. Jun 2008 21:06

Re: TListView (Caption) 1. Spalte farbich
 
allo,

mklinzler

< OnAdvancedCustomDrawItem gilt für ein Item und seine SubItems. >
< Soll, das für diese nicht gelten, sorg in AdvancedCustomDrawSubItem dafür >

Ich will aber nicht in den SubItems malen,
sondern in der Caption (1. Spalte)
Ich bin schin drauf und dran, ein Dummy-Caption (Width=0) zu nehmen,
um dann das SubItem=1 als sichtbare 1. Spalte zu nehmen.

< IceCube >
Ich will in der 1. Spalte ein farbiges Rechteck malen,
dein Code malt die komplette Zeile in der Farbe.

So mache ich es gerade als Notlösung.


Heiko

mkinzler 2. Jun 2008 21:10

Re: TListView (Caption) 1. Spalte farbich
 
So meinte ich das ja auch

IceTube 2. Jun 2008 21:11

Re: TListView (Caption) 1. Spalte farbich
 
:shock:

Also..schau mal

Zitat:

Zitat von hoika
...will ich die erste Spalte eines ListViews farbich darstellen.

dann...

Zitat:

Zitat von hoika
..ich will SubItem 0, also die 1. Spalte farbich machen

und jetzt...

Zitat:

Zitat von hoika
Ich will in der 1. Spalte ein farbiges Rechteck malen..

Zitat:

Zitat von hoika
dein Code malt die komplette Zeile in der Farbe.

1. Ich heiße IceTube(nicht IceCube)
2. Weißt du anscheind nicht was du willst wie ich dir es oben gezeigt habe
3. Stell die richtige Frage
4. Was solln die Klammern???
5. Titel passt dann nicht!!!

Edit:
Wenn du ein "Rechteck" in der Zeile haben willst dann schau dir Canvas an, oder du erzeugst ein "TShape" und berechnest die Größe,Breite,etc. und fügst das in die 1. Spalte der Listview ein!


:/

hoika 2. Jun 2008 21:19

Re: TListView (Caption) 1. Spalte farbich
 
Hallo IceTube (jaja ;))

Der Titel sagt, ich will die 1. Spalte farbich.
Sämtliche OnDrawItem Methoden geben entweder nur das Item zurück,
dann kann ich nur die Zeile komplett malen,
oder im Falle von AdvancedCustomDrawSubItem erlauben es nur,
die SubItems zu malen.

Das Caption (1. Spalte) wird in AdvancedCustomDrawSubItem gar nicht aufgerufen,
klar heisst ja auch SubItem.

Ich werden das jetzt mal mit dem Dummy-Caption probieren,
die 1. sichtbare Spalte ist dann also das 1. SubItem.

Es sieht so aus, als ob Caption (1. Spalte des ListView) was besonderes ist.

In einem StringGrid läßt sich das viel einfacher machen
(habe ich auch schon gemacht), nur das ListView ist bockig.

Bitte kein Spruch VST benutzen,
will ich später auch,
aber die Umstellung ist so gross,
dass ich erst mal ne Cover-Klasse dafür basteln muss,
um nicht den ganzen Code umstellen zu müssen.


Ok ein Edit ;)
OK, Camvas ist ja da.
Wie bekomme ich denn das Rechteck raus ?
Width ist z.B. 20.


Heiko

mkinzler 2. Jun 2008 21:36

Re: TListView, in 1. Spalte Rechteck in bestimmter Farbe
 
Delphi-Quellcode:
     rect := Item.DisplayRect(drBounds);
     Sender.Canvas.Brush.Color := clBlue;
     Sender.Canvas.DrawFocusRect( Rect);

IceTube 2. Jun 2008 22:07

Re: TListView, in 1. Spalte Rechteck in bestimmter Farbe
 
Soo..hab dich falsch verstanden, jedoch weiß ich glaube ich jetzt was du genau meintest..

Hab mal den Code geschrieben:

Delphi-Quellcode:
procedure TForm1.ListView1AdvancedCustomDraw(Sender: TCustomListView;
  const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var rect : Trect;
  begin
//Anpassen
rect.Left := Listview1.Column[0].Width;
rect.Top := ListView1.Top;

//Färbt die 2 Spalte
Sender.Canvas.Brush.Color := clWhite;
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.Pen.Style := psClear;
Sender.Canvas.Pen.Color := clBlack;

Sender.Canvas.FillRect(Rect);

end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
(Sender As TListView).Canvas.Brush.Color := clWhite;
(Sender As TListView).Canvas.Font.Color := clBlack;
end;
Du musst halt noch die Sachen an dein Projekt anpassen, wichtig ist die ListView am anfang auf die Farbe zu setzen die du in der ersten Spalte haben möchtest...

lg

hoika 3. Jun 2008 06:54

Re: TListView, in 1. Spalte Rechteck in bestimmter Farbe
 
Hallo,

danke, ich habe mich leider nicht genau ausgedrückt.
Die Farbe der Spalte soll natürlich in Abhängigkeit des
jeweiligen ListItems gefärbt werden.

Jetzt habe ich folgende Situation.

Delphi-Quellcode:
procedure TForm.LV_DataAdvancedCustomDraw(
  Sender: TCustomListView; const ARect: TRect; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
ARect ist da, aber kein Item


Delphi-Quellcode:
procedure TForm.LV_DataAdvancedCustomDrawItem(
  Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
Item ist da, aber kein Rect, Item.DisplayRect (drLabel) bringt auch nichts.

Da muss ich wohl wirklich auf VST umsteigen,
Mann, Mann, Mann ;(


Heiko

bitsetter 3. Jun 2008 08:16

Re: TListView, in 1. Spalte Rechteck in bestimmter Farbe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hoika
Item ist da, aber kein Rect, Item.DisplayRect (drLabel) bringt auch nichts.

Warum bringt das nichts, habe es ausprobiert und es brachte was:

hoika 3. Jun 2008 08:39

Re: TListView, in 1. Spalte Rechteck in bestimmter Farbe
 
Hallo,

ahhhh,
nichts bringen war falsch ausgedrückt,
er hatte immer die komplette Ziele gefärbt.

Delphi-Quellcode:
Sender.Canvas.FillRect(r);
Sender.Canvas.Font.Color := Graphics.clBtnText;
Sender.Canvas.TextOut(r.Left + 2, r.Top, Item.Caption);
Sender.Canvas.Brush.Color := TListView(Sender).Color;
die letzte Zeile ist wichtig !

und hier noch mal der Code zum kopieren ;)

Delphi-Quellcode:
procedure TForm.LV_DataAdvancedCustomDrawItem(
  Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  Rect    : TRect;
 // ListItem.Data contains our own class
  DataItem : TDataItem;
begin
  DataItem:= Item.Data;
  if DataItem<>NIL then
  begin
    if DataItem.iColor>-1 then
    begin
      begin
        Rect:= Item.DisplayRect(drLabel);
        Sender.Canvas.Brush.Color := DataItemm.iColor;
        Sender.Canvas.FillRect(Rect);
        Sender.Canvas.Brush.Color := TListView(Sender).Color;

        Exit;
      end;
    end;
  end;
end; { LV_DataAdvancedCustomDrawItem }
Deine Unterscheidung nach selected oder nicht habe ich übrigens
absichtlich nicht drin, damit beim Blättern immer die Farbe angezeigt wird.


1000 Dank

jipppiiii :cheers:



Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 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