Autor Téma: Listview data-TImage  (Přečteno 282 krát)

Offline petin67

  • Nováček
  • *
  • Příspěvků: 4
  • Karma: 0
    • Verze Delphi: D7
Listview data-TImage
« kdy: 24-03-2024, 18:48:04 »
Zdravím vespolek,

mám kód, kde potřebuji zobrazovat TImage v Listwiew.
Pokud přidám položky, pak vyberu některou z nich a tlačítkem aktualizuji, tak je to ok - mění se barva obrázku.
Pokud vyberu položku např. s ID 3, tu odstraním, tak už nelze měnit barvu obrázku u položky s ID 4, ostatní ano.
Pokud vložím další položku (vloží se s volným ID 3), tak u ní nelze měnit barvu,  u ostatních včetně ID4 ano.
Poradí někdo?

Kód níže a v příloze...

Díky
Petr


Kód: Delphi [Vybrat]
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, ImgList, StdCtrls, ExtCtrls, Math;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     lv1: TListView;
  12.     btnDel1: TButton;
  13.     il1: TImageList;
  14.     mmo1: TMemo;
  15.     lbl1: TLabel;
  16.     btnAdd1: TButton;
  17.     btnRefresh1: TButton;
  18.     procedure lv1CustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);
  19.     procedure btnDel1Click(Sender: TObject);
  20.     procedure lv1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
  21.     procedure btnAdd1Click(Sender: TObject);
  22.     procedure lv1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
  23.     procedure lv1CustomDrawItem(Sender: TCustomListView; Item: TListItem;
  24.       State: TCustomDrawState; var DefaultDraw: Boolean);
  25.     procedure btnRefresh1Click(Sender: TObject);
  26.   private
  27.     { Private declarations }
  28.     procedure adjustImg(item: TListItem; r: Trect);
  29.   public
  30.     { Public declarations }
  31.   end;
  32.  
  33. var
  34.   Form1: TForm1;
  35.  
  36. implementation
  37.  
  38. {$R *.dfm}
  39.  
  40. procedure TForm1.adjustImg(item: TListItem; r: Trect);
  41. var
  42.   img: TImage;
  43. begin
  44.   r.Left := r.Left + lv1.Column[0].Width;
  45.   r.Right := r.Left + lv1.Column[1].Width - 25;
  46.   img := item.Data;
  47.   img.BoundsRect := r;
  48. end;
  49.  
  50. procedure TForm1.lv1CustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);
  51. var
  52.   i: Integer;
  53.   r: TRect;
  54.   item: TListItem;
  55. begin
  56.   for i := 0 to lv1.Items.Count - 1 do
  57.   begin
  58.     item := lv1.Items[i];
  59.     r := item.DisplayRect(drBounds);
  60.     adjustImg(item, r);
  61.   end;
  62. end;
  63.  
  64. procedure TForm1.btnDel1Click(Sender: TObject);
  65. begin
  66.   if lv1.SelCount = 1 then
  67.   begin
  68.     mmo1.Lines.Add(IntToStr(lv1.Selected.Index));
  69.     lv1.Items[lv1.Selected.Index].Data := nil;
  70.     lv1.Items[lv1.Selected.Index].Delete;
  71.     //lv1.Items.Delete(lv1.Selected.Index);
  72.   end;
  73. end;
  74.  
  75. procedure TForm1.lv1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
  76. var
  77.   index: Integer;
  78. begin
  79.   if lv1.SelCount = 1 then
  80.   begin
  81.     index := lv1.Selected.Index;
  82.     lbl1.Caption := 'Index: ' + IntToStr(index);
  83.   end else begin
  84.     lbl1.Caption := 'Index: --';
  85.   end;
  86. end;
  87.  
  88. procedure TForm1.btnRefresh1Click(Sender: TObject);
  89. var
  90.   img : TImage;
  91.   x : LongWord;
  92.   index : Integer;
  93. begin
  94.   if lv1.SelCount = 1 then
  95.   begin
  96.     index := lv1.Selected.Index;
  97.     img := lv1.Items.Item[index].Data;
  98.     mmo1.Lines.Add('upd index: '+IntToStr(index)+' - '+IntToStr(integer(lv1.Items.Item[index].Data)));
  99.     Randomize;
  100.     x := Random($ffffff);
  101.     img.Canvas.Brush.Color := x;
  102.     img.Canvas.FillRect(Rect(0, 0, img.Width, img.Height));
  103.   end;
  104. end;
  105.  
  106. procedure TForm1.btnAdd1Click(Sender: TObject);
  107. var
  108.   li: TListItem;
  109.   img: Timage;
  110.   r: TRect;
  111.   index, i, j, id: Integer;
  112.   x : LongWord;
  113.   test: Boolean;
  114. begin
  115.   if lv1.SelCount = 1 then begin
  116.     lv1.Items[lv1.Selected.Index].Selected := False;
  117.   end;
  118.   lv1.Items.BeginUpdate;
  119.   li := lv1.Items.Add;
  120.   index := li.Index;
  121.   for i := 1 to 50 do
  122.   begin
  123.     test := False;
  124.     for j := 0 to lv1.Items.Count - 1 do
  125.     begin
  126.       if StrToIntDef(lv1.Items[j].Caption, 0) = i then
  127.       begin
  128.         test := True;
  129.         Continue;
  130.       end;
  131.     end;
  132.     if not test then
  133.     begin
  134.       id := i;
  135.       Break;
  136.     end;
  137.   end;
  138.  
  139.   li.Caption := IntToStr(id);
  140.   li.SubItems.Add('i');
  141.   li.SubItems.Add('x');
  142.   li.SubItems.Add('y');
  143.  
  144.   r := li.DisplayRect(drBounds);
  145.   img := TImage.Create(Self);
  146.   img.Parent := lv1;
  147.   img.SendToBack;
  148.   img.Height := 30;
  149.   img.Width := 180;
  150.   li.Data := img;
  151.   img := li.data;
  152.   mmo1.Lines.Add('Add index: '+IntToStr(index)+' - '+IntToStr(integer(li.data)));
  153.   x := Random($ffffff);
  154.   img.Canvas.Brush.Color := x;
  155.   img.Canvas.FillRect(Rect(0, 0, img.Width, img.Height));
  156.   lv1.Items.EndUpdate;
  157. end;
  158.  
  159. procedure TForm1.lv1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
  160. begin
  161.   Compare := CompareValue(StrToInt(Item1.Caption), StrToInt(Item2.Caption));  //  CompareTextAsInteger(s1, s2);
  162. end;
  163.  
  164. procedure TForm1.lv1CustomDrawItem(Sender: TCustomListView;
  165.   Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
  166. begin
  167.   if Item.Selected then begin
  168.     Sender.Canvas.Brush.Color := clLime;
  169.     Sender.Canvas.Font.Style := [fsBold];
  170.   end else begin
  171.     Sender.Canvas.Brush.Color := clWhite;
  172.     Sender.Canvas.Font.Style := [];
  173.   end;
  174. end;
  175.  
  176. end.
  177.  
  178.  
W10, D7