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

Вниз

Как отоброзить в ListBox`е большой StringList?   Найти похожие ветки 

 
leonidus ©   (2006-07-09 01:19) [0]

Мастера подскажите пожалуйста, нужно в ListBox загрузить большой список итемов из TStringList`а. Если просто писать:
for i:=0 to StringList.count-1 do
listbox1.items.add(StringList.strings[i]);

то очень долго получается. Чую что нужно играться со стилем, используя что-то вроде lbVirtualOwnerDraw, но как с этим работать ума не приложу. Подскажите пожалуйста.


 
KilkennyCat ©   (2006-07-09 01:33) [1]

assign


 
KilkennyCat ©   (2006-07-09 01:35) [2]

ListBox1.Items.Assign(StringList); наверное, так...


 
Германн ©   (2006-07-09 02:28) [3]

Имхо, сначала стоит осознать, что "большой" список или текст в визуальном контролле - есть весьма изрядное неудобство для пользователя!


 
YurikGL ©   (2006-07-09 11:20) [4]


> Имхо, сначала стоит осознать, что "большой" список или текст
> в визуальном контролле - есть весьма изрядное неудобство
> для пользователя!

Не согласен.... если это список из пары тысяч городов, и один из городов нужно выбрать, то весьма обосновано запихать пару тысяч городов в визуальный компонент. Правда, в этом случае, лучше уже на БД переходить.

procedure TForm1.Button1Click(Sender: TObject);
var
slVr:tStringList;
begin
slVr:=TStringList.Create;
slVr.Add("Некий текст");
ListBox1.Items.Assign(slVr);
slVr.Free;
end;


 
Ketmar ©   (2006-07-09 11:42) [5]

Удалено модератором


 
leonidus ©   (2006-07-09 11:51) [6]

У меня словарь, в ListBox загружен список слов, поэтому там на самом деле должен быть большой список слов, тут ничего не поделаешь...


 
leonidus ©   (2006-07-09 12:06) [7]

Assign работает крайне медленно, это мне не подходит, т.к. спивок из 100.000 слов.

Для ListView я делал так:

var
list:tStringList;
...
...
list:=tstringlist.Create;
list.loadfromfile("...");
ListView1.OwnerData:=true;
ListView1.Items.Count := list.Count;

а потом:

procedure TForm2.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := list[Item.Index];
end;

но по ряду причин компонент ListView меня не устраивает, мне нужен именно ListBox, у него тоже есть что-то вроде OwnerData, но я не пойму как с ним работать.


 
Юрий Зотов ©   (2006-07-09 12:11) [8]

> leonidus ©   (09.07.06 11:51) [6]

Если Вы возьмете в руки обычный бумажный словарь, то увидите, что наверху каждой страницы в нем крупным жирным шрифтом  напечатаны буквы алфавита.

Как Вы думаете, зачем это сделано?

PS
Если сверху Вашего листбокса приляпать, например, еще и комбобокс, то список слов в листбоксе сократится в 26 раз для английского языка и еще сильнее - для русского.


 
Ketmar ©   (2006-07-09 12:34) [9]

а ещё очень интересно, в каком это языке ажно сто тыщ словей?


 
Юрий Зотов ©   (2006-07-09 12:39) [10]

Удалено модератором


 
leonidus ©   (2006-07-09 12:42) [11]

Господа, пожалуйста помогите решить ДАННУЮ проблему, разбивать словарь на блоки нельзя. Повторяю с ListView все работало прекрасно, мне просто нужно туже технолгию перенести на ListBox.


 
Ketmar ©   (2006-07-09 12:58) [12]

>Юрий Зотов ©   (09.07.06 12:39) [10]
посмотрел на словарь Мюллера. говорят, 60 тыщ. хочу словарь с сотней тыщ.

>leonidus ©   (09.07.06 12:42) [11]
попробуй сделать BeginUpdate/EndUpdate. просто запрети перерисовку ручками. должно ускорится.


 
Ketmar ©   (2006-07-09 12:59) [13]

вдогон: VirtualListBox не спасет?


 
Мефисто   (2006-07-09 13:02) [14]

Перед заполнением:
Item.BeginUpdate;
после заполнения:
Item.EndUpdate;
Вроде так, чуть-чуть поможет.


 
Мефисто   (2006-07-09 13:03) [15]


> Ketmar ©   (09.07.06 12:58) [12]


Опередили :)


 
Loginov Dmitry ©   (2006-07-09 13:06) [16]

Интересно, сколько времени будет виснуть прога, есть ее запускать из IDE.
:)


 
Юрий Зотов ©   (2006-07-09 13:06) [17]

> нужен именно ListBox, у него тоже есть что-то вроде OwnerData

Не OwnerData, а OwnerDraw. Эта штука отвечает за способ рисования строк, а не за способ задания данных.

Посмотрите LBS_NODATA - это не то, что Вам нужно?


 
Ketmar ©   (2006-07-09 13:06) [18]

>Мефисто   (09.07.06 13:03) [15]
так мне делать нечего (да и неохота разумным-вечным заниматься), я пью пиво и отписываюсь в разные места. %-)


 
Ketmar ©   (2006-07-09 13:07) [19]

