Форум: "Основная";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];
Вниз
Помогите,плиз... мучаюсь с ListView Найти похожие ветки
← →
stany (2002-08-17 19:23) [0]Привет всем знатокам!Накипела тут тройка вопросов по вине ListView.Делаю вот такую штуку:в ListView вывожу список строк в которые можно входить как в "каталоги".При входе первая строка [..],затем другой список строк,а при выходе выбран тот "каталог",в который вошёл.Одна из проблем в том, что если при входе в "каталог" я выбрал элемент,который не вмещается в видимую часть ListView, ес-нно ListView делает скроллинг,то при выходе из "каталога" этот элемент выбран,но не виден пока не прокрутишь список.Пытался исправить это с помощью SetScrollPos, ScrollBox устанавливаеся в нужную позицию,но список не прокручиваеся;с ScrollWindow(),ListView.Scroll()-тоже не получается!
Другая проблема в том,что ListView медленно очищает и прорисовывает свои злементы с картинками.Можно как-то ускорить в этом случае ListView.Items.Clear?Взять к примеру такую рулезную вещь как Win Commander(да простят меня любители Far),так у него с бешеной скоростью обновляется список элементов в его листах, словно на асме написано;если Splitterом изменять размер панелей,то панель которая увеличивается как-то накладыватся на ту, которая уменьшается(но её размеры остаются прежними, потому что не появляется гор-ый ScrollBox).Мож кто знает кроме Christian Ghisler как это осуществить.Ну, ладно завалил тут я вас вопросами,вот привожу фрагмент кода,помогите кто может, please:
var
SelIndex,ScrollPos:integer;
procedure TMainForm.LoadFolders(Index:integer);
begin
ListView.Items.Clear;
ListView.SmallImages:=ImageList1;
...
begin
ListView.Items.BeginUpdate;
{Добавляем список строк}
ListView.Items.EndUpdate;
end;
ListView.Selected := ListView.Items[Index];
ListView.Selected.Focused := True
{Ничего из этого не помогает!}
{SetScrollPos(ListView.Handle,sb_Vert,ScrollPos,true);
ScrollWindow(ListView.Handle,0,ScrollPos,nil,nil);
ListView.Scroll(0,ScrollPos)}
end;
procedure TMainForm.LoadFiles;
var ImageCount:integer;
begin
ListView.Items.Clear;
ListView.Items.Add.Caption:=("[..]");
ListView.Items.Item[0].ImageIndex:=1;{Изображение стрелки наверх}
...
begin
ListView.Items.BeginUpdate;
{Добавляем список строк}
for ImageCount:=1 to ListView.Items.Count-1 do
ListView.Items[ImageCount].ImageIndex:=2;
ListView.Items.EndUpdate;
end;
ListView.Selected := ListView.Items[0];
ListView.Selected.Focused := True
end;
procedure TMainForm.ListViewDblClick(Sender: TObject);
begin
if ListView.Selected <> nil then
begin
if ListView.Selected.Caption="[..]" then
begin
LoadFolders(SelIndex);
end
else
begin
SelIndex:=ListView.Selected.Index;
ScrollPos:=GetScrollPos(ListView.Handle,sb_Vert);
LoadFiles;
end
end
end;
procedure TMainForm.ListViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case key of
VK_Return: ListViewDblClick(Sender);
end
end;
← →
Макс Черных (2002-08-17 22:22) [1]
> Накипела тут тройка вопросов по вине ListView
А чем, собственно ListView то виноват?
> Пытался исправить это с помощью SetScrollPos, ScrollBox
> устанавливаеся в нужную позицию,но список не прокручиваеся;с
> ScrollWindow(),ListView.Scroll()-тоже не получается
И не должно было получиться. Здесь поможет:
Uses CommCtrl;
ListView_EnsureVisible(ListView1.Handle, I, false);
I - Индекс элемента (ListItem) который надо показать.
По поводу ускорения отображения в ListView. Общая практика -
BeginUpdate перед и EndUpdate после любых изменений,
в т.ч. и Clear. Прои большом числе элементов ListItem не
слишком быстро работает. Спасает положение так называемый
виртуальный режим. Очень неплохой пример того как это делается
находится в папке:
\Borland\Delphi6\Demos\Virtual Listview
← →
stany (2002-08-18 00:25) [2]Спасибо,Макс Черных!
← →
stany (2002-08-18 00:35) [3]но даже с ListView_EnsureVisible(ListView1.Handle, I, false); ListView не прокручивает список,он только устанавливает курсор
← →
Макс Черных (2002-08-18 01:20) [4]
> но даже с ListView_EnsureVisible(ListView1.Handle, I, false);
> ListView не прокручивает списокон только устанавливает курсор
Быть того не может. Однозначно прокручивает, проверено многократно. А вот о каком курсоре речь идет, не понятно
ListView_EnsureVisible не выделяет елемент, а показывает
елемент (не обязательно выделенный) в видимой области.
Цитата из MSDN:
ListView_EnsureVisible
Ensures that a list view item is either entirely or partially visible, scrolling the list view control if necessary. You can use this macro or send the LVM_ENSUREVISIBLE message explicitly.
BOOL ListView_EnsureVisible(
HWND hwnd,
int i,
BOOL fPartialOK
);
Parameters
hwnd
Handle to the list view control.
i
Index of the list view item.
fPartialOK
Value specifying whether the item must be entirely visible. If this parameter is TRUE, no scrolling occurs if the item is at least partially visible.
Если не работает, то скорее всего ошибка в вызове или в параметрах, одним словом приводи код где вызывается эта функция,
посмотрим.
← →
stany (2002-08-18 01:31) [5]Вот:
procedure TMainForm.LoadFolders(Index:integer);
begin
ListView.Items.Clear;
ListView.SmallImages:=ImageList1;
...
begin
ListView.Items.BeginUpdate;
{Добавляем список строк}
ListView.Items.EndUpdate;
end;
ListView.Selected := ListView.Items[Index];
ListView.Selected.Focused := True
ListView_EnsureVisible(ListView1.Handle, ScrollPos, false);
end;
procedure TMainForm.ListViewDblClick(Sender: TObject);
var
begin
if ListView.Selected <> nil then
begin
if ListView.Selected.Caption="[..]" then
begin
LoadFolders(SelIndex);
end
else
begin
SelIndex:=ListView.Selected.Index;
ScrollPos:=GetScrollPos(ListView.Handle,sb_Vert);
LoadFiles;
end
end
end;
← →
stany (2002-08-18 01:33) [6]Где вы все MSDN берёте?
← →
stany (2002-08-18 02:07) [7]Был единственный спаситель,да и тот пропал!;-(
← →
Макс Черных (2002-08-18 20:32) [8]
> Где вы все MSDN берёте?
В магазине пиратских дисков. :)
> Был единственный спаситель,да и тот пропал!;
Если это про меня, то никуда я не пропадал.
Просто 01:31 по Москве - это 03:31 у нас, что уже и
поспать нельзя? :)
По существу:
Как я понял, ScrollPos это одна и та же переменная
ScrollPos:=GetScrollPos(ListView.Handle,sb_Vert);
Так мы получаем в ScrollPos - позицию скроллера у окна.
ListView_EnsureVisible(ListView1.Handle, ScrollPos, false);
А вот этой функции в качестве параметра нужен индекс
элемента в ListView, а вовсе не позиция скроллера.
Для примера, хотим выделить пятый ListItem и показать его
на экране:
ListView.Selected := ListView.Items[5];
ListView_EnsureVisible(ListView1.Handle, 5, false);
← →
stany (2002-08-18 20:49) [9]Thank you very much!
← →
stany (2002-08-18 20:56) [10]А насчет скорости обновления элементов ... VirtualListView Win Commander"у и в подметки не годится.Как думаешь что может делать
WC
← →
stany (2002-08-18 21:28) [11]Есть маленький недостаток:элемент становится последним в списке,неплохо было бы чтобы он в той же позиции(до входа в каталог)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c