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

Вниз

TComboBox vs PStrings   Найти похожие ветки 

 
KIR@PRO   (2011-09-13 10:28) [0]

Приветствую всех. Подскажите пожалуйста как переделать  TComboBox чтоб компонент работал не со своим списком TStrings
а с созданным отдельно TStrings и присоединенным к нему и другим таким же TComboBox через свойство...

На подобие этого:
s1:Tstrings;
...
ComboBox1.PComboStringList:=@s1;
ComboBox2.PComboStringList:=@s1;

необходимо это для экономии памяти т.к. необходимо чтоб много ComboBox"ов отображало один и тот же список но выбирать могли разные пункты....

Зарание благодарю за любую конструктивную помощь...


 
DimaBr ©   (2011-09-13 11:35) [1]

Это попахивает Lookup-ом


 
KIR@PRO   (2011-09-13 12:10) [2]

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


 
Медвежонок Пятачок ©   (2011-09-13 13:10) [3]

Это сколько же надо иметь комбобоксов на форме, чтобы получить заметный выигрыш по памяти с общим TStrings?


 
Омлет ©   (2011-09-13 14:36) [4]

Задача бредовая. Скорее всего - ошибка проектирования.


 
KIR@PRO   (2011-09-13 14:47) [5]

ну примерно 4 группы по 20 ComboBox"ов у каждой группы своий Tstrings
примерно по 200-400 строк каждый.... выигрыш не только в памяти!!! выигрышь в производительности... Tstrings часто будут менятся представьте сколько нужно проделать чтоб во все 80 ComboBox"а запихать новый TStrings...

2Омлет если человек не может сделать компонент не означает что он плохо проектирует....


 
Омлет ©   (2011-09-13 15:03) [6]

4 группы по 20 ComboBox"ов в которых 200-400 строк (причем, одних и тех же) - это, скорее всего, и есть ошибка проектирования бизнес-процесса и/или пользовательского интерфейса.
Для какой цели такая жуткая форма?


 
Медвежонок Пятачок ©   (2011-09-13 15:19) [7]

выигрыш не только в памяти!!! выигрышь в производительности...

Кто бы мог подумать......
Еще и в производительности выигрышь

Tstrings часто будут менятся представьте сколько нужно проделать чтоб во все 80 ComboBox"а запихать новый TStrings...


Зашибись.
А если он будет один, то его рендерить во всех 80 комбиках конечно же не надо.


 
Медвежонок Пятачок ©   (2011-09-13 15:22) [8]

сколько нужно проделать чтоб во все 80 ComboBox"а запихать новый TStrings...

Ну и скока?
Померяй.
Не на восьмидесяти, а на сотне комбобоксов.
И не с 400 строками, а с шестьюстами.

скока миллисекунд получится?


 
DiamondShark ©   (2011-09-13 18:35) [9]

Не получится выигрыша ни в скорости, ни в памяти.
Посмотри исходник TComboBox. Его TStrings ничего не хранит, а для записи/чтения строк просто шлёт сообщения подлежащему виндовому контролу.
Так что как ни крути, а если ты используешь стандартный виндовый комбобокс, то у тебя всё равно рано или поздно всплывёт переписывание строк в контрол вызовами SendMessage.


 
Dennis I. Komarov ©   (2011-09-13 21:25) [10]

Аминь...


 
KIR@PRO   (2011-09-13 21:26) [11]

вобщем ни чего по вопросу так и не услышал кроме DimaBr за что ему спасибо... услышал только блестящие знания мего проектировщиков и оптимизаторов...ожидал на самом деле большего...


 
Dennis I. Komarov ©   (2011-09-13 21:41) [12]


> так и не услышал

услышал, но не понял...
Суть: интерфейс - в печку...


 
icWasya ©   (2011-09-14 09:49) [13]

