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

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

Обновление 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;


Наверх

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