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