Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

Как отоброзить в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.036 c
8-1135260332
NailMan
2005-12-22 17:05
2006.08.27
[DShow] Фильтр для настройки яркости и пр.


2-1154956780
joo
2006-08-07 17:19
2006.08.27
многопоточный доступ к файлу


2-1154950983
van_der_alex
2006-08-07 15:43
2006.08.27
простые вопросы по dataset


6-1144603398
Izolda
2006-04-09 21:23
2006.08.27
Поисковая система


2-1154810751
RGB
2006-08-06 00:45
2006.08.27
Справочник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский