ListView - problem przy ręcznej zmianie szerokości kolumny

0

Mam ListView oraz obsługę zdarzenia OnDrawItem. Po dodaniu komórek wszystko ładnie wygląda. Problem pojawia się w momencie zmiany szerokości jakiejkolwiek kolumny ręcznie (pozostaje ślad po poprzednim wypełnieniu). W jaki sposób wymusić odświeżanie komponentu ListView przy zmianie szerokości kolumn przy jednoczesnej obsłudze zdarzenia OnDrawItem.

Szukałem na Forum :( ale nie znalazłem odpowiedzi.

0

słyszałoś coś gdzieś kiedyś o czymś takim co zwie się jakoś tak: Invalidate

0

Dzięki za podpowiedź. Możesz jeszcze dodać jakiś przykładowy kod. :)

0

Dodaję gotowy przykład (po drobnych modyfikacjach) - znaleziony na stronie:
http://www.delphipages.com/threads/thread.cfm?ID=71867&G=71794


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Db, DBCtrls, DBTables, ExtCtrls, Mask, ComCtrls, ImgList;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ListView1: TListView;
   ProgressBar0: TProgressBar;
   ProgressBar2: TProgressBar;
   ProgressBar1: TProgressBar;
   procedure ListView1DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState);
   procedure FormCreate(Sender: TObject);
 private
   FColumns: array of integer;
   procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState);
begin
  if not item.Selected then
  begin
    ListView1.Canvas.Font.Color := clNavy;
    ListView1.Canvas.Brush.Color := clWhite;
    ListView1.Canvas.FillRect(Rect);
    ListView1.Canvas.TextOut(Rect.Left + 10, Rect.Top, Item.Caption);
    ListView1.Canvas.TextOut(Rect.Left + ListView1.Columns.Items[0].Width, Rect.Top, '  ' + Item.SubItems[0]);
    ListView1.Canvas.TextOut(Rect.Left + ListView1.Columns.Items[0].Width + ListView1.Columns.Items[1].Width, Rect.Top, '  ' + Item.SubItems[1]);
    ListView1.Canvas.TextOut(Rect.Left + ListView1.Columns.Items[0].Width + ListView1.Columns.Items[1].Width + ListView1.Columns.Items[2].Width, Rect.Top, '  ' +  Item.SubItems[2]);
  end;
  if item.Selected then
  begin
    ListView1.Canvas.Font.Color := clYellow;
    ListView1.Canvas.Brush.Color := clGreen;
    ListView1.Canvas.FillRect(Rect);
    ListView1.Canvas.TextOut(Rect.Left + 10, Rect.Top, Item.Caption);
    ListView1.Canvas.TextOut(Rect.Left + ListView1.Columns.Items[0].Width, Rect.Top, '  ' + Item.SubItems[0]);
    ListView1.Canvas.TextOut(Rect.Left + ListView1.Columns.Items[0].Width + ListView1.Columns.Items[1].Width, Rect.Top, '  ' + Item.SubItems[1]);
    ListView1.Canvas.TextOut(Rect.Left + ListView1.Columns.Items[0].Width + ListView1.Columns.Items[1].Width + ListView1.Columns.Items[2].Width, Rect.Top, '  ' + Item.SubItems[2]);
  end;
end;

procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean);
var
 reset: boolean;
 i: integer;
begin
 reset := false;
 if length(FColumns) <> ListView1.Columns.Count then
   reset := true
 else begin
   for i := 0 to ListView1.Columns.Count - 1 do
     if FColumns[i] <> ListView1.Columns[i].Width then begin
       reset := true;
       break;
     end;
 end;
 if reset then begin
   ListView1.Invalidate;
   SetLength(FColumns, ListView1.Columns.Count);
   for i := 0 to ListView1.Columns.Count - 1 do
     FColumns[i] := ListView1.Columns[i].Width;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnIdle := ApplicationIdle;
end;

end.
0

Czyli komponent TListView jest także zrypany.

Jest standardowy komunikat: HDN_ITEMCHANGED, który informuje o zmianie szerokości kolumny.
Trzeba to uwzględnić w kodzie TListView... dodać, poprawić, uzupełnić, zmodyfikować i skompilować całe VCL - albo przerzucić się na inną platformę, bez takich niedoróbek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1