Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.013 c
4-43957
rimd
2004-01-05 14:37
2004.03.14
CreateThread


8-43704
Lizard
2003-11-14 01:43
2004.03.14
Помогите зеленому.


14-43856
reticon
2004-02-20 17:33
2004.03.14
Смена провайдера или непонимание глубины всех наших глубин


14-43831
SPeller
2004-02-13 13:54
2004.03.14
Кто юзает Total Commander


3-43403
ivb2001
2004-02-11 15:15
2004.03.14
Locate в InterBase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский