zoukankan      html  css  js  c++  java
  • [代码]Delphi实现在ListView中插入进度条

    为了在ListView的某个单元格中插入进度条,通常有2个方法:创建进度条并设定Parent为ListView(如[1][2]),或是自绘方式(如[3]),简便起见,本文采用前者方法。

    ListView内嵌进度条(简易)

    创建一个缺省工程,在窗体上拖放两个控件:TListView控件名为lvw1,TButton控件名为btn1。

    lvw1的属性 ViewStyle = vsReport,Columns添加几列,代码如下:

    unit frmTestListviewProgress;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, CommCtrl, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        lvw1: TListView;
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        function SetProgressInListView(lvw: TListView;
          Row, Col, MaxVal, CurrentPosition: Integer): Boolean;
    
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.btn1Click(Sender: TObject);
    begin
      // 行=2,列=1,最大=10,进度=3
      SetProgressInListView(lvw1,2,1,10,3);
    end;
    
    function TForm1.SetProgressInListView(lvw: TListView;
      Row, Col, MaxVal, CurrentPosition: Integer): Boolean;
    var
      itm: TListItem;
      i, j, k: integer;
      pb: TProgressBar;
    begin
      Result := False;
    
      // 如果 ListView 为空,则退出
      if lvw = nil then Exit;
    
      // 如果没有这一列,则退出
      if lvw.Columns.Count < Col + 1 then Exit;
    
      // 如果没有这一行,则添加到有此行为止
      if lvw.Items.Count < Row + 1 then
        for i := 0 to Row - lvw.Items.Count do begin
          itm := lvw.Items.Add;
    
          // 添加该行的每一列
          if Col > 0 then
            for j := 0 to lvw.Columns.Count - 1 do
              itm.SubItems.Add('');
        end;
    
      // 取得这一项
      itm := lvw.Items[Row];
    
      // 如果进度条为空,则创建之
      if itm.Data = nil then begin
        pb := TProgressBar.Create(Self);
        pb.Parent := lvw;
        itm.Data := pb;
      end;
    
      // 取得进度条
      pb := TProgressBar(itm.Data);
    
      // 进度条定位
      with pb do begin
        Left := itm.DisplayRect(drBounds).Left;
        for i := 0 to Col - 1 do begin
          Left := Left + lvw.Columns[i].Width;
        end;
    
        Top := itm.DisplayRect(drBounds).Top + 1;
        Height := itm.DisplayRect(drBounds).Bottom - itm.DisplayRect(drBounds).Top - 2;
        Width := lvw.Columns[Col].Width;
        Max := MaxVal;
    
        // 如果当前值 > 0,则显示,否则隐藏
        pb.Visible := CurrentPosition > 0;
    
        // 设定进度条
        Position := CurrentPosition;
      end;
    
      Result := True;
    end;
    
    end.

    核心函数是 SetProgressInListView(),设定某行某列插入一个进度条,每行一个,可以多行各有一个。

    简单加几个控件和代码之后运行的效果如图:

    ListView内嵌进度条

    注意:

    本文仅是简单实现了ListView中插入进度条的效果演示,功能并不完整,如不支持列宽自动调整

    如果需要列宽自动调整,可参考[1]的代码,或者干脆禁止调整进度条的列宽:)

    参考:

    1. 在ListView中插入动态创建进度条,并实时调整其宽度
      http://blog.csdn.net/zyxmeng/article/details/519447
    2. 给Listview加上进度条
      http://www.samool.com/archives/322/
    3. delphi listview自绘图形
      http://www.cnblogs.com/snow001x/archive/2008/12/04/1347854.html

    Technorati 标签: Delphi,ListView,ProgressBar
  • 相关阅读:
    【转】Shell编程基础篇-上
    【转】inotify+rsync实现实时同步
    Spring
    jdk,jre,tommcat配置问题
    Java前后台开发
    前端组件学习(一)
    报表工具进阶(二)
    查询时异步刷新问题--用到了ajax
    学习jaspersoft/JasperReport
    利用SQLYog操作数据库mysql
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/2116744.html
Copyright © 2011-2022 走看看