>Loginov Dmitry ©   (09.07.06 13:06) [16]
а кто мешает обновлять листбокс в отдельном потоке? %-)


 
Юрий Зотов ©   (2006-07-09 13:08) [20]

> Ketmar ©   (09.07.06 12:58) [12]

Просто Мюллер больше не знал.


 
Leonid Troyanovsky ©   (2006-07-09 13:20) [21]


> Юрий Зотов ©   (09.07.06 13:08) [20]

> Просто Мюллер больше не знал.


А может это происки цензуры.

--
Regards, LVT.


 
begin...end ©   (2006-07-09 13:40) [22]

> Юрий Зотов ©   (09.07.06 13:06) [17]

Свойства OwnerDraw у ListBox"а тоже нет. Зато есть свойство Style, которое можно установить равным lbVirtual и использовать обработчик OnData.


 
leonidus ©   (2006-07-09 13:47) [23]

begin...end а можно маленькой примерчик?


 
begin...end ©   (2006-07-09 14:13) [24]

> leonidus ©   (09.07.06 13:47) [23]

На форме -- ListBox с Style = lbVirtual. А код такой:

type
 TMyForm = class(TForm)
   ListBox: TListBox;
   procedure FormCreate(Sender: TObject);
   procedure ListBoxData(Control: TWinControl; Index: Integer;
     var Data: String);
   procedure FormDestroy(Sender: TObject);
 private
   StringList: TStringList;
 end;

procedure TMyForm.FormCreate(Sender: TObject);
var
 I: Integer;
begin
 StringList := TStringList.Create;
 for I := 1 to 1000 do
   StringList.Add(IntToStr(I));
 ListBox.Count := StringList.Count;
end;

procedure TMyForm.ListBoxData(Control: TWinControl; Index: Integer; var Data: String);
begin
 Data := StringList[Index]
end;

procedure TMyForm.FormDestroy(Sender: TObject);
begin
 StringList.Free
end;


 
Юрий Зотов ©   (2006-07-09 14:26) [25]

> begin...end ©   (09.07.06 13:40) [22]

> Свойства OwnerDraw у ListBox"а тоже нет.

Вы ни за что не поверите, но о свойстве никто и не говорил. Перечитайте ветку.

> Зато есть свойство Style, которое можно установить равным lbVirtual и
> использовать обработчик OnData.

Вы снова ни за что не поверите, но это и есть именно тот самый LBS_NODATA, о котором говорилось в [17].


 
begin...end ©   (2006-07-09 18:04) [26]

> Юрий Зотов ©   (09.07.06 14:26) [25]

> Вы ни за что не поверите, но о свойстве никто и не говорил.
> Перечитайте ветку.

Вы ни за что не поверите, но в [7] говорилось о свойстве OwnerData у ListView, и предполагалось, что у ListBox есть что-то подобное. В ответ на это Вы в [17] сообщили, что у ListBox ничего "что-то вроде" OwnerData нет, а есть OwnerDraw. На самом же деле "что-то вроде" есть и для OwnerData, и для OwnerDraw (в том числе и одновременно) -- это как раз свойство Style, о котором Вы не упомянули.

> Вы снова ни за что не поверите, но это и есть именно тот
> самый LBS_NODATA, о котором говорилось в [17].

Вы снова ни за что не поверите, но я знаю, на что влияет свойство Style. Однако мне непонятно, зачем непосредственно управлять стилем окна вместо того, чтобы воспользоваться готовым свойством.


 
Юрий Зотов ©   (2006-07-09 19:36) [27]

> begin...end ©   (09.07.06 18:04) [26]

> в [7] говорилось о свойстве OwnerData

Буду весьма Вам признателен, если в [7] Вы вообще найдете хотя бы одно слово "свойство".

Я не нашел. Было сказано "что-то вроде OwnerData". То есть о чем-то вроде режима, когда данные для отображения в контроле предоставляются извне. Такой режим ListBox"а включается установкой стилей, которые называются LBS_OWNERDRAWxxx, а не LBS_OWNERDATAxxx - о чем и было сказано. И если Вы не поняли, ЧТО имелось в виду, то вряд ли Вам стоило "наезжать" по этому поводу на кого-то другого.

Еще такой режим включается установкой стиля LBS_NODATA - на который и было предложено обратить внимание.

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

Снова буду весьма Вам признателен, если Вы найдете цитатку, в которой предлагалось управлять стилем окна "непосредственно".

Я не нашел и этого тоже. Предлагалось "обратить внимание" - то есть, посмотреть, что означает этот стиль и, если окажется, что это действительно то, что нужно, то найти, как он включается в VCL. И если Вы снова не поняли, ЧТО имелось в виду, то Вам снова вряд ли стоило "наезжать" по этому поводу на кого-то другого.

Ну а если Вам так уж захотелось дать человеку решение в сверхразжеванном виде, то и в этом случае ничто не мешало адресовать пост [22] непосредственно автору вопроса, а в нем, вместо наездов, просто написать: "Установите Style=lbVirtual и используйте OnData".

