Доброго времени суток.
В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?
Заранее благодарен даже за отрицательные ответы.
Смысл жизни в том что его можно выбрать по своему вкусу, в любой момент...
Здравствуйте, baaz, Вы писали:
B>Доброго времени суток. B>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому? B>Заранее благодарен даже за отрицательные ответы.
А зачем такие сложности? Просто удалить его, а потом добавить нельзя?
Жизнь — это сражение, которое ты всегда проигрываешь.
Re: Скрыть элемент в TComboBox
От:
Аноним
Дата:
06.12.04 06:57
Оценка:
Здравствуйте, baaz, Вы писали:
B>Доброго времени суток. B>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому? B>Заранее благодарен даже за отрицательные ответы.
Скрыть:
void __fastcall HideString(TComboBox *CBox, int Index)
{
CBox->Items->Delete(Index);
}
Здравствуйте, baaz, Вы писали:
B>Доброго времени суток. B>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому? B>Заранее благодарен даже за отрицательные ответы.
Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры Show(index) Hide(index).
Конечно если создавать наследника от ComboBox можно сделать гораздо лучше.
Здравствуйте, byterus, Вы писали:
B>>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?
B>Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры
Очищать и заново заполнять не требуется (OwnerDraw*), т.е., нужно только
синхронизировать количество итемов (пустых строк) с количеством помеченных
для показа строк из списка.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, byterus, Вы писали:
B>>>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?
B>>Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры
LT> Очищать и заново заполнять не требуется (OwnerDraw*), т.е., нужно только LT> синхронизировать количество итемов (пустых строк) с количеством помеченных LT> для показа строк из списка.
Может быть я вас понял неправильно, но как быть с количеством элементов? OwnerDraw позволяет только произвольно нарисовать позицию, но количество позиций есть количество элементов. Как быть с этим? Получится что при выпадания списка прокрутка и размер окна будут некорректными. Imho лучше очищать и заполнять заново, самый безглючный способ.
Здравствуйте, byterus, Вы писали:
B>>>Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры
LT>> Очищать и заново заполнять не требуется (OwnerDraw*), т.е., нужно только LT>> синхронизировать количество итемов (пустых строк) с количеством помеченных LT>> для показа строк из списка.
B>Может быть я вас понял неправильно, но как быть с количеством элементов? OwnerDraw позволяет только произвольно нарисовать позицию, но количество позиций есть количество элементов. Как быть с этим? Получится что при выпадания списка прокрутка и размер окна будут некорректными. Imho лучше очищать и заполнять заново, самый безглючный способ.
Возможно, что копирование самый безглючный.
Однако, синхронизация количества итемов — не самая сложная операция
(в List.OnChange сравниваем количество и добавляем/убираем пустые строки в бокс).
Просто, я забыл сказать, что проводилось оное на сортированном TStringList
(т.к., нужен был сортированный), а сами пометки заносились прямо в 1 символ
строк, т.е., ' ' or '*'.
Ну, а в DrawItem — TextOut(.., Copy(List[i], 2, Length()).