Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.07.21;
Скачать: [xml.tar.bz2];

Вниз

Анти SelectAll...Существует что-нибудь подобное?   Найти похожие ветки 

 
Tcount ©   (2012-11-22 23:49) [0]

У меня появился вроде простой вопрос...
Например, у ListView"a есть метод SelecAll. А есть что-то подобное, делающее обратное? Может в WinApi есть? Просто не знаю, в какую сторону копать)


 
Германн ©   (2012-11-23 00:16) [1]


> А есть что-то подобное, делающее обратное?

ClearSelection не подойдет?


 
DVM ©   (2012-11-23 00:17) [2]


> А есть что-то подобное, делающее обратное?

пройти по всем элементам и развыделить сложно что ли?


 
Tcount ©   (2012-11-23 00:22) [3]


> пройти по всем элементам и развыделить сложно что ли?

Я бы с радостью, но строк довольно много)


 
Tcount ©   (2012-11-23 00:24) [4]


> ClearSelection не подойдет?


СПАСИБО! То, что доктор прописал) Чот я не обратил внимание на методы, начинающиеся с "Clear") Не всегда хорошие ассоциации с этим словом)


 
Германн ©   (2012-11-23 02:01) [5]


> Я бы с радостью, но строк довольно много)
>


> СПАСИБО! То, что доктор прописал

Там тот же самый цикл по тем же Items и их Subitems.


 
Tcount ©   (2012-11-23 02:11) [6]


> Там тот же самый цикл по тем же Items и их Subitems.


Разве не с помощью WinApi?


 
Tcount ©   (2012-11-23 02:22) [7]

Не нашел я модуля этого, хотелось бы взглянуть на алгоритм ClearSelection...
Если в нем пробегается конкретно по всем строкам, то для моего случая можно было бы в некоторых случаях сделать быстрее: например, сначала записать кол-во выделенных элементов (SelCount), сделать ту же пробежку, только при каждом обнаружении выделения уменьшать эту переменную, пока она не станет равной нулю, тогда и прервать пробежку.


 
Tcount ©   (2012-11-23 02:23) [8]

Или ничего вообще не записывать, постоянно проверяя SelCount. Хотя не думаю, что так будет быстрее)


 
Германн ©   (2012-11-23 02:47) [9]


> Tcount ©   (23.11.12 02:11) [6]
>
>
> > Там тот же самый цикл по тем же Items и их Subitems.
>
>
> Разве не с помощью WinApi?
>

А разве WinApi - это некая "волшебная палочка"?


 
DVM ©   (2012-11-23 10:17) [10]


> Tcount ©   (23.11.12 00:22) [3]
>
> > пройти по всем элементам и развыделить сложно что ли?
>
> Я бы с радостью, но строк довольно много)

Сто тысяч миллиардов? У тебя там наверняка не более 50 000 строк, даже при значительно меньшем количестве даже в виртуальном режиме использовать обычный ListView проблематично. Цикл от 0 до 50 000 выполняется на современном компьютере за ничтожно малое время.


 
Dimka Maslov ©   (2012-11-23 10:20) [11]


> Цикл от 0 до 50 000 выполняется на современном компьютере
> за ничтожно малое время


Только если не забыть сделать BeginUpdate и EndUpdate...


 
han_malign   (2012-11-23 10:43) [12]


> не более 50 000 строк, даже при значительно меньшем количестве
> даже в виртуальном режиме использовать обычный ListView
> проблематично.

 - да ничего, несколько сотен тысяч вполне тянет - главное по невидимым ListItem не бегать, а статусы в элементах "внешнего" контейнера кешировать...

> > Разве не с помощью WinApi?
...
> А разве WinApi - это некая "волшебная палочка"?

- как бээ..., зачастую - да:
ListView_SetItemState(lv.Handle, -1, 0 , LVIS_FOCUSED or LVIS_SELECTED); // LVM_SETITEMSTATE


 
DVM ©   (2012-11-23 10:47) [13]


> han_malign   (23.11.12 10:43) [12]


> - как бээ..., зачастую - да:
> ListView_SetItemState(lv.Handle, -1, 0 , LVIS_FOCUSED or
> LVIS_SELECTED); // LVM_SETITEMSTATE

Ну а внутри этого макроса разве нет цикла?


 
DVM ©   (2012-11-23 10:51) [14]


