PDA

View Full Version : سوال: چطوری یک ProgressBar در خانه های ListView نمایش دهیم.



N30TheM4TRIX
چهارشنبه 08 شهریور 1391, 23:39 عصر
سلام و خسته نباشید به همه دوستان.
چطوری می تونم در یک LV در حالت Report برای هر سطر در یک خانه خاص یک ProgressBar نمایش دهم؟

بهروز عباسی
چهارشنبه 08 شهریور 1391, 23:45 عصر
درود
کد زیر رو ببین
البته مشکلی داره :
اونم این که وقتی ابعاد LV تغییر می کنه PB داخلش کمی از نظر گرافیک به مشکل می خوره.

implementation

{$R *.dfm}
uses
CommCtrl, Themes;

const
StatusColumnIndex = 2;

procedure DrawStatus(DC: HDC; R: TRect; State: TCustomDrawState; Font: TFont;
const Txt: String; Progress: Single);
var
TxtRect: TRect;
S: String;
Details: TThemedElementDetails;
SaveBrush: HBRUSH;
SavePen: HPEN;
TxtFont: TFont;
SaveFont: HFONT;
SaveTextColor: COLORREF;
begin
FillRect(DC, R, 0);
InflateRect(R, -1, -1);
TxtRect := R;
S := Format('%s %.1f%%', [Txt, Progress * 100]);
if ThemeServices.ThemesEnabled then
begin
Details := ThemeServices.GetElementDetails(tpBar);
ThemeServices.DrawElement(DC, Details, R, nil);
InflateRect(R, -2, -2);
R.Right := R.Left + Trunc((R.Right - R.Left) * Progress);
Details := ThemeServices.GetElementDetails(tpChunk);
ThemeServices.DrawElement(DC, Details, R, nil);
end
else
begin
SavePen := SelectObject(DC, CreatePen(PS_NULL, 0, 0));
SaveBrush := SelectObject(DC, CreateSolidBrush($00EBEBEB));
Inc(R.Right);
Inc(R.Bottom);
RoundRect(DC, R.Left, R.Top, R.Right, R.Bottom, 3, 3);
R.Right := R.Left + Trunc((R.Right - R.Left) * Progress);
DeleteObject(SelectObject(DC, CreateSolidBrush($00FFC184)));
RoundRect(DC, R.Left, R.Top, R.Right, R.Bottom, 3, 3);
if R.Right > R.Left + 3 then
Rectangle(DC, R.Right - 3, R.Top, R.Right, R.Bottom);
DeleteObject(SelectObject(DC, SaveBrush));
DeleteObject(SelectObject(DC, SavePen));
end;
TxtFont := TFont.Create;
try
TxtFont.Assign(Font);
TxtFont.Height := TxtRect.Bottom - TxtRect.Top;
TxtFont.Color := clGrayText;
SetBkMode(DC, TRANSPARENT);
SaveFont := SelectObject(DC, TxtFont.Handle);
SaveTextColor := SetTextColor(DC, GetSysColor(COLOR_GRAYTEXT));
DrawText(DC, PChar(S), -1, TxtRect, DT_SINGLELINE or DT_CENTER or
DT_VCENTER or DT_END_ELLIPSIS or DT_NOPREFIX);
SetBkMode(DC, TRANSPARENT);
finally
DeleteObject(SelectObject(DC, SaveFont));
SetTextColor(DC, SaveTextColor);
TxtFont.Free;
end;
end;

procedure TForm1.lv_DownloadItemCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
var
ListView: TListView absolute Sender;
R: TRect;
begin
DefaultDraw := SubItem <> StatusColumnIndex;
if not DefaultDraw then
begin
ListView_GetSubItemRect(ListView.Handle, Item.Index, SubItem,
LVIR_BOUNDS, @R);
DrawStatus(ListView.Canvas.Handle, R, State, ListView.Font, 'Downloading',
Random(101) / 100);
end;


end;


موفق باشید.

mohsen24000
پنج شنبه 09 شهریور 1391, 16:32 عصر
به شما استفاده از کامپوننتهای Next رو پیشنهاد می کنم...

بهروز عباسی
پنج شنبه 09 شهریور 1391, 18:25 عصر
درود مجدد
این هم حاج Zarko Gajic در سایتش قرار داده که جالبه.
Placing a TProgressBar into a TListView (http://delphi.about.com/library/weekly/aa053105a.htm)

موفق باشید.