Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизListBox с более 32000 итемов Найти похожие ветки
← →
Sirakuz (2003-08-19 16:33) [0]Подскажите пожалуйста компонент типа TListBox, но с поддержкой > чем 32000 итемов. И ещё: почему TRichEdit и TListBox сделаны на одном классе TStrings, но Richedit поддреживает более 32000 итемов(строк), а листбокс - нет?
← →
Miralex (2003-08-19 16:37) [1]А какая у тебя задача?
← →
clickmaker (2003-08-19 16:38) [2]TListView
RichEdit - обертка для виндозного класса "RICHEDIT", где размер текста ограничен практически только памятью
А ListBox - обертка для класса "LISTBOX", который ограничен этим числом итемов, причем только в Win 9x. В NT/XP такого ограничения нет
← →
KSergey (2003-08-19 16:40) [3]Пожлейте пользовтеля!
Как он будет листбоксить при кол-ве строк более 32тыщ?!!!!
← →
Sirakuz (2003-08-19 16:42) [4]Задача: Нужно отразить на экране список; в котором очень возможно присутствие более чем 32000 строк(например тот же обычный большой текстовый файл). Юзер там не должен ничего редактировать. Предполагается, что потом из этого списка он будет делать какие-то выборки(типа вывод строк в которых содержиться интересующая подстрока)... и т.д. и т.п.
← →
Miralex (2003-08-19 16:42) [5]с масивом пусть работает!
зачем ему стока строк?
← →
Sirakuz (2003-08-19 16:51) [6]Ему стока строк не надо. Он(юзер) не должен их скролить. Он должен: набрать "а" и в список попали все слова с буквой "а". Потом ему захочется посмотреть начало списка и конец(списка). Потом это всё нужно сохранить в файл. А юзер с массивом работать не может :) . Ему нужно видеть промежуточный и окончательный результат своих действий
← →
KSergey (2003-08-19 17:07) [7]А информацию откуда эта беоется? Может ему (пользователю) DBGrid сойдет? DataSet и в памяти можно организовать...
← →
Игорь Шевченко (2003-08-19 17:09) [8]Program Files\Borland\Delphi\Demos\Virtual ListView
← →
Sirakuz (2003-08-19 17:18) [9]Информация берётся не из базы, а из обычного текстового файла.
Посмотрел я TListView. Не то. Очень медленно работает(добавляет итемы, особенно где-то после 32000). Даже RichEdit работает во много (десятки) раз быстрее (Там ведь есть прямая ф-я "LoadFromFile"). Можно конечно RichEdit"у поставить ReadOnly и WordWrap=False тогда это будет что-то типа списка, но это не эстетично переходить со строки на строку курсором, а не маркером.
← →
sniknik (2003-08-19 17:31) [10]КлиентДатаСет + ДбГрид, без ограничений на строки.
← →
KSergey (2003-08-19 17:35) [11]sniknik © (19.08.03 17:31) дело говорит! Заполнять его из текстового файла - вот и все. И никаких БД не надо.
Вопроси попутно: (модератор, ну не надо удалять "расширяющие" вопросы, а?) TClientDataSet - это DataSet в памяти, готовый, встроенный
Почему часто для этого предлагают сторонние компоненты?
← →
Sirakuz (2003-08-19 17:50) [12]Скажите plz в 2-х словах, как юзать этот КлиентДатаСет. FileName ставлю(что ещё ставить не знаю). Ставлю Active в True -"MisMatch in DataPacket".
← →
sniknik (2003-08-19 18:24) [13]послал тест от одного COM обьекта, его создание закоментарил иначе у тебя бы ошибка была, и не нажимай "отправить" там вызовы остались.
← →
sniknik (2003-08-19 18:34) [14]кстати чуть не забыл замени все вызовы
DataSet.FieldByName("ххххх").AsInteger:= ххххх;
на
DataSet.Fields[хх].AsInteger:= ххххх;
иначе на 32тысячах это замедлит заполнение (может не намного но...)
мне на 100 записях было все равно, нужна была наглядность.
← →
Dred2k (2003-08-19 20:50) [15]> KSergey © (19.08.03 17:35) [11]
> встроенный
Как насчет dbclient.dll ?
← →
Sirakuz (2003-08-20 12:42) [16]А я тут устроил BenchMark спискам:
Конфига компа: WinXP Prof SP1 Athlon 1.2 ГГц 256Mb
(80000 - т.к. в моём файле 80000 строк)
TListView:
ListView1.Items.BeginUpdate;
For i:=1 to 80000 do
ListView1.AddItem("123",nil);
ListView1.Items.EndUpdate;
>4минут(не стал ждать на 4-й минуте i~=7000)
TClientDataSet:
for i:= 1 to 80000 do begin
with DataSet do begin
Append;
Fields[0].AsString:= inttostr(i);
end;
end;
DataSet.Post;
-54 секунды;
RichEdit:
Richedit1.lines.LoadFromFile("c:\123.123"); //там 80000 строк
-4 секунды (!!!) - Вот он Идеал!!(Но это не совсем список :()
← →
clickmaker (2003-08-20 12:53) [17]По поводу ListView: можно сначала быстренько заполнить видимую область, затем создать поток и в нем долить остальное. Пока доливаешь, юзер уже может начинать просматривать часть списка
← →
Sirakuz (2003-08-20 13:16) [18]clickmaker, читай: на 4-й минуте i~=7000 . Это получается что 80000/7000 = 11,4; 11,4*4=45 минут должен ждать юзер чтобы увидеть конец списка. Лучше уж использовать ClientDataSet и поток. И всё равно это не то. Наверняка есть такой компонет, типа список, поддерживающий неограниченное количество строк, в котором есть функция loadFromFile.
← →
BVP (2003-08-20 14:53) [19]если 32000 строк в TListBox это ограниечение Win98
(в Win2000 работает и это
for i:=0 to 650000 do
ListBox1.Items.Add("ff"+Inttostr(i));) то попробуй
TListView.
Ставь ListView1.OwnerData:=true.
Cобытие onData :
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption :="ff"+ SL.Strings[Item.index];//StringList:TStringList
end;
добавление строк:
...
var i:integer;
begin
SL.Clear;
for i:=0 to 80000 do
SL.Add("hh"+inttostr(i));//быстро
ListView1.Items.BeginUpdate;
ListView1.Items.Count:=SL.Count;
ListView1.Items.EndUpdate;
...
чтение из файла LS.LoadFromFile(opendialog1.FileName);
ListView1.Items.Count:=LS.Count;
(подробно см в $(DELPHI)\Demos\Virtual Listview)
← →
sniknik (2003-08-20 15:50) [20]Sirakuz © (20.08.03 12:42) [16]
нашол что сравнивать!
Richedit1.lines. LoadFromFile("c:\123.123"); //там 80000 строк
(чтение сплошного файла)
и
ListView1. AddItem("123",nil);
Append; Fields[0].AsString:= inttostr(i);
(добавление позаписьно)
тогда уж сравнивай с ClientDataSet1.LoadFromFile предварительно сохраненые ClientDataSet1.SaveToFile("xxxx.cds", dfBinary);
те же 80000 тыс - 6сек
(дохлый пень 1000, 256памяти)
то же самое почти? не так ли? (только тут еще время на разбитие по записям добавляется)
а вообще сравни еще с BlockRead с нетипизированным файлом, еще быстрее будет.
← →
DVM (2003-08-20 17:15) [21]
> Sirakuz © (19.08.03 17:18) [9]
> Посмотрел я TListView. Не то. Очень медленно работает(добавляет
> итемы, особенно где-то после 32000).
Virtual ListView (или ListView в виртуальном режиме) очень быстро работает (1 000 000 итемов за 1-2 сек). Вам нужен именно он. Скорость добавления практически = скорости считывания их из источника, т.е. скорее всего плох ваш алгоритм заполнения.
← →
Sirakuz (2003-08-20 17:22) [22]ДА! ClientDataSet1.LoadFromFile СУПЕР!(4 сек.)
А что там насчёт dbclient.dll ?(by Dred2k © (19.08.03 20:50) [15]) У меня такого файла нет.
← →
clickmaker (2003-08-20 17:45) [23]Sirakuz © (20.08.03 17:22) [22]
ДА! ClientDataSet1.LoadFromFile СУПЕР!(4 сек.)
А что там насчёт dbclient.dll ?(by Dred2k © (19.08.03 20:50) [15]) У меня такого файла нет.
if Deplhi.Version > 4 then
dbclient.dll = midas.dll
← →
sniknik (2003-08-20 18:33) [24]насчет мидаса можеш не волноватся если сделал как в посланом примере (MidasLib в uses) тогда dll не нужна.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c