> han_malign   (23.11.12 10:43) [12]


>  главное по невидимым ListItem не бегать, а статусы в элементах
> "внешнего" контейнера кешировать...

Ну так это и есть виртуальный режим. В виртуальном режиме не запрашиваются данные невидимых элементов и бегать по ним и не нужно. Данные тоже хранятся в обычном списке. Я не знаю как устроен внутри ListView но в виртуальном режиме он намного хуже, чем, например, TVirtualTreeView. Даже прокрутка у него хуже работает (отстает от мыши что ли, как то заторможенно все). И памяти жрет больше.


 
han_malign   (2012-11-23 11:41) [15]


> несколько сотен тысяч вполне тянет

- собственно, как раз множественное выделение - пришлось полностью ручками сделать - т.к. OnData на каждый чих делается...

Ну и конечно epic fail на
procedure TListItems.Clear;
begin
 if Owner.HandleAllocated then ListView_DeleteAllItems(Handle);
end;

- с OnData(+ TCustomListView.Delete(){ OnDeletion }) - на каждый элемент...
Только и исключительно:
procedure TListItems.SetCount(Value: Integer);
begin
 ListView_SetItemCountEx(Handle, Value, LVSICF_NOINVALIDATEALL);
end;

:= 0; - с очисткой ассоциированных данных во внешнем контейнере(что вполне логично)...

З.Ы. А "оптимизация":
lv.OwnerData:= false;
lv.Items.Clear;

- это вообще армагедецЪ...


 
han_malign   (2012-11-23 12:55) [16]


> Даже прокрутка у него хуже работает (отстает от мыши что
> ли, как то заторможенно все). И памяти жрет больше.

- а это реализация обработки LVN_GETDISPINFO { OnData }, где набивается список Subitems в OnData(хорошо хоть кешируется, т.е. для PLVDispInfo(NMHdr)^.item.iSubItem > 0 список заново не набивается)...
Если отрабатывать по честному(как OnGetSubItemImage) - то чуть пошустрее будет, т.к. выделение памяти таки затратная операция...

И LVM_SETCALLBACKMASK(и соотвественно state/stateMask or LVIS_FOCUSED or LVIS_SELECTED or ... )
- отсутствует как класс - оттуда и объем(как минимум 12*N бит)...


 
Sha ©   (2012-11-23 13:05) [17]


> DVM ©   (23.11.12 10:51) [14]
>  Я не знаю как устроен внутри ListView но в виртуальном
> режиме он намного хуже, чем, например, TVirtualTreeView.
>  Даже прокрутка у него хуже работает (отстает от мыши что
> ли, как то заторможенно все).


Вот только что проверил TListView (ViewStyle=vsReport,OwnerData=true,OwnnerDraw=true).
Просто летает на 80.000 элементах.
Прокрутка великолепная.


 
Sha ©   (2012-11-23 13:12) [18]

естественно, всеми селектами, птичками, иконками и т.п. придется рулить вручную (Multiselect=false)


 
han_malign   (2012-11-23 13:22) [19]


> Прокрутка великолепная.

- i7?
А клиенты на Келеронах сидят...

TVirtualXxxView - не пробовал, но DrawGrid - всё-таки на порядок быстрее - особенно если значения ячеек несколько раз в секунду обновлять надо(вот только выравнивание на границу ячейки при горизонтальной прокрутке бесит, а пилить лень)...

Кстати - есть еще классический глюк с закраской квадратика на стыке srollbar-ов...


 
Sha ©   (2012-11-23 13:29) [20]


> han_malign   (23.11.12 13:22) [19]
> > Прокрутка великолепная. - i7?


i5 )


> ..TVirtualXxxView - не пробовал,


я попробовал, там как раз верт прокрутка не устроила


> но DrawGrid - всё-таки на порядок быстрее -
> особенно если значения ячеек несколько
> раз в секунду обновлять над


Зачем так часто?


 
DVM ©   (2012-11-23 14:48) [21]


> Sha ©   (23.11.12 13:29) [20]


> я попробовал, там как раз верт прокрутка не устроила

А что там с прокруткой то не так? Там она просто хитрая.


> Вот только что проверил TListView (ViewStyle=vsReport,OwnerData=true,
> OwnnerDraw=true).
> Просто летает на 80.000 элементах.

