Скрыть элемент в TComboBox
От: baaz Россия  
Дата: 06.12.04 06:37
Оценка:
Доброго времени суток.
В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?
Заранее благодарен даже за отрицательные ответы.
Смысл жизни в том что его можно выбрать по своему вкусу, в любой момент...
Re: Скрыть элемент в TComboBox
От: Dyusha  
Дата: 06.12.04 06:53
Оценка:
Здравствуйте, 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);
}


Показать:

void __fastcall ShowString(TComboBox *CBox, AnsiString Str, int Index)
{
    CBox->Items->Insert(Index, Str);
}
Re: Скрыть элемент в TComboBox
От: byterus Россия  
Дата: 06.12.04 07:28
Оценка: +1
Здравствуйте, baaz, Вы писали:

B>Доброго времени суток.

B>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?
B>Заранее благодарен даже за отрицательные ответы.

Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры Show(index) Hide(index).

Конечно если создавать наследника от ComboBox можно сделать гораздо лучше.
MySQL stored procedure debugging
Re[2]: Скрыть элемент в TComboBox
От: Leonid Troyanovsky  
Дата: 06.12.04 08:36
Оценка:
Здравствуйте, byterus, Вы писали:

B>>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?


B>Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры


Очищать и заново заполнять не требуется (OwnerDraw*), т.е., нужно только
синхронизировать количество итемов (пустых строк) с количеством помеченных
для показа строк из списка.

--
С уважением, LVT.
--
С уважением, LVT
Re[3]: Скрыть элемент в TComboBox
От: byterus Россия  
Дата: 06.12.04 08:48
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, byterus, Вы писали:


B>>>В обьекте ComboBox надо срыть строчку, собираюсь скрывать в процедуре DrawItem, впрочем это не важно. Просто надо скрыть элемент, так чтобы потом его можно было показать снова. Интересует можно ли сделать это просто — процедурами ComboBox, или придется писать приблуду самому?


B>>Я бы сделал отдельный TstringList со всеми строками, в поле TstringList.Objects хранил бы признак видимости, на OnChange этого списка поставил процедуру очищающую и заново заполняющую ComboBox "видимыми" элементами. Для удобства сделал бы две процедуры


LT> Очищать и заново заполнять не требуется (OwnerDraw*), т.е., нужно только

LT> синхронизировать количество итемов (пустых строк) с количеством помеченных
LT> для показа строк из списка.

Может быть я вас понял неправильно, но как быть с количеством элементов? OwnerDraw позволяет только произвольно нарисовать позицию, но количество позиций есть количество элементов. Как быть с этим? Получится что при выпадания списка прокрутка и размер окна будут некорректными. Imho лучше очищать и заполнять заново, самый безглючный способ.
MySQL stored procedure debugging
Re[4]: Скрыть элемент в TComboBox
От: Leonid Troyanovsky  
Дата: 06.12.04 12:21
Оценка:
Здравствуйте, 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()).
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.