在狀態列中插入類似進度條的可視控制元件

一劍平江湖發表於2013-12-10

首先,在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.

類似的還可插入其他可視控制元件,如按鈕、點陣圖和動畫控制元件等等。

相關文章