![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отрисовка ProgressBar в ListView [D7, XP]
Uno-84 © (2009-06-24 14:15:00)Добрый День! Подскажите пожайлуста, мне нужно отрисовать ProgressBar в ListView, не создавая динамически сам ProgressBar, а по наподобие как CheckBox в Gride. T.e через Canvas.
Если у кого есть примеры кода, очень буду рад помощи.
Заранее спасибо!
clickmaker (2009-06-24 16:19:00) [1]> [9] uno-84 (24.06.09 16:14)
подсказка: у Item есть свойство DisplayRect
если нужно рисовать не в первой колонке, то учесть ширину тех, что до неё
MBo (2009-06-24 16:15:00) [2]>А если процен равен 40 или 20 или 50 он мне закраси пол ячейки или четверть?
Для этого нужно написать код, закрашивающий нужную долю ячейки
uno-84 (2009-06-24 16:14:00) [3]В зависимости от процента?
uno-84 (2009-06-24 16:13:00) [4]А если процен равен 40 или 20 или 50 он мне закраси пол ячейки или четверть?
Cobalt (2009-06-24 16:10:00) [5]> uno-84 (24.06.09 14:38) [2]
Свят-свят-свят...
А кто будет удалять эти прогресс-бары?
Вот мой код
procedure TMyForm.lvLogCustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer;
State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Item.SubItems.Count < 1 then
Exit;
with Sender.Canvas do
If ( <wrong> )
then //раскрашивать только второй столбец
Font.Color := clRed //цвет символов
else //все остальные столбцы
Font.Color := clWindowText; //цвет символов
end;
uno-84 (2009-06-24 15:13:00) [6]В коде которых я привел выше процент просто для примера поставлен, он для каждой строки свой и изменяется по мере выполнения задания
uno-84 (2009-06-24 15:12:00) [7]Я пишу программу, которая является какбы оргонайзером по выполнению служебных задании. Каждая строка в ListView это задание и оно имеет свой процент выполнения. Поэтому прогресс разный в каждой строчке.
Mono-85 (2009-06-24 15:00:00) [8]Тебе одновременно один прогресс нужно отображать или несколько ?
clickmaker (2009-06-24 14:46:00) [9]> Толко как вот прорисовать?
в OnDrawItem (или SubItem) заливать цветом прямоугольник соответственно прогрессу.
Чтобы не перерисовывать все при изменении прогресса, используй метод UpdateItems
uno-84 (2009-06-24 14:38:00) [10]Пробовал вот код:
procedure TWorkCalendarForm.WorkLVCustomDrawSubItem(
Sender: TCustomListView; Item: TListItem; SubItem: Integer;
State: TCustomDrawState; var DefaultDraw: Boolean);
const
pbColumnIndex = 1;
pbMax = 100;
var
pb: TQProgressBar;
pbRect: TRect;
begin
pb := TQProgressBar.Create(Self);
pb.Parent := WorkLV;
pbRect := Item.DisplayRect(drBounds);
pbRect.Left := pbRect.Left + WorkLV.Columns[-1 + pbColumnIndex].Width;
pbRect.Right := pbRect.Left + WorkLV.Columns[pbColumnIndex].Width;
pb.BoundsRect := pbRect;
pb.Cursor := crHandPoint;
pb.barKind := bkCylinder;
pb.barLook := blGlass;
pb.barColor := clLime;
pb.finalColor := clYellow;
pb.captionAlign := taCenter;
pb.position := 56;
end;
проблема в том, что если у много записей в ListView при движении мышки ListView мигает. Кроме того записи обновляются и сортируются по дате в соседней с ProgressBar колонке. Выходит как-то на вид неприятно.
А вот при прорисовке на канве от этого "мигания" можно избавиться. Толко как вот прорисовать?
clickmaker (2009-06-24 14:27:00) [11]OnCustomDrawItem, OnCustomDrawSubItem