最终实现的效果如下图:
点击对应列对应行按钮。显示出对应行的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.