Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выставить текущим нужное значение комбобокса, зная что у него в TObject(число)  (Прочитано 4728 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 04-11-2011 18:52 » 

У меня есть тексты ответов и соответствующие им ID из БД.

В расположенный на форме комбобокс это было все в цикле помещено:
combobox.AddItem(TextAnswer, TObject(idAnswer));

А затем. на OnShow формы я хочу чтоб в комбобоксе был выбран вариант соответствующий определенному ID. Как это элегантно сделать?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-11-2011 19:15 » 

Ассоциированный с элементом указатель на TObject не управляется VCL и можно делать с ним что угодно, в том числе хранить в нем целое. Хотя это и не кошерно, но много проще, чем делать ненужные клоны TObject и следить за их своевременным удалением. Альтернативой было бы сделать класс, наследованный от TComboCustom и хранить там все, что захочется.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #2 : 04-11-2011 19:44 » 

Если число элементов комбобокса небольшое (до 100) то проще простым перебором, типа:
Код:
for i := 0 to ComboBox1.Items.Count - 1 do
if Integer(ComboBox1.Items.Objects[i]) = id then
begin
   ComboBox1.ItemIndex := i;
   break;
end;
Иначе, лучше воспользоваться ассоциативным массивом типа сишного мапа, где увязать ид (в качестве ключа) с индексом комбобокса.
К примеру, можно воспользоваться готовым решением: __http://antidot-library-2009.en.softonic.com/
Записан
malor
Опытный

ru
Offline Offline

« Ответ #3 : 04-11-2011 19:48 » 

Перебором реализовал, т.к. число элементов невелико.
Спасибо RXL и zubr за оперативные ответы!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-11-2011 19:54 » new

Извиняюсь, пример для BCB, но не трудно оттранслировать его в Delphi.

Код: (C++)
class TGUIService
{
    public:
        typedef enum
        {
            none = 0,
            change,
            click
        } TCBAction;

        static int __fastcall setComboByShadow(TComboBox *cb, int shadow, bool reset = false, TCBAction activate = TGUIService::none);
};

int __fastcall TGUIService::setComboByShadow(TComboBox *cb, int shadow, bool reset, TCBAction activate)
{
    int i;

    for (i = 0; i < cb->Items->Count; i++)
        if (((int)(void*)cb->Items->Objects[i]) == shadow)
        {
            cb->ItemIndex = i;
            break;
        }

    if (i == cb->Items->Count && reset)
    {
        if (cb->Style == csDropDown)
            cb->Text = "";

        cb->ItemIndex = -1;
    }

    switch (activate)
    {
        case TGUIService::change:
            cb->OnChange(cb);
            break;
        case TGUIService::click:
            cb->OnClick(cb);
            break;
    }

    return cb->ItemIndex;
}

Код рабочий. Конечно, это фрагмент - у меня целая куча такого "сервиса" накопилась.

Кстати, быстро работает на списках в несколько тысяч элементов. Аналогичная задача на VB требует ресурсов на несколько порядков больше.
« Последнее редактирование: 04-11-2011 20:01 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines