Einzelnen Beitrag anzeigen

bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#1

Probleme beim Neuzeichnen von Symbolen in der Listview...

  Alt 16. Okt 2007, 08:06
Hallo Experten!!

Ich habe eine Listview (Style: Report), in der ich in gewissen Columns Symbole zeichnen will. Wenn die ListView angezeigt wird, sieht die Darstellung wie gewünscht aus. Wenn man jedoch an der Spalte zieht und somit die Breite verändert, kommt es zu merkwürdigen Seiteneffekten. So wird vorallem beim Vergrößern der Symbol-Spalte, die Symbole selbst ein zweites Mal gezeichnet.

Siehe Bilder....

Nach Start --> OK
http://www.bos.at/downloads/Listview1.jpg

Nach dem Ziehen der Symbolspalte --> Wäähhh!!
http://www.bos.at/downloads/Listview2.jpg

Code der dafür verantwortlich ist:
Delphi-Quellcode:
unit FMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ExtCtrls, Collect, StdCtrls;

type
  TfmMain = class(TForm)
    lvData: TListView;
    imOK: TImage;
    imNOK: TImage;
    nbBrowse: TButton;
    procedure FormCreate(Sender: TObject);
    procedure lvDataAdvancedCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      Stage: TCustomDrawStage; var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmMain: TfmMain;

(* ========================================================================== *)

implementation

{$R *.DFM}

procedure TfmMain.FormCreate(Sender: TObject);
var
  lListItem : TListItem;
  i : Integer;
begin
  for i := 0 to 9 do begin
    lListItem := lvData.Items.Add;
    lListItem.Caption := 'Bez1';
    lListItem.SubItems.Add('Bez2');
  end;
end;

(* +------------------------------------------------------------------------+ *)

procedure TfmMain.lvDataAdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  lRect : TRect;

procedure PaintCB;
var
  i : Integer;
begin

  if (cdsSelected in State) then begin
    imOk.Canvas.Brush.Color := clHighlight;
  end else begin
    imOk.Canvas.Brush.Color := clWindow;
  end;

  Sender.Canvas.Draw(lvData.Columns[0].Width + lvData.Columns[1].Width +
                     ((lvData.Columns[2].Width - imOk.Width) div 2),
                     lRect.Top, imOk.Picture.Bitmap);
end;

begin
  if (SubItem = 2) then begin
    lRect := Item.DisplayRect(drSelectBounds);
    PaintCB;
    DefaultDraw := true;
  end;
end;

end.
Wie löse ich das 'Neuzeichnen' einer Listview richtig aus, sodaß die Symbole nur an den Positionen erscheinen wo sie auch hingehören??

Bitte um Hilfe und gute Ideen...

LG
Thomas
  Mit Zitat antworten Zitat