![]() |
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 ![]() Nach dem Ziehen der Symbolspalte --> Wäähhh!! ![]() Code der dafür verantwortlich ist:
Delphi-Quellcode:
Wie löse ich das 'Neuzeichnen' einer Listview richtig aus, sodaß die Symbole nur an den Positionen erscheinen wo sie auch hingehören?? :gruebel:
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. Bitte um Hilfe und gute Ideen... :wink: LG Thomas |
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 ![]() Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz