Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: 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 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
7-1079364823
Pul
2004-03-15 18:33
2004.05.02
Как отследить запуск и завершение работы DOS-приложения


7-1078411581
Vlad25
2004-03-04 17:46
2004.05.02
WinIO


4-1078768612
Alex870
2004-03-08 20:56
2004.05.02
Перехват событий iexplore.exe


14-1081362951
VID
2004-04-07 22:35
2004.05.02
В какой момент Windows даёт команду сбросить кеш винта на диски ?


1-1082284895
Pa5ha
2004-04-18 14:41
2004.05.02
TList&amp;memory