CustomDrawItem wird nicht angesprungen

Rund um die LCL und andere Komponenten
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

CustomDrawItem wird nicht angesprungen

Beitrag von catweasel »

Hallo

Ich habe hier ein ListView-Komponente die zur Laufzeit erstellt wird und auch mit Daten gefüllt wird. Das funktioniert soweit auch sehr gut.
Als Erweiterung wollte ich jetzt, das jede zweite Zeile andersfarbig dargestellt wird und habe dazu eine CustomDrawItem Procedure eingefügt.
Leider wird die aber überhaupt nicht angesprungen. Sieht jemand was ich hier falsch mache?

Gruß
Michael

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ComCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
  { TMyListView }
  TMyListView=class(TListView)
    procedure LVCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
  end;
 
 
var
  Form1: TForm1; 
  LV   : TMyListView;
 
implementation
 
{ TForm1 }
 
 
 
{ TMyListView }
procedure TMyListView.LVCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
const
  cStripe = $CCFFCC;
begin
  showmessage('LVCustomDrawItem');
  if Odd(Item.Index) then LV.Canvas.Brush.Color := cStripe  // Grün
                     else LV.Canvas.Brush.Color := clWindow;  //Weiss
end;
 
 
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  LV := TMyListView.Create(form1);
  LV.Top      :=30;
  LV.Left     :=20;
  LV.Width    :=200;
  LV.Height   :=150;
  LV.Visible  :=true;
  LV.ViewStyle:=vsReport;
  LV.GridLines:=true;
  LV.Columns.Add;
  LV.Column[0].Caption:='Status';
  LV.Columns.Items[0].Width:=80;
  LV.Columns.Items[0].AutoSize:=true;
  LV.RowSelect:=true;
  LV.Parent   :=Form1;
 
  //schreibe was ins ListView
  for i:=1 to 20 do begin
      LV.Items.Add;
      LV.Items.Item[i-1].Caption:='blabla';
  end;
end;
 
 
initialization
  {$I unit1.lrs}
 
end.

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: CustomDrawItem wird nicht angesprungen

Beitrag von shokwave »

Hi,

sieht so aus als hättest du vergessen dem Event deine Prozedur zuzuweisen. Bastel dir einen Constructor und schreib

Code: Alles auswählen

TMyListView.OnCustomDrawItem:=@TMyListView.LVCustomDrawItem;
mit dazu.
mfg Ingo

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: CustomDrawItem wird nicht angesprungen

Beitrag von catweasel »

shokwave hat geschrieben:sieht so aus als hättest du vergessen dem Event deine Prozedur zuzuweisen. Bastel dir einen Constructor und schreib

Code: Alles auswählen

TMyListView.OnCustomDrawItem:=@TMyListView.LVCustomDrawItem;
mit dazu.
Ich kriegs nicht hin. :(
Hast Du ein Beispiel wie das im Detail aussehen muß? Ich habe noch nicht mit Constructor gearbeitet.

Michael

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: CustomDrawItem wird nicht angesprungen

Beitrag von shokwave »

Ungefähr so, hab ich gemeint.

Code: Alles auswählen

{ TMyListView }
  TMyListView=class(TListView)
    constructor Create;
    procedure LVCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
  end;
 
...
implementation
...
 
constructor  TMyListView.Create;
begin
  inherited Create;
 
  TMyListView.OnCustomDrawItem:=@TMyListView.LVCustomDrawItem;
end;
mfg Ingo

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: CustomDrawItem wird nicht angesprungen

Beitrag von theo »

Wenn du schon eh eine Klasse ableitest, wäre es eig. besser die Methode zu überschreiben, anstatt den Eventhandler einzuhängen:

Code: Alles auswählen

{ TMyListView }
 
  TMyListView=class(TListView)
  protected
    function CustomDrawItem(AItem: TListItem; AState: TCustomDrawState; AStage: TCustomDrawStage): Boolean; override;
  end;     
 
...
implementation       
...
 
{ TMyListView }
 
function TMyListView.CustomDrawItem(AItem: TListItem; AState: TCustomDrawState;
  AStage: TCustomDrawStage): Boolean;
begin
   //Hier was tun
   Result:=inherited CustomDrawItem(AItem, AState, AStage);
end;

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: CustomDrawItem wird nicht angesprungen

Beitrag von catweasel »

Danke für Eure Hilfe. Ich werde es heute Abend in meinem Programm testen :)

Gruß
Michael

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: CustomDrawItem wird nicht angesprungen

Beitrag von catweasel »

theo hat geschrieben:Wenn du schon eh eine Klasse ableitest, wäre es eig. besser die Methode zu überschreiben, anstatt den Eventhandler einzuhängen:
[...]
Hat leider nicht das erhoffte Ergebnis gebracht. Wie zuvor wird die Routine CustomDrawItem nicht angesprungen. Ich habe es auch mit CustomDrawSubItem getestet, aber das gleiche Ergebnis :(

So sieht der Code zur Zeit aus:

Code: Alles auswählen

{ TMyListView }
  TMyListView=class(TListView)
    protected
      function CustomDrawItem(AItem: TListItem; AState: TCustomDrawState; AStage: TCustomDrawStage): Boolean; override;
    private
    { private declarations }
    public
    { public declarations }
    published
    end;
 
 
var
  Form1: TForm1; 
  LV   : TMyListView;
 
implementation
 
{ TForm1 }
 
 
{ TMyListView }
function TMyListView.CustomDrawItem(AItem: TListItem; AState: TCustomDrawState;
  AStage: TCustomDrawStage): Boolean;
const
  cStripe = $CCFFCC;
begin
  inherited;
  showmessage('LVCustomDrawItem');
  if Odd(AItem.Index) then LV.Canvas.Brush.Color := cStripe
                      else LV.Canvas.Brush.Color := clWindow;
  Result:=inherited CustomDrawItem(AItem, AState, AStage);
end;

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: CustomDrawItem wird nicht angesprungen

Beitrag von theo »

Probier's doch erstmal mit einer Entwurfszeit-Komponente.
Das hängt schon alles ein bisschen zusammen. Z.B.
Im Reportmode wird CustomDrawSubItem nur aufgerufen, wenn mind. zwei Columns da sind. etc.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: CustomDrawItem wird nicht angesprungen

Beitrag von catweasel »

theo hat geschrieben:Probier's doch erstmal mit einer Entwurfszeit-Komponente.
Das hängt schon alles ein bisschen zusammen. Z.B.
Im Reportmode wird CustomDrawSubItem nur aufgerufen, wenn mind. zwei Columns da sind. etc.
Bin schon dabei :)

Antworten