对delphi还不熟悉,请教大家怎么在statusbar中创建进度条?

xp2239 2004-12-21 01:07:56
我想在statusbar中创建进度条,不知道该怎么实现?谢谢各位。最好有简单的例子代码
...全文
387 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeroxing 2004-12-21
  • 打赏
  • 举报
回复
一楼的 Kevin_Lmx(繁华阅尽) 方法不错,当然要结合gxgyj(杰克.逊)所说的,把psOwnerDraw设置一下,否则DrawPanel事件死都不会发生。

修改dfm的方法虽然可以达到目的,但是非常规手段,建议不要使用,否则对后来的维护可能造成问题。

ailibuli(愛理不理) 的方法也不错,需要理解Message才可以。

总结完毕,楼主揭贴吧。呵呵。
ailibuli 2004-12-21
  • 打赏
  • 举报
回复
補助説明:在ProgressBar1上、設定二個StatusPanel。

type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private }
public
{ Public }
end;
ailibuli 2004-12-21
  • 打赏
  • 举报
回复
uses CommCtrl;

type THackControl = class(TControl);

procedure TForm1.FormCreate(Sender: TObject);
var
PanelRect: TRect;
begin
THackControl(ProgressBar1).SetParent(StatusBar1);
SendMessage(StatusBar1.Handle, SB_GETRECT, 1, Integer(@PanelRect));
with PanelRect do
ProgressBar1.SetBounds(Left, Top, Right-Left, Bottom-Top);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
with ProgressBar1 do
for i := 0 to 99 do
begin
Position := Position + 1;
Sleep(10);
end;
end;

説明:設定二個StatusPanel、把第二個做為进度条。
jinjazz 2004-12-21
  • 打赏
  • 举报
回复
应为statusbar的controlstyle不允许其作为容器,如果非要用的话只能继承下来一个新组建,比如

type
TMStatusBar=Class(TStatusBar)
private
protected
public
constructor Create(AOwner: TComponent); override;
published
end;

//TMStatusBar 事件扩展

constructor TMStatusBar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle:= ControlStyle + [csAcceptsControls];
end;
gxgyj 2004-12-21
  • 打赏
  • 举报
回复
只有设置style属性为psOwnerDraw;
才能显示文字以外的东东.////切记!!!!
gxgyj 2004-12-21
  • 打赏
  • 举报
回复
在statusbar1上新建item
设置新的panels[0]的style属性为psownerdraw;
jinjazz 2004-12-21
  • 打赏
  • 举报
回复
修改dfm文件:
示例,新建一个form1,添加statusbar1,双击statusbar1添加两个statuspanel,第一个设宽度100,再添加一个prograssbar1,保存为unit1.pas
打开对应的unit1.dfm,看到如下结构
object StatusBar1: TStatusBar
Left = 0
Top = 434
Width = 688
Height = 19
Panels = <
item
Width = 100
end
item
Width = 50
end>
end
object ProgressBar1: TProgressBar
Left = 32
Top = 400
Width = 150
Height = 16
TabOrder = 1
end

将其改为
object StatusBar1: TStatusBar
Left = 0
Top = 434
Width = 688
Height = 19
Panels = <
item
Width = 100
end
item
Width = 50
end>
object ProgressBar1: TProgressBar
Left = 0
Top = 3
Width = 100
Height = 16
TabOrder = 0
end
end

保存,关闭之后再打开刚刚的工程,就可以了

firebing 2004-12-21
  • 打赏
  • 举报
回复
楼上的方法似乎是不行的吧
Kevin_Lmx 2004-12-21
  • 打赏
  • 举报
回复
procedure TForm1.statusbar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
Gauge1.Parent:=StatusBar1;
Gauge1.Left:=Rect.Left;
Gauge1.Top:=Rect.Top;
Gauge1.Width:=Panel.Width;
Gauge1.Height:=Rect.Bottom-Rect.Top;
end;
Gauge1 为进度条,在statusbar1的DrawPanel事件中写

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