首先,在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;//beginend.
类似的还可插入其他可视控件,如按钮、位图和动画控件等等。