То есть: поменьше, извините, выпендрежа - и все было бы чудесно.


 
begin...end ©   (2006-07-09 20:03) [28]

> Юрий Зотов ©   (09.07.06 19:36) [27]

> Буду весьма Вам признателен, если в [7] Вы вообще найдете
> хотя бы одно слово "свойство".

Там был приведён код, в котором использовалось именно свойство.

> То есть о чем-то вроде режима...

То есть, о чём-то вроде свойства...

> когда данные для отображения в контроле предоставляются
> извне. Такой режим ListBox"а включается установкой стилей,
> которые называются LBS_OWNERDRAWxxx

Такой режим ListBox"а (аналогичный режиму ListView"а с OwnerData = True, т.е. когда "данные для отображения в контроле предоставляются извне") включается установкой стиля, который называется LBS_NODATA, а не LBS_OWNERDRAWxxx. Хотя последний и должен тоже присутствовать.

> И если Вы не поняли, ЧТО имелось в виду, то вряд ли Вам
> стоило "наезжать" по этому поводу на кого-то другого.

А Вы в [22] где-то увидели "наезд"? Если да, то извините, но это как раз Вы не поняли, ЧТО имелось в виду.

> Предлагалось "обратить внимание" - то есть, посмотреть,
> что означает этот стиль и, если окажется, что это действительно
> то, что нужно, то найти, как он включается в VCL.

В [17] не давалось никаких направлений на поиск в VCL. К тому же, неясно, зачем искать, где что-то включается в исходниках VCL, когда вместо этого достаточно прочитать справку по свойствам.

> ...решение в сверхразжеванном виде...

Скорее, рациональное решение. А сверхразжёванного решения я не давал, пока об этом не попросил сам автор (см. [23], [24]).

> ничто не мешало адресовать пост [22] непосредственно автору
> вопроса, а в нем, вместо наездов...

Ещё раз -- где в [22] Вы увидели какие-то наезды?

Поменьше, извините, самомнения -- и всё будет чудесно.


 
KilkennyCat ©   (2006-07-09 20:09) [29]

все будет хорошо...


 
Юрий Зотов ©   (2006-07-09 21:02) [30]

> begin...end ©   (09.07.06 20:03) [28]

> Поменьше, извините, самомнения

Вот и я о том же.


 
begin...end ©   (2006-07-09 21:09) [31]

Удалено модератором


 
Мефисто   (2006-07-09 21:16) [32]

Удалено модератором


 
YurikGL ©   (2006-07-09 21:40) [33]


> Assign работает крайне медленно, это мне не подходит, т.
> к. спивок из 100.000 слов.

100 000 слов? а можно описать задачу более широко?
Может все же на БД перейти?
Можно еще глянуть как в электронных словарях-переводчиках реализовано. Уверен, что там никто в визуальный контрол все слова не грузит.


 
leonidus ©   (2006-07-09 22:41) [34]

begin...end большое вам спасибо.
Обсуждение закрыто.


 
Ketmar ©   (2006-07-10 00:35) [35]

>leonidus ©   (09.07.06 22:41) [34]
ни разу не закрыто.

>begin...end ©   (09.07.06 20:03) [28]
что-то вроде "режима" и что-то вроде "свойства" -- вещи, мягко говоря, разные...


 
begin...end ©   (2006-07-10 07:20) [36]

> Ketmar ©   (10.07.06 00:35) [35]

> что-то вроде "режима" и что-то вроде "свойства" -- вещи,
> мягко говоря, разные...

Разные. И что?


 
tButton ©   (2006-07-10 08:22) [37]


> for i:=0 to StringList.count-1 do
> listbox1.items.add(StringList.strings[i]);

//listbox1.Clear; // <--опционально
listbox1.items.addStrings(StringList.strings);


 
StriderMan ©   (2006-07-10 17:09) [38]

Господа, а зачем собственно, из одного Листа в другой гонять?

почему бы сразу не загрузить в  ListBox.Items?


 
atruhin ©   (2006-07-10 17:28) [39]

> Можно еще глянуть как в электронных словарях-переводчиках
> реализовано.

В Lingvo именно как у автора. Т.е. весь словарь в одном списке.


 
Мефисто   (2006-07-10 18:49) [40]


> atruhin ©   (10.07.06 17:28) [39]


В списке только ключивые слова :) В словариках еще словарные статьи.
При инсталяции лингво вдобавок производит индексирование словарей (если верить надписям инстолятора). Еще там реализация подключения/отключения тематических словарей т.е. примерно, как ЮЗ про алфавитный указатель намекнул. Так что, там тоже не все так просто ;)



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

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.063 c
15-1154071589
IceBeerg
2006-07-28 11:26
2006.08.27
Во! Незнал.


2-1154896036
Alral
2006-08-07 00:27
2006.08.27
Opredelenie kol-va simvolov v tekste


2-1155025590
ttt_111
2006-08-08 12:26
2006.08.27
Работа со сканером штрих-кода.


2-1154376390
Lexmark
2006-08-01 00:06
2006.08.27
Запуск программы на чужом компьютере


2-1154622398
HelloWord
2006-08-03 20:26
2006.08.27
MessageDig