Delphi TListview自绘某列添加图片按钮并实现点击事件响应

最终实现的效果如下图

点击对应列对应行按钮。显示出对应行的caption字段的值 

 

完整源码如下

unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, ComCtrls, StdCtrls, Spin, Buttons, ImgList;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    StatusBar1: TStatusBar;
    ListView1: TListView;
    Panel1: TPanel;
    Label1: TLabel;
    cbSource: TComboBox;
    cbDestination: TComboBox;
    Label2: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Label3: TLabel;
    DateTimePicker1: TDateTimePicker;
    btnQuery: TButton;
    CheckBox1: TCheckBox;
    SpinEdit1: TSpinEdit;
    Label4: TLabel;
    ImageList1: TImageList;
    Label5: TLabel;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    SpeedButton1: TSpeedButton;
    procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    procedure btnQueryClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure  Look(Sender: TObject);
    procedure Init;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bmp:TBitmap;
implementation

{$R *.dfm}

procedure TForm1.btnQueryClick(Sender: TObject);
begin
  bmp:=TBitmap.Create;
  bmp.LoadFromFile('Snipaste_2022-12-12_02-15-59.bmp');
  Init;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListView1.DoubleBuffered:=True;
end;

procedure TForm1.Init;
var
  Item: TListItem;
  i: Integer;
begin
  ListView1.Items.Clear;
  for i := 1 to 15 do
  begin
    Randomize; //初始化随机数发生器
    Item := ListView1.Items.Add;
    Item.Caption := 'G'+ IntToStr(Random(10000));
    Item.SubItems.Add(IntToStr(10 + i));
    Item.SubItems.Add(IntToStr(100 + i));
    Item.SubItems.Add(IntToStr(1000 + i));
    Item.SubItems.Add(IntToStr(2000 + i));
    Item.SubItems.Add(IntToStr(3000 + i));
    Item.SubItems.Add(IntToStr(4000 + i));
    Item.SubItems.Add(IntToStr(5000 + i));
    Item.SubItems.Add('有');
    Item.SubItems.Add('-');
    if i mod 2 = 1 then  Item.SubItems.Add('有')
    else  Item.SubItems.Add(IntToStr(Random(20)));

    Item.SubItems.Add(IntToStr(9000 + i));
    Item.SubItems.Add('-');
    Item.SubItems.Add(IntToStr(1100 + i));
    Item.SubItems.Add(IntToStr(1200 + i));
    Item.SubItems.Add(IntToStr(1300 + i));
    Item.SubItems.Add(IntToStr(1400 + i));
    //Item.SubItems.Add(IntToStr(2500 + i));
    Item.SubItems.Add('');
  end;

end;






//---------------------------------------------------------------------------
{
var
  I, J: Integer;
  P: TSpeedButton;

for I := 0 to FlstVisbleB.Count -1 do
begin
  P := TSpeedButton(FlstVisbleB.Objects[I]);
  P.Visible := False;
  if P.Tag <> 0 then
  begin
    TImage(P.Tag).Visible := False;
    TImage(P.Tag).Left := J;
  end;
end;
}
procedure  TForm1.Look(Sender: TObject);
var
  pb:TSpeedButton;
  p:TListItem;

begin
  //ShowMessage('您点击了');
   pb := TSpeedButton(Sender);
   p := TListItem(pb.Tag);
   //pb.Visible := false;
   //ShowMessage(Format('pb.Tag:%d | Caption:%s',[pb.Tag , ListView1.Items[pb.Tag].Caption]));
   //if(p.SubItems.Count >0) then
   //ShowMessage(p.SubItems.Strings[10]);
   ShowMessage(p.Caption);

end;


procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  Rect: TRect;
  Button: TSpeedButton;
begin
  //DefaultDraw := False; // 不显示默认的文本.
  { 比如:第2列上显示CheckBox,第5列上显示Button }
  //if SubItem in [2, 5] then
  if SubItem = 16 then
  begin
    if Item.Data = nil then
    begin
      DefaultDraw := False;
      Rect := Item.DisplayRect(drBounds); // 获取Item显示的区域.
      Button := TSpeedButton.Create(ListView1);

      Button.Parent := ListView1;
      //Button.Caption := '预定';
      Button.Glyph := bmp;
      Button.Width := 55;
      Button.Height := 22;
      Button.Left := Rect.Right - ((ListView1.Columns.Items[16].Width + Button.Width) div 2) - 7;

      Button.Top := Rect.Top;
      Button.Visible := True;
      Button.Flat := True;
      //Button.Tag := Item.Index; //ListView1中第几行  用这个也是ok的
      Button.Tag := Integer(Item);
      Item.Data := Button;

      Button.OnClick := Look;
    end;
  end;
end;

end.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值