Главная страница
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.47 MB
Время: 0.021 c
1-43482
Ivolg
2004-02-29 15:18
2004.03.14
Текст


14-43767
wara
2004-02-04 12:00
2004.03.14
Загниваение Delphi?


1-43553
Image
2004-02-27 19:09
2004.03.14
Hello all !!! Как извлечь JPEG картинку из TStream и


14-43762
Думкин
2004-02-23 05:44
2004.03.14
С днем рождения! 23 февраля.


1-43633
Ivolg
2004-03-02 12:29
2004.03.14
Стрелки