Помещаем TProgressBar в TListView
TProgressBar отображает простую полосу прогресса и обеспечивает индикатор продвижения в пределах приложения.
Но можно разместить ProgressBar в столбец окна ListView...
ProgressBar в ListView
Когда свойство ViewStyle управления ListView установлено в vsReport, каждый пункт появляется на отдельной строке с информацией, размещенной в столбцах. Крайний левый столбец содержит маленькую иконку и метку, а последующие столбцы стдержат подпункты, как определено приложением.
Вы, вероятно, каждый день это видите... когда используете Проводник Windows с установленным видом "Таблица".
Предположим, что Вы имеете на форме ListView со свойством ViewStyle, установленным в vsReport. Два столбца определены, используя свойство Columns: первый столбец содержит имя пункта, а второй столбец должен содержать индикатор прогресса.
Когда кнопка AddItem нажата, новый пункт должен быть добавлен в список с ProgressBar:
procedure TForm1.AddItemButtonClick( Sender: TObject); const pbColumnIndex = 1; pbMax = 100; var li : TListItem; lv : TListView; pb : TProgressBar; pbRect : TRect; begin lv := ListViewEx1; //создать новый ListItem (для lv) li := lv.Items.Add; li.Caption := 'Item ' + IntToStr(lv.Items.Count); //создать ProgressBar, поместить его во второй столбец pb := TProgressBar.Create(nil); pb.Parent := lv; li.Data := pb; pbRect := li.DisplayRect(drBounds); pbRect.Left := pbRect.Left + lv.Columns[-1 + pbColumnIndex].Width; pbRect.Right := pbRect.Left + lv.Columns[pbColumnIndex].Width; pb.BoundsRect := pbRect; end; //AddItemButtonClick
Когда будет нажата кнопка AddItemButton, новый пункт списка (TListItem) будет добавлен в управление ListView (по имени ListViewEx1). Индикатор прогресса создан, ссылка на него добавлен в свойство Data списка, и наконец, индикатор помещен в столбец, определенный как pbColumnIndex. Используются некоторые вычисления, чтобы заставить индикатор прогресса появиться в правильном месте.
Когда Вы хотите удалить элемент из списка, Вы должны удостовериться, что "прикрепленная" память освобождена, и все индикаторы прогресса ниже выбранного перемещены на одну позицию вверх (т. к. это произойдет со всеми остальными пунктами ListView):
procedure TForm1.RemoveItemButtonClick( Sender: TObject); var lv : TListView; li : TListItem; i, idx : integer; pb : TProgressBar; begin lv := ListViewEx1; li := lv.Selected; if li <> nil then begin idx := li.Index; TProgressBar(li.Data).Free; lv.Items.Delete(idx); //переместить индикаторы выше for i := idx to -1 + lv.Items.Count do begin li := lv.Items.Item[i]; pb := TProgressBar(li.Data); pb.Top := pb.Top - (pb.BoundsRect.Bottom - pb.BoundsRect.Top); end; end; end; //RemoveItemButtonClick
Только для испытания, мы добавим некоторый фиктивный код внутри события OnTime управления TTimer, чтобы иметь некоторое продвижение индикаторов (для этого поместите компонент TTimer на форму и используйте следующий код для события OnTime).
procedure TForm1.Timer1Timer( Sender: TObject); var idx : integer; pb: TProgressbar; lv : TListView; begin lv := ListViewEx1; if lv.Items.Count = 0 then Exit; //случайно выберем пункт и //увеличим значение его индикатора idx := Random(lv.Items.Count); pb := TProgressBar(lv.Items[idx].Data); if pb.Position < pb.Max then pb.StepIt else pb.Position := 0; end;//Timer1Timer
Запустите приложение, нажмите кнопку AddItem несколько раз и наблюдайте за продвижением прогресса.
Теперь попытайтесь изменить размеры любого из столбцов... :( УУУпссс!
Когда Вы изменяете размеры столбцов, Вы должны повторно установить индикаторы, но в TListView нет события, чтобы обработать изменение размера столбцов!
TListViewEx - ListView с событием изменения размера столбцов
Есть компонент TListViewEx - потомок TListView с published событиями BeginColumnResize, ColumnResize и EndColumnResize.
The code was provided by Peter Below (a TeamB member).
Теперь, со всей мощью TListViewEx, Вы можете легко обрабатывать ситуацию изменения пользователем ширины столбца:
procedure TForm1.ListViewEx1EndColumnResize( sender: TCustomListView; columnIndex, columnWidth: Integer); var lv : TListViewEx; idx : integer; pb : TProgressBar; begin lv := ListViewEx1; //первый столбец if columnIndex = 0 then begin for idx := 0 to -1 + lv.Items.Count do begin pb := TProgressBar(lv.Items[idx].Data); pb.Left := columnWidth; end; end; //столбец индикатора прогресса if columnIndex = 1 then begin for idx := 0 to -1 + lv.Items.Count do begin pb := TProgressBar(lv.Items[idx].Data); pb.Width := columnWidth; end; end; end;
Вы можете загрузить исходник TListViewEx. Это один файл *.pas. Вы только будете должны добавить компонент в существующий пакет.
Комментарии