Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отрисовка 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо