如何在状态栏中加入进度条?(100分)

  • 主题发起人 主题发起人 eastweast
  • 开始时间 开始时间
那为什么在我这里有问题?ProgressBar明显比StatusBar宽出许多,另外,还有一个问题就是
这样作不能让ProgressBar在某个指定的StatusPanel上显示
下面是我修正过的:
1.设置panels[0]为psOwnerDraw
2.procedure TForm1.FormCreate(Sender: TObject);
begin
ProgressBar :=TProgressBar.Create(StatusBar1);
ProgressBar.Parent := StatusBar1;
end;
3.procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
ProgressBar.BoundsRect := Rect;
//ProgressBar.Position := 30;
//ProgressBar.Visible :=True;
end;
是不是很简单?
 
摘自Delphi3000

{
Including Components into a Statusbar

The TStatusbar usually does not allow to place components on itself. But
sometimes it would be very fine to add -for example- a TProgressBar on a
Statusbar.

This Article shows how to add components to a TStatusbar and how to fit it
into one of the Statusbar-Panels.


First apologize my bad english: I'm a programmer, not a translator ;-)

There are (at least) two ways to add Components on your Statusbar:


1. Create an own Statusbar-Object
=================================

Create your own Statusbar and allow to add components on it. This is
possible in overriding the Create-Constructor:
}

type
TMyStatusBar = class(TStatusBar)
public
constructor Create(AOwner: TComponent); override;
end;

implementation

constructor TMyStatusBar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle:= ControlStyle + [csAcceptsControls];
//that's all !!
end;

{
That's all! Now this component accept other components as "Children" and you
can put them at design-time onto the statusbar!

But I don't like this way very much because you have to use this new
component. I prefer to use the "old" components and manipulating them a
little bit. So lets have a look to my favourite way:


2. "Adopt" the other component
==============================


The simplest way to include components to a statusbar is to adopt the
component! Place the TStatusbar on your Form, also place the Progressbar (or
other component you wish to include on your Statusbar) on the form (!). Then
do this in the "OnShow" Event of the Form:
}

Progressbar1.Parent := statusbar1;
Progressbar1.top := 1;
Progressbar1.left := 1;

{
Now the Progressbar is "adopted" by the Statusbar.

But unfortunatley it doesn't look very nice because the Progressbar is
larger than the panel and the position is not correct. So we have to
determine the exact position of the Progresbar by using the Statubar's
border, width and height. (We have to add this code to the "OnShow" Event of
the form, because in the "OnCreate" event still no Handles are avalible.)

}

procedure TForm1.FormShow(Sender: TObject);
var r : TRect;
begin
Statusbar1.perform(SB_GETRECT,0,integer( @R ));
//determine the size of panel 1

//SB_GETRECT needs Unit commctrl
// 0 = first Panel of Statusbar; 1 = the second and so on.

progressbar1.parent := Statusbar1; //adopt the Progressbar

progressbar1.top := r.top; //set size of
progressbar1.left := r.left; //Progressbar to
progressbar1.width := r.right-r.left; //fit with panel
progressbar1.height := r.bottom-r.top;

end;

{
Now the Progressbar fits exactly into the first panel of the statusbar! If
you want to use the second or another panel, you only have to change the
parameter of the "perform" command.


Comments and improvements are welcome!!

Alex Schlecht
Alex.schlecht@skw.com
}


{
=================== DEUTSCHE FASSUNG ==================================


Wie man Componenten in eine Statusbar einbindet


Normalerweise l溥t eine Statusbar es nicht zu, da?nbsp;auf ihr andere
Componenten eingebunden werden. Nachfolgend wird ein Weg gezeigt, wie es
trotzdem geht und wie man z.B. eine Progressbar genau in ein Panel einpa遲.

Es gibt (mindestens) zwei Wege für unser Ziel:


1. Eine eigene Statusbar-Komponente erstellen
=============================================

Um einer eigenen Statusbar-Komponente zu erlauben, andere Komponenten
aufzunehmen mu?nbsp;lediglich der Create-Constructor überschrieben werden:
}

type
TMyStatusBar = class(TStatusBar)
public
constructor Create(AOwner: TComponent); override;
end;

implementation

constructor TMyStatusBar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle:= ControlStyle + [csAcceptsControls];
//das ist alles !!
end;


{
Das ist alles! Jetzt akzeptiert die neue Komponente andere Elemente, die zur
Entwurfszeit plaziert werden k鰊nen.

Aber mir gef鋖lt diese L鰏ung am wenigsten, da man wieder eine Komponente
mehr hat. Lieber manipuliere ich an vorhandenen Komponenten herum:


2. Die Komponente adoptieren!
=============================

Der einfachste Weg, Komponenten auf eine Statusbar einzubinden ist es, diese
Komponente von der Statusbar zur Laufzeit zu adoptieren! Dazu mu?nbsp;die
einzubindende Komponente (z.B. Progressbar) auf dem Form (!), also neben der
Statusbar plaziert werden. Im "OnShow"-Event des Forms schreibt man
folgendes rein:
}

Progressbar1.Parent := statusbar1;
Progressbar1.top := 1;
Progressbar1.left := 1;

{
Somit ist die Progressbar von der Statusbar adoptiert! Allerdings pa遲 nun
die Gr鲞e der Progressbar und der Statusbar nicht überein. Damit das Ganze
gut aussieht, ersetzt man obigen Code durch nachfolgende Zeilen. Zu beachten
ist, da?nbsp;diesmal das "OnShow"-Event bemüht werden mu? da innerhalb von
"OnCreate" noch keine Handles verfügbar sind.
}

procedure TForm1.FormShow(Sender: TObject);
var r : TRect;
begin
Statusbar1.perform(SB_GETRECT,0,integer( @R ));
//Gr鲞e des 1. Panels ermitteln

//SB_GETRECT ben鰐igt die Unit commctrl
// 0 = erstes Panel der Statusbar; 1 = zweites Panel usw.

progressbar1.parent := Statusbar1; //Prog.Bar adoptieren
progressbar1.top := r.top; //Gr鲞e der
progressbar1.left := r.left; //Progressbar setzen
progressbar1.width := r.right-r.left; //und an Panel anpassen
progressbar1.height := r.bottom-r.top;

end;


//Jetzt pa遲 die Progressbar genau in das Panel!


 
進度條不用"畫"上去吧﹐不是可是直接"放"上去嗎﹖
而且更好看的帶百分數的進度條有Guade
 
RX可以,我用过很好用。
 
没有这么复杂把,好像直接放上去就可以.
 
将状态条中任一个想设为进度条的pane设为psOwnerDraw,
编写状态条事件根据状态条的tag值重画该pane,同时可以将该
pane的text值写在上面(可以是注释、百分数),很简单的,我一直在用。
改变进度条值只需修改状态条的tag,pane的text也可以有该值自动确定以
显示百分数。这样只要状态条就行,涉及不到状态条控件
 
用一下两个函数,如果还可以使用再TGauge上
procedure TForm3.FormCreate(Sender: TObject);
begin
statusbar1.Panels[0].style:=psOwnerDraw;
progressbar1.Parent:=statusbar1;
end;
procedure TForm3.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
progressbar1.BoundsRect:=rect;
end;

 
FT!!为什么不告诉他用控件??
 
谢谢大家
 
后退
顶部