Форум: "Основная";
Текущий архив: 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