Если всё делать руками, то:
1)создать свой компонент, отнаследованый не от ComboBox, а от CustomEdit.
2)добавить к нему кнопку
3)по нажатию на кнопку показывать ListBox с Style=lbVirtual
4)в этом ListBox`е сделать свою отрисовку в OnDrawItem
5)еще добавить обработку потери фокуса, нажатий на Enter, Esc, Up/Down, Скролл мышки и т п.
Что-то подобное делает TLookupComboBox. Там наследник от TEdit, по кнопке показывается DBGrid. Можно попытаться переделать.
Также Edit с кнопкой был в библиотеке Rx. Может там и есть то, что Вам нужно.


 
KIR@PRO   (2011-09-14 09:56) [14]

icWasya спасибо....
2Dennis I. Komarov мозг твой туда надо...


 
Inovet ©   (2011-09-14 10:37) [15]

> [14] KIR@PRO   (14.09.11 09:56)

Ты слушай, что тебе намного более грамотные люди говорят, а не сябя любимого с единственно верным взглядом на бытие.


 
Jeer ©   (2011-09-14 10:59) [16]


> Ты слушай,


Зачем ? Пусть парится дальше, у него слушалка еще не отросла, а после этого должна еще понималка отрасти.


 
Jeer ©   (2011-09-14 11:09) [17]

P.S.
Ему прямая дорога в DBLookup, либо использовать

cbx.Items.Assign(lst1);
cbx.Items.Assign(lst2);

и до .. дальше


 
KIR@PRO   (2011-09-14 12:46) [18]

Inovet о чем ты говоришь... 1)перечитай первй пост а потом сообщения этих "грамотных" людей.
2) Слушаю ВСЕХ, прислушиваюсь только к тем кто пишет ПО СУЩЕСТВУ
3) Я НЕ ПРОСИЛ оценивать интерфейс разрабатываемого приложения И ни один из читающих эту ветку людей кроме меня этот интерфейс вообще не видели и представить его не смогут (нет смысла показывать), дак о какой ошибке проэктирования интерфейса может идти речь?

Надеюсь обхяснил доходчиво...
Всем спасибо до новых встреч...


 
KIR@PRO   (2011-09-14 12:50) [19]

Inovet © и как ты вообще определил что все писавшие, или хотя бы один из них, намного более грамотные??? это ты так ненавящиво решил меня принизить? или наоборот чтоб они себя гуру почувствовали?


 
sniknik ©   (2011-09-14 12:55) [20]

> нет смысла показывать
вот... вот она основная ошибка, не желание/"не видение" смысла показывать, что/делаешь но желание получить совет... сродни лечению по фотографии, ремонту по телефону...

по вопросу, посмотри на DB контролы... они могут работать с одними и теми же данными. и комбо бокс тим есть.
но от TStrings-листов придется уйти к датасетам... хотя, всяко проще чем бесконечно изобретать один и тот же велосипед.


 
Inovet ©   (2011-09-14 13:01) [21]

> [19] KIR@PRO   (14.09.11 12:50)
> Inovet © и как ты вообще определил что все писавшие, или
> хотя бы один из них, намного более грамотные???

Тебе ответили по делу, ты не услышал и продолжаешь упираться на своём ещё и с агрессией и обидами теперь.


 
KIR@PRO   (2011-09-14 13:51) [22]

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 сообщение, создающее впечатление будто название темы "ЧТО СДЕЛАТЬ С ИНТЕРФЕЙСОМ??? ПОМОГИТЕ"

2Inovet ты все еще уверен что я "..не услышал и продолжаю упираться на своём.."


 
Омлет ©   (2011-09-14 14:22) [23]

> KIR@PRO   (14.09.11 13:51) [22]

Однажды, один из наших программистов реализовал заполнение зачетной ведомости учебной группы в вузе - такая здоровенная таблица где в строках студенты, в столбцах предметы, а на пересечении - оценки. В первоначальном варианте там тоже было в каждой ячейке по выпадающему списку. Жутко выглядело. Особенно, если учесть, что всё на html, грузилось это очень долго.
Потом переделали на обычную таблицу, где при клике на ячейке динамически появляется селект (выпадающий список). В итоге - выглядит гораздо лучше и не тормозит.

Поэтому, пока нет веры в то, что ты выбрал верный путь, помогать в реализации [вероятно] абсурдной задачи не никакого желания (заметь, не только у меня). Давно бы показал, что у тебя за форма, и рассказал, что делает - не было бы всяких пустых споров.

Ты не первый, кто здесь просит решения конкретной, заведомо ненужной задачи.


 
KIR@PRO   (2011-09-14 14:37) [24]

Омлет мне начинает нравиться твоя серьезность, одно но:
заведомо ненужной задачи - не факт конечно, но я начинаю представлять как можно по другому реализовать....

по проекту: у меня примерно тоже самое что ты описал ток не на html... ядро уже сделано осталась обертка... программа работает с расписанием занятий, с возможностью вывода разных связанных таблиц, пример:
имеется расписание по классам которое вывешано для учащихся, и имеется расписание для руководителей, где напротив каждого руководителя в какой день какой парой какой класс, а предмет указывается как подстрока(тоесть строка с учителем делится на строчки кол-вом равным предметам которые преподает этот учитель)....
Программа конечно же для составления/изменения расписания

вот и бьюсь теберь над более менее простым интерфейсом....


 
stas ©   (2011-09-14 14:43) [25]

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;


Или я не понял что нужно?


 
KIR@PRO   (2011-09-14 14:56) [26]

stas если так делать, то Combobox будет копировать S в свой собственный, и потом при изменении S снова придется присваивать Combobox1.Items:=s;
при этом Combobox"ов много... на время этих операций интерфейс пользователя будет заморожен, можно конечно использовать потоки но это не выход, т.к. придется своими средствами запрещать пользователю изменять что то пока всем Combobox"ам не присвоятся новые значения.

как уже писал DiamondShark
Combobox использует SendMessage для заполнения отображаемого списка, но значения он берет из своего TStrings, было бы намного проще если б Combobox хранил не TStrings а PStrings (^TStrings), т.е. указатель на список, и в SendMessage отправлял значения из стороннего TStrings

как писал sniknik это похоже на DBComboBox но вместо DataSheet использовать указатель на TStrings...

Разбираться в структуре компонента TComboBox займет не мало времени, по этому я и задал здесь вопрос в надежде найти людей для которых изменить компонент не составит особого труда, и они смогут мне помоч если не готовым компонентом, то хотябы в каких функциях/процедурах надо изменять...


 
Плохиш ©   (2011-09-14 15:00) [27]


> Программа конечно же для составления/изменения расписания
>

Достаточно иметь один комбобокс и показывать его только когда нужно в требуемом месте.


 
Омлет ©   (2011-09-14 15:01) [28]

> KIR@PRO   (14.09.11 14:37) [24]

О чем я и говорил.. Нужна всего 1 таблица для отображения. При клике или наведении на ячейку создается комбобокс, после выбора или потери фокуса уничтожается. И не надо 80 комбобоксов.

В качестве компонента таблицы советую, например, Virtual Treeview (soft-gems.net)


 
KIR@PRO   (2011-09-14 15:04) [29]

я уже думал над таким вариантом, это довольно разумно при использовании допустим с StringGrid, но я категорически не хочу его использовать... в плане оформления...


 
Омлет ©   (2011-09-14 15:08) [30]

> KIR@PRO   (14.09.11 15:04) [29]

Посмотри на это: http://www.soft-gems.net/index.php?option=com_content&task=view&id=12&Itemid=33
Очень мощная и удобная штука. Можно делать таблицы и деревья с любым оформлением. StringGrid - это убожество.



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

Форум: "Начинающим";
Текущий архив: 2011.12.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.003 c
11-1236511074
Jon
2009-03-08 14:17
2011.12.25
CreateRestrictedToken


2-1315654752
TheEd
2011-09-10 15:39
2011.12.25
Первая видимая запись в TDBStringGrid


1-1277967525
istok
2010-07-01 10:58
2011.12.25
TChart...


2-1315213540
lesstab
2011-09-05 13:05
2011.12.25
Поле не принимает значения


15-1315397201
Skype
2011-09-07 16:06
2011.12.25
MS Skype vs Google Chrome





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский