|
|
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Думаю с этой проблемой сталкивались многие, хотелось бы узнать кто как с ней справился. Имеется ListView: Код: plaintext 1. 2. 3. Есть кнопочка, по нажатии на которую происходит заполнение таблицы случайными данными: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ShowWindow(Grid,true); и соответственно ShowWindow(Grid,false); - для того чтобы не вызывалась перерисовка. Как видите все значения взяты на "шару", только для представления данного примера; в общем то заполняем значит 1000 строк в 6 столбцов, и это происходит аж 5 сек,а то и 6 !!! (на КПК, под управлением WinCE). - что непозволительно долго Прошу помочь мне, скажите что не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 14:27:57 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
А если вызвать сначала SetItemCount()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 14:37:00 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Я предлагаю сразу отказаться от ListView в пользу какого нибудь грида. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 15:32:01 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
>>А если вызвать сначала SetItemCount()? В реальной задаче заранее не известно кол-во item'ов, все данные берутся из БД и на "лету" заполняются в таблицу. Делать же два цикла (сначала считаем кол-во, потом заполняем) - это не выход (( >>Я предлагаю сразу отказаться от ListView в пользу какого нибудь грида. Что именно можно использовать? что посоветуете?.. пишу на чистом API. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 15:41:34 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
> Что именно можно использовать? что посоветуете?.. пишу на чистом API. Можно посмотреть компоненты OCX, ActiveX. Можно написать самому, я могу небольшой рабочий пример подкинуть. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 15:47:09 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Очень похоже на ListView. 1) Но поддерживат только режим работы 2) Но не поддерживат редактирования в ячейке (ListView это позволяет лишь в первой колонке) 3) Где то есть мелкие недочности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 15:49:46 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Счас посмотрю ) большое спасибо! ))) ЗЫ: для ввода в ячеку вызываю дилог с Editom и кнопочкой ОК ;).. но ранне здесь же на форуме обсуждалась данная тема, и проблема с вводом непосредственно в ячейку была решена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 16:37:03 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иванно ранне здесь же на форуме обсуждалась данная тема, и проблема с вводом непосредственно в ячейку была решена. 15 строк кода 1) Создать Edit на гриде и правильно разместить его над ячейкой 2) Перемещать или скрывать его в каких то случаях. Posted via ActualForum NNTP Server 1.4 Модератор: Тема перенесена из форума "C++". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 16:39:50 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ShowWindow(Grid,true); и соответственно ShowWindow(Grid,false); - для того чтобы не вызывалась перерисовка. Надо использовать LockWindowUpdate() , а не show/hide. А в третьих надо использовать virtual list view. Это спец. режим работы, когда все данные НЕ ХРАНЯТЬСЯ в ListView, а запрашиваются у приложения при отображении. Поищи на MSDN именно по "virtual list view" -- легко найдёшь хорошую статью о том, как это делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 18:29:33 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
что-то другое кроме ListView имеет смысл использовать лишь если нужна кроссплатформенность или какие-то out-of the-box фичи. ListView достаточно мощный и быстрый, надо только уметь им пользоваться. Мы пробовали кроме него MSflexGrid ActiveX, но особого восторга по его скорости и неглюковитости не было -- и медленный, и глюковатый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 18:32:43 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
>>// а так в итоге ты создаёшь в 6 раз больше строк, чем нужно. Тоесть мне вынести ListView_InsertItem (Grid,&lvi); ? - в таком случае у меня грид получается пустой.. я так понял что ListView_InsertItem (Grid,&lvi); - как бы "ячейку" вставляет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 10:53:08 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
а операция: lvi.iItem = i; - не существенна в данном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 10:58:19 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иван4444 пишет: > Тоесть мне вынести ListView_InsertItem (Grid,&lvi); ? - в таком случае у > меня грид получается пустой.. ListView_InsertItem - создаёт СТРОКУ. Соответственно, положите его в тело цикла по строкам, а не по колонкам строк. > я так понял что ListView_InsertItem (Grid,&lvi); - как бы "ячейку" > вставляет. Нет. Item- строка. Колонка - Subitem. Иногда также (на самом деле везде в документации) при описании поля 0 в строке говорят, что это - item, а всех остальных - что это subitem. Т.е. Item - это вся строка и нулевая её колонка. Subitem - все осталные колонки. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 11:00:30 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
вы и вправду МАСТЕР, MasterZiv ))) ... когда только создавал свою табличку, то в качестве iSubItema, в голову не приходило вручную ствить 0 . Потому решил что это ячейка. .. счас разберусь с виртуальными.. - если есть у кого небольшой код, в качестве примера, типа того что привел я, то буду оч рад!.. Всем заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 11:09:26 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иван4444 пишет: > .. счас разберусь с виртуальными.. - если есть у кого небольшой код, в > качестве примера, типа того что привел я, то буду оч рад!.. Всем заранее Я говорил, в MSDN поищите, там есть подробнейшие примеры. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 19:25:22 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Чтот не могу понять как именно заполняется virtual list view, делаю это следующим образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Реультат хотелось бы получить : колонка1 | колонка2 | колонка3 | субитем0| субитем1 | субитем2 | ..... | ..... | .... | но получается не совсем то что надо, и скажем при клике на какойнибудь элемент, все содержимое меняется. ЗЫ: вся проблема осложняется тем, что работать он должен следующим образом - заполниться значениями из БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 08:57:13 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
вопрос есче в том, когда посылается, и сколько раз и с какой целью сообщение: LVN_GETDISPINFO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 09:07:21 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
я так понял, когда каждый раз перерисовка, но как тогда сделать так, чтоб list view был стабилен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 09:13:58 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иван4444 пишет: > вопрос есче в том, когда посылается, и сколько раз и с какой целью > сообщение: LVN_GETDISPINFO На первую клетку -- для всей строки, для её текста, иконки и состояний и пр. лабуды. Потом - на все остальные ячейки. И так для всех видимых строк. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 12:20:00 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иван4444 пишет: > Чтот не могу понять как именно заполняется virtual list view, > делаю это следующим образом: Чтобы заполнить виртуальный LV, нужно только установить кол-во колонок и кол-во item-ов. SetItemCount() кажется. Всё остальное вытаскивается по требованию. Маску, на сколько я помню, вы должны не заполнять, а опрашивать, и заполнять поля, которые нужны. Ваш код я вообще не понял. что вы там делаете - загадка. > ЗЫ: вся проблема осложняется тем, что работать он должен следующим > образом - заполниться значениями из БД. Ну так самое то как раз для него. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 12:20:07 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иван4444 пишет: > я так понял, когда каждый раз перерисовка, но как тогда сделать так, > чтоб list view был стабилен? Это что значит ? Он и так стабилен. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 12:20:48 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
MasterZiv пишет: Вот как примерно должен выглядеть OnGetDisplayInfo Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 12:32:25 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Да, мои предыдущие сообщения и вправду выглядят не вполне ясно, попробую исправиться )) вот для примера мой старый код для простого list view: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. При этом заполнялся List view из БД. Все бы ничего, но долго. счас же я пробовал поступить таким вот методом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. Тепреь такая проблема: допустим у меня 100 записей, и по идее, если б я просто заполнял ListView, то я бы прошелся по всем записям, заполнил ListView и выполнил файнолайз. Но Virtual LIst View работает следующим образом: выводит только то что влазит в видимую часть. Так у меня влазит 12 записей, (БД ждет следующего запроса, Finalize не вызвался), при прокрутке списка в них -все отрисовывается замечательно, но при прокрутке в верх, он выводит не предыдущую запись, а следующую из БД. Так вот мне хочется ухнать, неужели нужно каждый раз при выхое перерисовки, сбрасиывать БД, затем в холостом ходе прокручивать до нужной позиции и делать вывод? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 14:33:18 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Иван4444 пишет: > while(EoF()!=true) > { > NextData(); > > InsertRow (mw.lvi,mw.Grid ,lineNumber); > > InsertItem(mw.lvi,lineNumber,*0*,GetTextByColName(L"Col1"),mw.Grid); > InsertItem(mw.lvi,lineNumber,*1*,GetTextByColName(L"Col2"),mw.Grid); > InsertItem(mw.lvi,lineNumber,*2*,GetTextByColName(L"Col3"),mw.Grid); > InsertItem(mw.lvi,lineNumber,*3*,GetTextByColName(L"Col4"),mw.Grid); > > lineNumber++; > > } > Finalize(); в Virtual LIst View не нужно делать InsertItem. > case LVN_GETDISPINFO: > { > if(mw.b_vt_switch == *0*) > { > mw.b_vt_switch = *1*; > wstring SQL; > > SQL.clear(); > SQL = L"select cln.VNAME,cln.VADRES,cln.NID from cln ORDER BY cln.VNAME"; > > wstring err; > err = ExecPrepare(SQL); Да вы чего, с ума сошли ? Вы что ж будете на обновление каждой ячейки запрос выполнять ? Его надо выполнить один раз и созранить результат, а потом показывать. > Так у меня влазит 12 записей, (БД ждет следующего запроса, Finalize не > вызвался), при прокрутке списка в них -все отрисовывается замечательно, > но при прокрутке в верх, он выводит не предыдущую запись, а следующую из БД. Это у вас неправильно что-то написано. Кроме того, НЕЛЬЗЯ делать запрос внутри LVN_GETDISPINFO. Это происходит очень часто и очень непредсказуемо. > Так вот мне хочется ухнать, неужели нужно каждый раз при выхое > перерисовки, сбрасиывать БД, затем в холостом ходе прокручивать до > нужной позиции и делать вывод? Ничего никуда сбрасывать не надо. Надо выполнить запрос, получить его результат, сохранить, и потом показывать в ListView. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 11:55:37 |
|
||
|
Медленная работа ListView
|
|||
|---|---|---|---|
|
#18+
Большое вам спасибо, вы мне реально помогли. Меня смущало следующее, дело в том что если выполнить запрос и записать куда то - это схоже с тем что их записать в List View (но вот время заполнения м.б. кончено разным), и таким образом нет смысла куда либо их писать. Да и вообще дублировать БД, тоже не хотелось. Есче раз спасибо за исчерпывающий ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 12:20:35 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35678172&tid=1344813]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 314ms |

| 0 / 0 |
