上一篇:Delphi的WebBrowser改造,对网页中Alter等对话框的改造方法(转载)
下一篇:Delphi发送邮件

在状态栏中插入类似进度条的可视控件

发布于: 2012/12/15 14:34:09   |  发布在: Delphi文章   |  点击:

 

    首先,在Form中放置一个状态条控件Status。调节Status.Panels,在其中插入3个状态条嵌板。第二个嵌板的参数Style设置成psOwnerDraw。这一点很重要,如果没有这样做,将永远无法显示文字以外的东西。在Form1的Private部分声明一个TRect类型的变量:StatusDrawRect:TRect;然后在状态条的OnDrawPanel事件中插入一行:StatusDrawRect:=rect;以记录参数Style设置成psOwnerDraw的嵌板的坐标。

    第二步,在Form的Private中声明一个TProgressbar类型的成员变量Progress。然后在一个菜单的消息响应过程中调用Create方法把它建立起来,再设定状态条为该进度条的父窗口,进而设定进度条的一些必要参数,例如:最大值、最小值、原点坐标、高度和宽度等。

程序清单:

unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, Menus;

type
    TForm1 = class(TForm)
      Status: TStatusBar;
      MainMenu1: TMainMenu;
      N1: TMenuItem;
      Create: TMenuItem;
      Exit: TMenuItem;
      procedure StatusDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
      const Rect: TRect);
      procedure ExitClick(Sender: TObject);
      procedure CreateClick(Sender: TObject);
    private
      StatusDrawRect:TRect;//记录要插入状态条特技的坐标范围
      Progress:TProgressbar;
    public
      { Public declarations }
  end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StatusDrawPanel(StatusBar: TStatusBar;
    Panel: TStatusPanel; const Rect: TRect);
begin
    StatusDrawRect:=rect;//记录要插入状态条特技的坐标范围
end;

procedure TForm1.ExitClick(Sender: TObject);
begin
    Form1.Close;
end;

procedure TForm1.CreateClick(Sender: TObject);
var
    i,count:integer;
    staPanleWidth:Integer;
begin
    progress:=TProgressbar.Create(form1);
    count:=3000;//进度条的最大值
    staPanleWidth:=status.Panels.Items[1].Width;
    //由于进度条很宽,所以需要改变状态条嵌板的宽度,这里先保存它的宽度。
    status.Panels.Items[1].Width:=150;//改变宽度
    status.Repaint;
    with progress do
    begin
        top:=StatusDrawRect.Top;
        left:=StatusDrawRect.Left;
        width:=StatusDrawRect.Right-StatusDrawRect.Left;
        height:=StatusDrawRect.Bottom-StatusDrawRect.Top;
        //设定进度条的宽度和高度
       visible:=true;
       try
           Parent:=status;//该进度条的拥有者为状态条status
           Min:=0;Max:=Count;//进度条的最大值和最小值
           Step:=1;//设定进度条的步长
           for i:=1 to Count do StepIt;
           ShowMessage('现在,进程条将要从内存中被释放');
        finally
           Free;//释放进度条
        end;//try
    end;//with
    Status.Panels.Items[1].Width:=staPanleWidth;//恢复状态条嵌板的宽度
end;//begin

end.

类似的还可插入其他可视控件,如按钮、位图和动画控件等等。

进度条