Unit1.pas
上传用户:lele20108
上传日期:2022-07-05
资源大小:15k
文件大小:6k
源码类别:

ListView/ListBox

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, ExtCtrls, ImgList, ShellAPI;
  6.    //定义一个记录用来存放listview的内容
  7. const
  8.   BigItemHeight = 100;
  9.   smallItemheight = 50;
  10. type
  11.   Plistdata = ^Tlistdata;
  12.   Tlistdata = record
  13.     Caption: string;
  14.     second: string;
  15.     three: string;
  16.     bigstr1: string;
  17.     bigstr2: string;
  18.     picon: TIcon; //图标
  19.     SelectedFlag: Boolean; //选中标志
  20.   end;
  21. type
  22.   TForm1 = class(TForm)
  23.     listbox1: TListBox;
  24.     Panel1: TPanel;
  25.     Label1: TLabel;
  26.     ImageList1: TImageList;
  27.     procedure FormCreate(Sender: TObject);
  28.     procedure listbox1DrawItem(Control: TWinControl; Index: Integer;
  29.       Rect: TRect; State: TOwnerDrawState);
  30.     procedure listbox1MouseDown(Sender: TObject; Button: TMouseButton;
  31.       Shift: TShiftState; X, Y: Integer);
  32.     procedure Label1Click(Sender: TObject);
  33.   private
  34.     { Private declarations }
  35.   public
  36.     { Public declarations }
  37.   end;
  38. var
  39.   Form1: TForm1;
  40.   listboxdata: TList;
  41. implementation
  42. {$R *.dfm}
  43. procedure TForm1.FormCreate(Sender: TObject);
  44. var
  45.   listdata: Plistdata;
  46.   i: Integer;
  47. begin
  48.   listbox1.Style := lbOwnerDrawVariable;
  49.   listbox1.ItemHeight := 50; //设定item高度
  50.   //初使化listbox的数据到tlist中
  51.   listboxdata := tlist.Create;
  52.   for i := 0 to 5 do
  53.   begin
  54.     New(listdata);
  55.     listdata^.Caption := '第' + inttostr(i) + '行Caption内容';
  56.     listdata^.second := '第' + inttostr(i) + '行第二列数据';
  57.     listdata^.three := '第' + inttostr(i) + '行第三列数据';
  58.     listdata^.bigstr1 := '选中显示内容第' + inttostr(i) + '行第一列数据';
  59.     listdata^.bigstr2 := '选中显示内容第' + inttostr(i) + '行第二列数据';
  60.     listdata^.SelectedFlag := false;
  61.     listdata^.picon := TIcon.Create;
  62.     ImageList1.GetIcon(i, listdata^.picon);
  63.     listboxdata.Add(listdata);
  64.   end;
  65.   //插入空内容到listview
  66.   for i := 0 to 5 do
  67.     listbox1.Items.Add('');
  68. end;
  69. procedure TForm1.listbox1DrawItem(Control: TWinControl; Index: Integer;
  70.   Rect: TRect; State: TOwnerDrawState);
  71. var
  72.   listdata: Plistdata;
  73. begin
  74.     //取每行的数据
  75.   listdata := listboxdata.Items[index];
  76.   if listdata.SelectedFlag then //选中画大item
  77.   begin
  78.     // 画选中大框
  79.     listbox1.Canvas.Brush.Color := clWhite;
  80.     listbox1.Canvas.Pen.Color := $001C8AEA;
  81.     listbox1.Canvas.RoundRect(Rect.Left, Rect.Top, Rect.Right - 1, Rect.Bottom, 0, 0);
  82.   // 画选中框上部标题框
  83.     listbox1.Canvas.Brush.Color := $00D7D7D7;
  84.     listbox1.Canvas.Pen.Color := $001C8AEA;
  85.     listbox1.Canvas.RoundRect(Rect.Left + 2, Rect.Top + 2, Rect.Right - 3, Rect.Bottom - 75, 0, 0);
  86.     //写caption
  87.     listbox1.Canvas.Brush.Color := $00D7D7D7;
  88.     listbox1.Canvas.Font.Color := $001C8AEA;
  89.     listbox1.Canvas.Font.Style := [fsBold];
  90.     listbox1.Canvas.TextOut(Rect.Left + 15, Rect.Top + 6, listdata.Caption);
  91.      // 画 图标
  92.     listbox1.Canvas.Draw(Rect.Left + 7, Rect.top + (listbox1.ItemHeight - 32) div 2 + 35, listdata.Picon);
  93.     listbox1.Canvas.Brush.Color := clWhite;
  94.     listbox1.Canvas.TextOut(Rect.Left + 45, Rect.Top + 45, listdata.second);
  95.     listbox1.Canvas.TextOut(Rect.Left + 245, Rect.Top + 45, listdata.three);
  96.     listbox1.Canvas.TextOut(Rect.Left + 45, Rect.Top + 75, listdata.bigstr1);
  97.     listbox1.Canvas.TextOut(Rect.Left + 245, Rect.Top + 75, listdata.bigstr2);
  98.   end
  99.   else
  100.   begin
  101.     if (odSelected in State) then
  102.       listbox1.Canvas.Brush.Color := TColor($00FFF8EA)
  103.     else
  104.       listbox1.Canvas.Brush.Color := clWhite;
  105.     listbox1.Canvas.FillRect(Rect); //填充颜色
  106.    // 画出图标
  107.     listbox1.Canvas.Draw(Rect.Left + 7, Rect.top + (listbox1.ItemHeight - 32) div 2, listdata.Picon);
  108.    // Item的第一行文字    // 选中项的文字颜色
  109.     listbox1.Canvas.Font.Color := clBlack;
  110.     listbox1.Canvas.Font.Style := [fsBold];
  111.     listbox1.Canvas.Font.size := 9;
  112.     listbox1.Canvas.TextOut(Rect.Left + 45, Rect.Top + 20, listdata.Caption);
  113.     listbox1.Canvas.Font.Color := clBlack;
  114.     listbox1.Canvas.Font.Style := [];
  115.     listbox1.Canvas.Font.size := 8;
  116.     listbox1.Canvas.TextOut(Rect.Left + 200, Rect.Top + 20, listdata.second);
  117.     listbox1.Canvas.TextOut(Rect.Left + 345, Rect.Top + 20, listdata.three);
  118.    //画底边
  119.     listbox1.Canvas.Pen.Color := $0099A8AC;
  120.     listbox1.Canvas.MoveTo(Rect.Left, Rect.Bottom - 1);
  121.     listbox1.Canvas.LineTo(Rect.right, Rect.Bottom - 1);
  122.   end;
  123.   if (odFocused in State) then //去 焦点虚框
  124.   begin
  125.     DrawFocusRect(listbox1.Canvas.Handle, rect);
  126.   end;
  127. end;
  128. procedure TForm1.listbox1MouseDown(Sender: TObject; Button: TMouseButton;
  129.   Shift: TShiftState; X, Y: Integer);
  130. var
  131.   index, i: Integer;
  132.   p: TPoint;
  133.   listdata: Plistdata;
  134. begin
  135.   p.X := x;
  136.   p.Y := y;
  137.   index := listbox1.ItemAtPos(p, True);
  138.   if index = -1 then Exit;
  139.   if listbox1.Items.Count = 0 then exit;
  140.   listdata := listboxdata.Items[index];
  141.   if Button = mbLeft then
  142.   begin
  143.     if not listdata^.SelectedFlag then
  144.     begin
  145.       listdata^.SelectedFlag := True;
  146.       listbox1.Perform(LB_SETITEMHEIGHT, index, BigItemHeight);
  147.       for i := 0 to listboxdata.Count - 1 do
  148.       begin
  149.         if index <> i then
  150.         begin
  151.           listbox1.Perform(LB_SETITEMHEIGHT, i, SmallItemHeight);
  152.           listdata := listboxdata.Items[i];
  153.           listdata^.SelectedFlag := false;
  154.         end;
  155.       end;
  156.       listbox1.Invalidate;
  157.     end;
  158.   end;
  159. end;
  160. procedure TForm1.Label1Click(Sender: TObject);
  161. begin
  162.   ShellExecute(Application.Handle, 'open', PChar('http://www.FreeDelphiTips.com'), nil, nil, SW_ShowNormal);
  163. end;
  164. end.