![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скрыть определённые строки в 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]Нет такого способа.
А собссно зачем это может понадобиться ?