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 Probleme beim Neuzeichnen von Symbolen in der Listview... (https://www.delphipraxis.net/101597-probleme-beim-neuzeichnen-von-symbolen-der-listview.html)

bingo72 16. Okt 2007 08:06


Probleme beim Neuzeichnen von Symbolen in der Listview...
 
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?? :gruebel:

Bitte um Hilfe und gute Ideen... :wink:

LG
Thomas

marabu 16. Okt 2007 10:48

Re: Probleme beim Neuzeichnen von Symbolen in der Listview..
 
Hallo Thomas,

du musst nach meiner Einschätzung auf das Verändern der Spaltenbreite reagieren. Die ListView ist ein composite control, die Breite einer Spalte wird eigentlich über ein header control manipuliert. Dieses header control ist ein child window mit Namen SysHeader32 und generiert Nachrichten, wenn die Spaltentrenner angefasst und verschoben werden. Du kannst statt des normalen TListView das erweiterte TPBExListView von Peter Below (TeamB) verwenden, dort sind diese Feinheiten bereits implementiert.

Freundliche Grüße


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