Avatar billede hermandsen Juniormester
04. maj 2003 - 20:46 Der er 4 kommentarer og
1 løsning

Paint-problemer på TListView når en Column ændrer bredde

Hej Eksperter!!

Jeg sidder og prøver at lave en statusbar i en TListView som skal fortælle hvor langt programmet er med noget download-pjat, men når man ændrer bredden på kolonnerne kan der komme nogle underlige fejl...

http://hermandsen.homepage.dk/progressbar.png
Jeg har lagt lidt eksempelkode her:
http://hermandsen.homepage.dk/progressbar.zip

Til copy/pasterne ser det således ud (lv er navnet på mit TListView):

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  Item: TListItem;
begin
  Randomize;
  for I := 0 to 9 do  //Indsætter nogle tilfældige items
  begin
    Item := lv.Items.Add;
    Item.Caption := 'Hest';
    Item.SubItems.Add(IntToStr(Random(101)));
  end;
end;

procedure TForm1.lvCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  V, W, I: Integer;
  Rect, Rect2: TRect;
begin
  if (SubItem <> 1) then Exit;

  W := Sender.Column[SubItem].Width;
  V := StrToInt(Item.SubItems[SubItem-1]);
  Rect := Item.DisplayRect(drBounds);  //firkanten som Item'en bliver vist i
  for I := 0 to SubItem -1 do  //Vi finder firkanten for vores SubItem
    Rect.Left := Rect.Left + Sender.Column[I].Width;

  Rect2 := Rect;  //Lidt udregninger
  Rect2.Right := Rect2.Left + W;
  Rect.Right := Rect.Left + V*W div 100;
  Rect2.Top := Rect2.Top + 1;
  Rect.Top := Rect.Top + 1;

  DefaultDraw := False;
  with Sender.Canvas do
  begin
    Brush.Style := bsSolid; //Først tegner vi den grå kasse
    Brush.Color := $D0D0D0;
    FillRect(Rect2);

    Brush.Color := $FF6060; //Så tegner vi den blå kasse
    Brush.Style := bsSolid;
    FillRect(Rect);
    Brush.Color := clBlack;
    FrameRect(Rect2);

    Refresh; //Inden vi kan skrive teksten skal billedet opdateres
    Brush.Style := bsClear;
    Font.Name := 'Tahoma';
    Font.Color := clBlack;
    TextOut(Rect2.Left + ((Rect2.Right - Rect2.Left) div 2) - (Length(Item.SubItems[0] + '%') * 6 div 2), Rect2.Top, Item.SubItems[0] + '%');
  end;
end;

Hvordan får jeg programmet til at lade være med at painte progressbarene i andre kolonner end den hvor den hører hjemme!?

Håber det gav mening...

//hermandsen
Avatar billede borrisholt Novice
05. maj 2003 - 08:33 #1
Den tegner i forvejen kun dem op der er snavsede !

Jens B
Avatar billede hermandsen Juniormester
06. maj 2003 - 08:14 #2
Ikke her...

Jeg har fundet en metode til at optegne den på når jeg slipper musen fra trækket, men ikke når jeg trækker...

uses
  CommCtrl, Messages;

private
  procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;

procedure TForm1.WMNotify(var Msg: TWMNotify);
begin
  inherited;
  if Msg.NMHdr^.code = HDN_ENDTRACK then
  begin
    lv.Invalidate;
    lv.Refresh;
  end;
end;

Det nytter heller ikke at undersøge om Msg.NMHdr^.code = HDN_TRACK, for det ændrer intet...
Avatar billede borrisholt Novice
06. maj 2003 - 08:31 #3
Send mig lige koden så tester jeg det på 2000
Avatar billede hermandsen Juniormester
06. maj 2003 - 10:40 #4
Sendt!!
Avatar billede hermandsen Juniormester
11. maj 2003 - 17:19 #5
Lukker igen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester