![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как быстро загрузить в Listview до 500 000 записей? [D7]
Ruzzz © (2008-11-16 15:53:00)Привет! Сам вопрос звучить немного глупо, но вот проблема, как проги для работы с БД это делают? Я так понимаю что стандартные средства типа TListview не могут этого делать?
Может кто-то подсказать статьи или хоть намекнуть на приемы какие?
Может подгружать самому всю свою инфу, а потом как то переделывать TListview.Items.Add или точнее смотреть как он это делает и просто переделать метод?
Может использовать буфер, в один момент загружать лишь часть инфы в TListview? Корректировать вертикальный скролл и следить за ним, при перемешении подгружать нужную инфу? Все это кажется каким-то не правильным :(
Ega23 (2008-11-17 11:48:00) [1]
> апример, наборы данных (наследники TDataSet), которые умеют
> делать много того, чего боксы не умеют (например, поиски,
> сортировки, фильтрации и т.д.)
Зачем на клиенте в конкретный момент времени данных больше, чем помещается в видимой области визуального контрола?
Можешь объяснить?
MsGuns (2008-11-17 11:20:00) [2]Блин, нажал не ту кнопке в этой долбанной опере.
.. RxLib), если же источник один, то я бы использовал TClientDataSet в локальном, файловом режиме, а такжке для отображения TDataSource+TDBGrid - все это замечательно летает на сотнях тысячах записей
MsGuns (2008-11-17 11:16:00) [3]Использовать боксы для ХРАНЕНИЯ и ПОИСКА большого кол-ва табличных данных - явно неудачное решение. Существует множество куда более удобных средств для этого. Например, наборы данных (наследники TDataSet), которые умеют делать много того, чего боксы не умеют (например, поиски, сортировки, фильтрации и т.д.)
Если данные берутся каждый раз с разных мест, т.е. нет фикстрованного и стабильного источника, то подойдет датасет в памяти (в библиотеке
KilkennyCat (2008-11-16 23:43:00) [4]
> но а если пользователь не знает что находится в архиве?
а если знает, то это - инопланетянин. полмиллиона записией помнить...
tesseract (2008-11-16 23:12:00) [5]
> но а если пользователь не знает что находится в архиве?
Пусть не знает дальше. Подгрузку можно по построенному дереву организовать. и SQL в принципе, в таком случае рулит.
CodeMaster (2008-11-16 23:00:00) [6]
> Юрий Зотов © (16.11.08 22:03) [8]
Да ты прав конечно, это ненужное забитие памяти, но а если пользователь не знает что находится в архиве?
Юрий Зотов (2008-11-16 22:03:00) [7]> CodeMaster © (16.11.08 21:10) [7]
Даже если присобачить систему поиска, то зачем грузить данные в визуальный контрол? Система поиска прекрасно может работать и с невидимыми данными, а отображать уже найденное. Поэтому смысла в полной загрузке всех данных в визуальный контрол все равно нет.
CodeMaster (2008-11-16 21:10:00) [8]Ну если только присобачить туда систему поиска. И то нужна она будет если у тебя это будет Архив
Юрий Зотов (2008-11-16 20:42:00) [9]Полмиллиона записей в визуальный контрол? Какой же в этом смысл? Ведь юзер все равно практически не сможет с ним работать.
Правильный$Вася (2008-11-16 19:39:00) [10]
> как быстро загрузить в Listview до 500 000 записей? [D7]
> как проги для работы с БД это делают?
вообще-то такие программы используют специальные db-контролы, которые не содержат данных, я являются только дыркой для показа содержимого датасетов
а это заметно быстрее и функциональнее
Ruzzz (2008-11-16 18:11:00) [11]да забыл, если у вас файл уже содержит инфу о кол-ве и т.д., т.е. есть какой-либо заголовок, то первый пункт вообще быстр, не нужно проходит по всему файлу
Ruzzz (2008-11-16 18:09:00) [12]мож кому нада будет:
1) Открываем файл данных, подсчитываем кол-во записей, заодно формируем список Records (offset, size) для каждой записи, у меня это очень быстро получается
2) далее устанавливаем ListView.Items.Count
3) ранее вставляем код в ListView.OnData - тут передается один параметр Item: TListItem, смотрите на Item.Index и быстренько читаете из файла запись с нужной позиции используя ранее созданный список Records, используя Item.Caption и Item.SubItems.Add(n) выводите нужную инфу
4) есть еще ListView.OnDataHint -передает StartIndex, EndIndex: Integer - чтобы вы могли заранее подгрузить записи в требуемом диапазоне
Вообщем все оказалось просто :)
Ruzzz (2008-11-16 15:59:00) [13]ага, точно, извиняюсь, и спасибо!!! :)
Palladin (2008-11-16 15:57:00) [14]TListView.OwnerData + F1