Главная страница
    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
14-43811
Knight
2004-02-21 23:48
2004.03.14
Матрица по телевизору...


1-43608
Kyrt
2004-03-03 02:29
2004.03.14
TreeView


14-43809
Malkolinge
2004-02-23 12:24
2004.03.14
Profiler для Делфи


11-43408
Vox
2003-06-26 01:17
2004.03.14
KOLMD5


14-43849
RealRascal
2004-02-20 16:31
2004.03.14
Хачу! Выдрать midi из игры DX-BALL. Просмотрел ресурсы ееные,





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