Извиняюсь, пример для BCB, но не трудно оттранслировать его в Delphi.
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 требует ресурсов на несколько порядков больше.