unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Edit1: TEdit; //просто для табуляции
procedure ComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function FindStr(substr:string; items1:TStrings):integer;
var
i:integer;
begin
result:=-1;
for i:=0 to items1.Count-1 do begin
if pos(AnsiUpperCase(substr),AnsiUpperCase(items1[i]))=1 then begin //слово с 1-позиции
result:=i; break;
end;
end;
end;
procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
ind,subLen:integer;
begin
if (ord(key)<$30) then exit;
ind:=FindStr(ComboBox1.Text,ComboBox1.Items);
if ind>=0 then begin
subLen:=length(ComboBox1.Text);
ComboBox1.ItemIndex:=ind;
ComboBox1.DroppedDown:=true;
//Application.ProcessMessages;
if subLen<length(ComboBox1.Text) then begin
ComboBox1.SelStart:=subLen;
ComboBox1.SelLength:=length(ComboBox1.Text)-subLen;
end;
end else ComboBox1.DroppedDown:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//для примера
ComboBox1.Items.Add('Япония');
ComboBox1.Items.Add('Австралия');
ComboBox1.Items.Add('Россия');
ComboBox1.Items.Add('Канада');
ComboBox1.Items.Add('Швеция');
ComboBox1.Items.Add('Франция');
end;
end.
это для поиска строк по Комбобоксу в 5-ке при наборе. Что-то вроде компенсации отсутствия в ней свойств, которые имеются в 7-ке: AutoComplete и AutoDropDown.
Т.е. вышеописанная проблема появляется при вводе букв - как только (при нахождении подстроки) раскрывается КомбоБокс.