-
Приветствую всех. Подскажите пожалуйста как переделать TComboBox чтоб компонент работал не со своим списком TStrings а с созданным отдельно TStrings и присоединенным к нему и другим таким же TComboBox через свойство...
На подобие этого: s1:Tstrings; ... ComboBox1.PComboStringList:=@s1; ComboBox2.PComboStringList:=@s1;
необходимо это для экономии памяти т.к. необходимо чтоб много ComboBox'ов отображало один и тот же список но выбирать могли разные пункты....
Зарание благодарю за любую конструктивную помощь...
-
Это попахивает Lookup-ом
-
эммм... поподробней можно пожайлуста ... может есть мысли как реализовать эту задачу другими споссобами, какими либо аналогами ComboBox?
-
Это сколько же надо иметь комбобоксов на форме, чтобы получить заметный выигрыш по памяти с общим TStrings?
-
Задача бредовая. Скорее всего - ошибка проектирования.
-
ну примерно 4 группы по 20 ComboBox'ов у каждой группы своий Tstrings примерно по 200-400 строк каждый.... выигрыш не только в памяти!!! выигрышь в производительности... Tstrings часто будут менятся представьте сколько нужно проделать чтоб во все 80 ComboBox"а запихать новый TStrings...
2Омлет если человек не может сделать компонент не означает что он плохо проектирует....
-
4 группы по 20 ComboBox'ов в которых 200-400 строк (причем, одних и тех же) - это, скорее всего, и есть ошибка проектирования бизнес-процесса и/или пользовательского интерфейса. Для какой цели такая жуткая форма?
-
выигрыш не только в памяти!!! выигрышь в производительности...
Кто бы мог подумать...... Еще и в производительности выигрышь
Tstrings часто будут менятся представьте сколько нужно проделать чтоб во все 80 ComboBox"а запихать новый TStrings...
Зашибись. А если он будет один, то его рендерить во всех 80 комбиках конечно же не надо.
-
сколько нужно проделать чтоб во все 80 ComboBox"а запихать новый TStrings...
Ну и скока? Померяй. Не на восьмидесяти, а на сотне комбобоксов. И не с 400 строками, а с шестьюстами.
скока миллисекунд получится?
-
Не получится выигрыша ни в скорости, ни в памяти. Посмотри исходник TComboBox. Его TStrings ничего не хранит, а для записи/чтения строк просто шлёт сообщения подлежащему виндовому контролу. Так что как ни крути, а если ты используешь стандартный виндовый комбобокс, то у тебя всё равно рано или поздно всплывёт переписывание строк в контрол вызовами SendMessage.
-
Аминь...
-
вобщем ни чего по вопросу так и не услышал кроме DimaBr за что ему спасибо... услышал только блестящие знания мего проектировщиков и оптимизаторов...ожидал на самом деле большего...
-
> так и не услышал
услышал, но не понял... Суть: интерфейс - в печку...
-
Если всё делать руками, то: 1)создать свой компонент, отнаследованый не от ComboBox, а от CustomEdit. 2)добавить к нему кнопку 3)по нажатию на кнопку показывать ListBox с Style=lbVirtual 4)в этом ListBox`е сделать свою отрисовку в OnDrawItem 5)еще добавить обработку потери фокуса, нажатий на Enter, Esc, Up/Down, Скролл мышки и т п. Что-то подобное делает TLookupComboBox. Там наследник от TEdit, по кнопке показывается DBGrid. Можно попытаться переделать. Также Edit с кнопкой был в библиотеке Rx. Может там и есть то, что Вам нужно.
-
icWasya спасибо.... 2Dennis I. Komarov мозг твой туда надо...
-
> [14] KIR@PRO (14.09.11 09:56)
Ты слушай, что тебе намного более грамотные люди говорят, а не сябя любимого с единственно верным взглядом на бытие.
-
> Ты слушай,
Зачем ? Пусть парится дальше, у него слушалка еще не отросла, а после этого должна еще понималка отрасти.
-
P.S. Ему прямая дорога в DBLookup, либо использовать
cbx.Items.Assign(lst1); cbx.Items.Assign(lst2);
и до .. дальше
-
Inovet о чем ты говоришь... 1)перечитай первй пост а потом сообщения этих "грамотных" людей. 2) Слушаю ВСЕХ, прислушиваюсь только к тем кто пишет ПО СУЩЕСТВУ 3) Я НЕ ПРОСИЛ оценивать интерфейс разрабатываемого приложения И ни один из читающих эту ветку людей кроме меня этот интерфейс вообще не видели и представить его не смогут (нет смысла показывать), дак о какой ошибке проэктирования интерфейса может идти речь?
Надеюсь обхяснил доходчиво... Всем спасибо до новых встреч...
-
Inovet © и как ты вообще определил что все писавшие, или хотя бы один из них, намного более грамотные??? это ты так ненавящиво решил меня принизить? или наоборот чтоб они себя гуру почувствовали?
-
> нет смысла показывать вот... вот она основная ошибка, не желание/"не видение" смысла показывать, что/делаешь но желание получить совет... сродни лечению по фотографии, ремонту по телефону...
по вопросу, посмотри на DB контролы... они могут работать с одними и теми же данными. и комбо бокс тим есть. но от TStrings-листов придется уйти к датасетам... хотя, всяко проще чем бесконечно изобретать один и тот же велосипед.
-
> [19] KIR@PRO (14.09.11 12:50) > Inovet © и как ты вообще определил что все писавшие, или > хотя бы один из них, намного более грамотные???
Тебе ответили по делу, ты не услышал и продолжаешь упираться на своём ещё и с агрессией и обидами теперь.
-
Inovet по делу ответили только sniknik, Jeer, icWasya, DimaBrостальные ОФФТОП. упираться на своём ещё и с агрессией и обидами теперь. не привык обижаться... я лишь попросил разъяснить твои же слова, не более... Медвежонок Пятачок - 3 сообщения, ни одно из который к вопросу не относитсяОмлет - 2 сообщения, все про проектированиеDiamondShark - 1 сообщение, ответ на его сообщение: procedure TCustomCombo.SetItems(const Value: TStrings);
begin
if Assigned(FItems) then
FItems.Assign(Value)
else
FItems := Value;
end; если код ни о чем не говорит загляни в Tstrings.Assign
procedure TStrings.Assign(Source: TPersistent);
...
AddStrings(TStrings(Source));
...
end;
Dennis I. Komarov - 1 сообщение, создающее впечатление будто название темы " ЧТО СДЕЛАТЬ С ИНТЕРФЕЙСОМ??? ПОМОГИТЕ" 2 Inovet ты все еще уверен что я " ..не услышал и продолжаю упираться на своём.."
-
> KIR@PRO (14.09.11 13:51) [22]
Однажды, один из наших программистов реализовал заполнение зачетной ведомости учебной группы в вузе - такая здоровенная таблица где в строках студенты, в столбцах предметы, а на пересечении - оценки. В первоначальном варианте там тоже было в каждой ячейке по выпадающему списку. Жутко выглядело. Особенно, если учесть, что всё на html, грузилось это очень долго. Потом переделали на обычную таблицу, где при клике на ячейке динамически появляется селект (выпадающий список). В итоге - выглядит гораздо лучше и не тормозит.
Поэтому, пока нет веры в то, что ты выбрал верный путь, помогать в реализации [вероятно] абсурдной задачи не никакого желания (заметь, не только у меня). Давно бы показал, что у тебя за форма, и рассказал, что делает - не было бы всяких пустых споров.
Ты не первый, кто здесь просит решения конкретной, заведомо ненужной задачи.
-
Омлет мне начинает нравиться твоя серьезность, одно но: заведомо ненужной задачи - не факт конечно, но я начинаю представлять как можно по другому реализовать....
по проекту: у меня примерно тоже самое что ты описал ток не на html... ядро уже сделано осталась обертка... программа работает с расписанием занятий, с возможностью вывода разных связанных таблиц, пример: имеется расписание по классам которое вывешано для учащихся, и имеется расписание для руководителей, где напротив каждого руководителя в какой день какой парой какой класс, а предмет указывается как подстрока(тоесть строка с учителем делится на строчки кол-вом равным предметам которые преподает этот учитель).... Программа конечно же для составления/изменения расписания
вот и бьюсь теберь над более менее простым интерфейсом....
-
KIR@PRO (14.09.11 13:51) [22]В общем мужики (Медвежонок Пятачок,Омлет,DiamondShark, Dennis I. Komarov, Inovet) не сдали вы экзамен... KIR@PRO (13.09.11 14:47) [5]Зачем столько комбобоксов ? А почему так не сделать: var S:TStringList;
begin
S:= TStringList.Create;
S.Add('...');
....
Combobox1.Items:=s; Или я не понял что нужно?
-
stas если так делать, то Combobox будет копировать S в свой собственный, и потом при изменении S снова придется присваивать Combobox1.Items:=s; при этом Combobox'ов много... на время этих операций интерфейс пользователя будет заморожен, можно конечно использовать потоки но это не выход, т.к. придется своими средствами запрещать пользователю изменять что то пока всем Combobox'ам не присвоятся новые значения. как уже писал DiamondSharkCombobox использует SendMessage для заполнения отображаемого списка, но значения он берет из своего TStrings, было бы намного проще если б Combobox хранил не TStrings а PStrings (^TStrings), т.е. указатель на список, и в SendMessage отправлял значения из стороннего TStrings как писал sniknik это похоже на DBComboBox но вместо DataSheet использовать указатель на TStrings... Разбираться в структуре компонента TComboBox займет не мало времени, по этому я и задал здесь вопрос в надежде найти людей для которых изменить компонент не составит особого труда, и они смогут мне помоч если не готовым компонентом, то хотябы в каких функциях/процедурах надо изменять...
-
> Программа конечно же для составления/изменения расписания >
Достаточно иметь один комбобокс и показывать его только когда нужно в требуемом месте.
-
> KIR@PRO (14.09.11 14:37) [24]
О чем я и говорил.. Нужна всего 1 таблица для отображения. При клике или наведении на ячейку создается комбобокс, после выбора или потери фокуса уничтожается. И не надо 80 комбобоксов.
В качестве компонента таблицы советую, например, Virtual Treeview (soft-gems.net)
-
я уже думал над таким вариантом, это довольно разумно при использовании допустим с StringGrid, но я категорически не хочу его использовать... в плане оформления...
-
|