AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Probleme beim Neuzeichnen von Symbolen in der Listview...
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Neuzeichnen von Symbolen in der Listview...

Offene Frage von "bingo72"
Ein Thema von bingo72 · begonnen am 16. Okt 2007 · letzter Beitrag vom 16. Okt 2007
Antwort Antwort
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, 09: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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Probleme beim Neuzeichnen von Symbolen in der Listview..

  Alt 16. Okt 2007, 11:48
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 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