А у меня при почти аналогичных настройках тормозило. Не сказать чтоб прямо совсем, но какой то дискомфорт при прокрутке был. То было на Delphi7 и XP еще. Правда там был еще один момент, в ячейках отрисовывались галочки, фон полосатый, сами строки цветом. Но не думаю, что именно отрисовка добавляла сильно тормозов.

Сейчас сделал тестовый проект с 1000 000 узлов под XE2 но правда без OwnerDraw - не тормозит.


 
Sha ©   (2012-11-23 15:06) [22]

> DVM ©   (23.11.12 14:48) [21]
> А что там с прокруткой то не так? Там она просто хитрая.


Да, я знаю.
Просто, единственное существенное отличие от TListView,
которое могло привлечь - различная высота ячеек в таблице.
Так вот как раз такие таблицы с большим количеством строк,
оно прокручивает с ошибкой (на конец таблицы ползунком встает
с 5-6ой попытки).

> А у меня при почти аналогичных настройках тормозило.
> Не сказать чтоб прямо совсем, но какой то дискомфорт при прокрутке был.
> То было на Delphi7 и XP еще. Правда там был еще один момент,
> в ячейках отрисовывались галочки, фон полосатый, сами строки цветом.
> Но не думаю, что именно отрисовка добавляла сильно тормозов.


У меня Delphi7 и XP/W7 - нормально все и с деревом, и с птичками, и с украшайзингом.


 
han_malign   (2012-11-26 18:14) [23]


> Зачем так часто?

- на прошлой работе - заказчик утверждал, что его мотористы отслеживают показания датчиков с временем реакции порядка 50 мс, и 10 Гц для них уже тормоза вызывающие дискомфорт(времена перехода с циферблатов - на жестокое реальное время под DOS)... Правда убедили, что они себе льстят, да и прецизионный АЦП больше 5 Гц физически не выдавал...

- сейчас - уровень сигнала в мониторе каналов захвата голоса 5 раз в секунду обновляется(слово "двести" произносится в среднем за 200 мс(как и известный посыл из трех на три)) - раз в секунду уже реально некомфортно...


 
Sha ©   (2012-11-26 19:41) [24]

> han_malign   (26.11.12 18:14) [23]

сейчас проверил на 60-строчном листвью (размер примерно x=600, y=1100)
2 столбца: 1ый - 2 иконки+40 знаков текста, 2ой - 4 иконки + 2 знака,
обновление 17 раз в секунду. Вроде немного,
но все равно ни фига не разглядеть из-за частоты обновления экрана 60 Гц.


 
han_malign   (2012-11-27 12:27) [25]


> сейчас проверил на 60-строчном листвью

процессор оно значительно больше грузит, и принцип перерисовки там не всегда адекватный:
- в DrawGrid можно часто обновлять одну ячейку через InvalidateCell(InvalidateRect)
- ListView - на поверхности только LVM_UPDATE/LVM_REDRAWITEMS, да полный Invalidate...
(InvalidateRect({LVM_GETITEMRECT/LVM_GETITEMINDEXRECT}) - вроде не прокатывает, не помню уже)


 
Sha ©   (2012-11-27 13:19) [26]

Я делал полный Invalidate, получил частоту 17 Гц,
этого вполне достаточно, чтобы не заморачиваться с чем-то другим.


 
han_malign   (2012-11-28 08:26) [27]


> этого вполне достаточно

- повторюсь, у юзверей обычно Celeron - и повезет если из этой эпохи - и еще десяток левых приложений зачастую висит - там не достаточно...

З.Ы. Нельзя программистам мощные рабочие станции выдавать - расслабляет... А ведь пророчат эпоху ультра-мобильных ПК, где особо не разгуляешься...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.07.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.012 c
2-1353504016
Tcount
2012-11-21 17:20
2013.07.21
Пишу свое интернет-радио...


2-1353050219
Unknown1
2012-11-16 11:16
2013.07.21
сравнение 2-х TFileStream


15-1361903162
Дмитрий С
2013-02-26 22:26
2013.07.21
TList<TRecord>


15-1362083407
Юрий
2013-03-01 00:30
2013.07.21
С днем рождения ! 1 марта 2013 пятница


15-1362067551
Ega23
2013-02-28 20:05
2013.07.21
А почему над картошкой дышат?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский