Вниз
Скачать: CL | DM;

"Засунуть" ProgressBar в StatusBar   Найти похожие ветки 

← →
SergP ©   (2004-04-13 13:31) [0]

Подскажите как сделать сабж.
Можно код или хотя-бы сам принцип .


← →
RDen   (2004-04-13 13:39) [1]

ProgressBar.Parent:=  StatusBar;


← →
SergP ©   (2004-04-13 13:44) [2]

Ну это понятно. Я имел ввиду как его засунуть в конкретную Panel?


← →
clickmaker ©   (2004-04-13 13:46) [3]

Определить координаты панели (сложив Width предыдущих, например) и ProgressBar.Left :=


← →
pasha_golub ©   (2004-04-13 13:48) [4]

SergP ©   (13.04.04 13:44) [2]
Лучше самому отрисовывать в OnDrawPanel


← →
han_malign ©   (2004-04-13 13:52) [5]

ну, лично я, не мудрствуя лукаво, отрисовываю руками
procedure DrawSimpleHProgressBar(aCanvas: TCanvas; const aRect: TRect; aColor: TColor;
  aText: string; aPercent: byte; aHCenterText: boolean);
var W,H,X,Y: integer;
   _rect: TRect;
   _clr: TColor;
   _bs: TBrushStyle;
begin
  if(aPercent>100)then aPercent:=0;
  W:=aRect.Right-aRect.Left+1; H:=aRect.Bottom-aRect.Top+1;
  _rect:=aRect;
  if(aPercent>0)then begin
     _rect.Right:=aRect.Left+W*aPercent div 100-1;
     _clr:=aCanvas.Brush.Color;
     aCanvas.Brush.Color:=aColor;
     aCanvas.FillRect(_rect);
     aCanvas.Brush.Color:=_clr;
     aText:=aText+" "+IntStr(aPercent)+"%";
     _rect.Left:=_rect.Right+1;
     _rect.Right:=aRect.Right;
  end;
  if(_rect.Right>=_rect.Left)then aCanvas.FillRect(_rect);
  Y:=(H-aCanvas.TextHeight(aText))div 2;
  if(Y<0)then Y:=0;
  X:=(W-aCanvas.TextWidth(aText))div 2;
  if(X<0)then X:=0;
  if((X>Y)and not aHCenterText)then
     if(Y>0)then X:=Y
     else if(X>2)then X:=2;
  _bs:=aCanvas.Brush.Style;
  aCanvas.Brush.Style:=bsClear;
  aCanvas.TextOut(aRect.Left+X,aRect.Top+Y,aText);
  aCanvas.Brush.Style:=_bs;
end;

примерно так, для одной панели
procedure TDeviceForm.sbDeviceDrawPanel(StatusBar: TStatusBar;
 Panel: TStatusPanel; const Rect: TRect);
var _text: string;
   _prgrs: byte;
begin
  Lock; _text:=F_sStatus; _prgrs:=F_nProgress;Unlock;
  DrawSimpleHProgressBar(StatusBar.Canvas,Rect,clBlue,_text,_prgrs,false);
end;

 F_sStatus, F_nProgress - у меня обновляется в контексте другого потока, поэтому используется Lock/Unlock, в которых упакована критическая секция.
procedure TDeviceForm.SetStatus(aStatus: string; aProgress: byte= 0);
var _fU: boolean;
begin
 Lock;
  _fU:=(F_sStatus<>aStatus)or(aProgress<>F_nProgress);
  F_sStatus:=aStatus;
  F_nProgress:=aProgress;
 Unlock;
  if(_fU)then sbDevice.Invalidate;
end;


← →
SergP ©   (2004-04-13 13:55) [6]


> clickmaker ©   (13.04.04 13:46) [3]


> pasha_golub ©   (13.04.04 13:48) [4]


Просто сначала думал что его можно сразу поместить в конкретную panel, а нифига не выходило.
Теперь все понял. Спасибо...


← →
Amoeba ©   (2004-04-13 13:57) [7]

В целом ряде библиотек есть StatusBar, которые позволяют помещать на них другие компоненты. Также посмотри такие StatusBar на http://www.torry.net
Отрисовка руками, IMHO, есть "поездка в Москву из Питера через Владивосток".


← →
pasha_golub ©   (2004-04-13 14:51) [8]

Amoeba ©   (13.04.04 13:57) [7]
Здрасте, это как раз и есть, то шо надо. :-) Не учитывая наличия компонентов.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.026 c
14-1081629321
gn
2004-04-11 00:35
2004.05.02
ПАРНИ ИСУС ВОСКРЕС!!!!!!!!!!


7-1074852683
Evgeniy_K
2004-01-23 13:11
2004.05.02
Работа с устройствами


3-1081331841
31512
2004-04-07 13:57
2004.05.02
MIDAS и LookUp


14-1081687647
Thor
2004-04-11 16:47
2004.05.02
посоветуйте книгу по PHP.


1-1082026377
Fast
2004-04-15 14:52
2004.05.02
Преобразование BYTE to BIN




   Наверх