Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скрыть определённые строки в ComboBox [D7, WinXP]


Jungle ©   (2008-10-03 08:15:00) 

Есть ли способ (помимо разработки собственного контрола) скрыть определённые строки в выпадающем списке ComboBox'а?
Это нужно для того, чтобы сохранились индексы элементов.

Т.е. если у меня есть список
111 // индекс 0
222 // индекс 1
333 // индекс 2

и я скрою 2-ю строку, то в выпадающем списке отобразится
111 // индекс 0
333 // индекс 2

При этом у элемента 333 индекс будет 2, а не 1


Сергей М.   (2008-10-03 12:41:00) [1]


> Есть анальный способ


Не такой уж он и анальный)
Если решать задачу с нуля, то такая организация вроде бы даже очевиднее и прямее/изящнее/удобнее


KSergey   (2008-10-03 12:38:00) [2]

В общем счастья нет.
Только если не связывать буквально TStrings где хранится и TBomboBox.
Есть анальный способ хранить данные в каком-нибудь Memory DataSet, использовать какой-нибудь TDBComboBox и фильтровать по необходимости записи для выбора.


Сергей М.   (2008-10-03 12:38:00) [3]


> {RASkov} ©   (03.10.08 12:01) [7]


Ну тады остается только [3] и/или [4]


{RASkov}   (2008-10-03 12:01:00) [4]

> Тогда может быть стоит присмотреться к CB_SETITEMHEIGHT ?

Некрасиво получается... :) Только что попробывал ComboBox1MeasureItem....
Например с клавиатуры можно выбрать итем, у которого высота=0...


Сергей М.   (2008-10-03 11:11:00) [5]


> что-нибудь вроде CB_SETITEMVISIBLE


Тогда может быть стоит присмотреться к CB_SETITEMHEIGHT ?


Jungle   (2008-10-03 10:57:00) [6]

В 1-м варианте придётся держать (или динамически изменять) список объектов для индексов, во 2-м нужно формировать список исключаемых элементов.

2-й способ похуже, т.к. будут выполняться по 2 действия при каждом выборе, а в 1-м способе - единожды при формировании списка элементов.

Но меня интересовала возможность именно скрыть элементы. Как в меню. Например, послав некое сообщение контролу (что-нибудь вроде CB_SETITEMVISIBLE). Раскопки мсдн'а ничего не дали. Ну что ж - нельзя так нельзя.

В любом случае благодарю за конструктивные ответы :)


Сергей М.   (2008-10-03 10:05:00) [7]

В конце-концов можно при событии OnDropDown удалять из списка ComboBox.Items те элементы, которые не должны фигурировать в выпадающем списке, а при событии OnCloseUp вставлять их на место. Св-во ComboBox.ItemIndex, если оно не равно -1 при вставках будет автоматически корректироваться самим компонентом.

ПРимер:

procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
 ComboBox1.Items.Delete(1);
end;

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
 ComboBox1.Items.Insert(1, '222');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 showmessage(inttostr(ComboBox1.ItemIndex));
end;


Сергей М.   (2008-10-03 09:50:00) [8]


> Индексы элементов в комбо-боксе должны соответствовать индексам
> в этих TStrings'ах


А разве что-то мешает хранить индексы элементов стринглистов в списке ComboBox.Items.Objects[] ?


Jungle   (2008-10-03 09:41:00) [9]


> А собссно зачем это может понадобиться ?

Допустим, есть несколько переменных типа TStrings с привязанными объектами, которые не изменяется в ходе работы. Индексы элементов в комбо-боксе должны соответствовать индексам в этих TStrings'ах, но при этом часть из элементов в комбо-боксе должна быть скрыта.
Соответственно, самым простым решением было бы просто сделать эти "ненужные" элементы скрытыми.


Сергей М.   (2008-10-03 08:39:00) [10]

Нет такого способа.
А собссно зачем это может понадобиться ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо