Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.034 c
3-10610
Mike2 Kouzmine2
2003-08-13 14:34
2003.09.04
Ошибка при перекачке данных


8-10839
Bill
2003-05-03 13:39
2003.09.04
Ошбки в TImageList


7-11000
K-sergey
2003-06-19 15:14
2003.09.04
Поднятие трубки


14-10952
Ig
2003-08-13 20:36
2003.09.04
Ни кто не встречал компонент для Delphi


9-10536
Gritzan
2002-12-09 23:41
2003.09.04
Построить сферу на OpenGl вручную. не используя glu-товской библе