Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Вниз"Засунуть" 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c