![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление ListView [D6, WinXP]
psa247 © (2005-08-13 18:49:00)Всем привет!
Есть таймер, по таймеру обновляется содержимое ListView.
Если выделить строку, то после обновления фокус с этой строки пропадает. Кто знает, как это лечить?
psa247 (2005-09-02 12:25:00) [1]Еще вопрос: Какое сообщение послать ListView чтобы спрятать ScrollBar(ы)?
psa247 (2005-09-01 20:08:00) [2]Как вариант - можно сделать так: Алгоритм работает отлично.
1. Проверка - пустое ли содержимое?
1.1 "Да" - тогда содержимое пополняется с помощью Item.Add
1.2 "Нет" - переписать содержимое через Item[i].Caption и
Item[i].SubItem
2. Делать фокус на желаемый элемент
----
P.S. Глючит, если включено SortType (кроме stText);
Нельзя использовать Items.Clear
psa247 (2005-09-01 17:03:00) [3]
> dreamse
Спецом для тебя, умник.
> зримая область после Item.Clear и перепостроении содержимого
> - выставляется в левый верхний угол
Т.е. если ты выделил 205-ю, к примеру, строчку, то после обновления информации она и будет у тебя в фокусе. Только видеть ты будешь начиная с первой по счету строчке до - (насколько хватит рабочей области). Понты колотить будешь в другом месте...
dreamse (2005-09-01 15:31:00) [4]Установи ListView1.HideSelection в False
Точно блин раздел для новичков :)
Удачи
psa247 (2005-09-01 10:59:00) [5]
> Наиль ©
Уже башку сломал. Все селектитца и фокусируется нормально, только зримая область после Item.Clear и перепостроении содержимого - выставляется в левый верхний угол. Как заставить показать другие области? Может, тогда, перезаписывать содержимое, а лишнее, естесственно просто удалять?
Наиль (2005-09-01 02:12:00) [6]Рядышком с
it.Selected:=trueпишетсяit.Focused:=true. Хотелось бы в одном флаконе, но к сожалению это едиственный, известный мне, способ.
psa247 (2005-08-31 10:01:00) [7]
> alex_*** (17.08.05 16:13) [6]
Каким образом все это связано с установкой фокуса на нужную строку. Если кол-во строк больше рабочей области?
Через Scroll получается, но криво...
alex_*** (2005-08-17 16:13:00) [8]усть у ListView шайтан-свойство OwnerData. В хелпе по нему все расписано. Очень удобно пользовать и не надо заморачиваться на обновление.
psa247 (2005-08-17 13:43:00) [9]
> Наиль © (15.08.05 23:12) [4]
Именно...
А как быть с прокруткой?
Есть, вроде бы, св-во Scroll(m,n)?
Наиль (2005-08-15 23:12:00) [10]Если использовать Add, Delete, Insert для обновления, то выглядеть это будет так:
it:=ListView1.Selected;
...обновление...
if уничтожение_it then it:=nil;
...обновление...
if it<>nil then it.Selected:=true;
Иначе запоминание какого-нибудь значения из ListView1.Selected, а потом поиск этого значения в ListView.
psa247 (2005-08-14 11:07:00) [11]Содержимое ListView может быть разным. К примеру, взять Task Manager со списком процессов. Выделяем строку, и пусть даже, если добавлена новая строка с новым процессом (независимо - до выделенной строки или после) при передачи фокуса - ListView выделит нужную (указанную до изменения) строку. Придумать свой алгоритм или можно все-таки КАК-НИБУДь?
tazik (2005-08-13 22:17:00) [12]А если так: прописать процедуру или ф-ю, как там вам надо, которая будет обновлять ListView. И просто запоминать индекс в глобальную переменную.
var idx: integer; // переменная в которую сохраняем индекс
procedure...updt...
begin
...
listview1.itemindex := idx;
end;
Ученик (2005-08-13 20:35:00) [13]
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, iSelected: Integer;
begin
if ListView1.Selected <> nil then
iSelected := ListView1.Selected.Index
else
iSelected := 0;
ListView1.Items.BeginUpdate;
try
ListView1.Clear;
for i := 0 to 10 do
ListView1.Items.Add.Caption := IntToStr(i);
if iSelected < ListView1.Items.Count then
ListView1.Selected := ListView1.Items[iSelected]
finally
ListView1.Items.EndUpdate
end
end;