Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.14;
Скачать: CL | DM;

Вниз

Проблема с ComboBox.ItemIndex   Найти похожие ветки 

 
Plt   (2004-03-02 11:59) [0]

Написал свой компонент, наследник от TComboBox. Нужен для поиска итемса по введенным буквам. Процедура поиска в событии OnChange. Если поиск прошел успешно ItemIndex-у присваиваю значение, но после выхода из этой процедуры ItemIndex = -1. Почему? Как победить?

procedure TdComboBox.Change;
var
ItemPos : integer;
TypeLen : integer;
begin
inherited Change;
if (FComplete = true) and (FPressCommandKey = false) and
((Style = csDropDown) or (Style = csSimple)) then
begin
if (Length(Text) > 0) and (Items.Count > 0) then
begin
ItemPos := Perform(CB_FINDSTRING,-1,Integer(PChar(Text)));
if ItemPos <> CB_ERR then
begin
TypeLen := Length(Text);
ItemIndex := ItemPos;
SelStart := TypeLen;
SelLength := Length(Text) - TypeLen;
DoOnSearch;
end;
end;
end;
end;


 
Goida   (2004-03-02 13:50) [1]

Думая, потому что элемент не выбирается всё-таки. Но, кажется, в исходном комбобоксе позиционирование происходит автоматически, если слова отсортированы...


 
Plt   (2004-03-02 14:02) [2]

Тогда каким образом железно выбрать элемент из списка?


 
Семен Сорокин   (2004-03-02 14:07) [3]

2Plt
имхо, когда выставляешь ItemIndex := ItemPos; у тебя вызывается снова Change, т.е. как бы неявная рекурсия, надо как-то блокировать этот вызов, может быть флаг какой-то выставлять.


 
Plt   (2004-03-02 14:45) [4]

Если не трудно может примерчик напишите. А то у меня не выходит каменный цветок.


 
Семен Сорокин   (2004-03-02 15:41) [5]

private
FChanged: boolean; // флаг в наследнике

constructor
...
begin
...
FChanged := false;
end;

procedure TdComboBox.Change;
var
ItemPos : integer;
TypeLen : integer;
begin
inherited Change;
if (FComplete = true) and (FPressCommandKey = false) and
not FChanged and ((Style = csDropDown) or (Style = csSimple)) then
begin
if (Length(Text) > 0) and (Items.Count > 0) then
begin
FChanged := true;
ItemPos := Perform(CB_FINDSTRING,-1,Integer(PChar(Text)));
if ItemPos <> CB_ERR then
begin
TypeLen := Length(Text);
ItemIndex := ItemPos;
SelStart := TypeLen;
SelLength := Length(Text) - TypeLen;
DoOnSearch;
end;
FChanged := false;
end;
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.03.14;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.012 c
14-43856
reticon
2004-02-20 17:33
2004.03.14
Смена провайдера или непонимание глубины всех наших глубин


3-43364
Денисыч
2004-02-15 01:18
2004.03.14
Как включить BDE в инсталлятор


3-43255
31512
2004-02-11 14:40
2004.03.14
Lookup или не lookup - вот в чём вопрос (программирующий Гамлет)


4-43936
Saimon
2004-01-07 02:47
2004.03.14
Помоготе по SysTray ю...


1-43425
S@shka
2004-03-01 15:14
2004.03.14
Работа с переменной типа PChar.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский