Главная страница
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.48 MB
Время: 0.018 c
6-43726
smu
2004-01-06 09:25
2004.03.14
Где взять RAS сервер ?


1-43470
TAV
2004-02-29 18:43
2004.03.14
Как прочитать из конца файла указанное количество строк?


3-43310
Night Cold
2004-02-11 17:51
2004.03.14
Перемещение данных


1-43680
Serginio666
2004-03-01 14:27
2004.03.14
Delphi 8 и позднее связывание


7-43912
Retro
2003-12-23 22:16
2004.03.14
Присоедениния exe к фаилу *.doc или excel