ComboBoxでドロップダウンリストの絞り込み

23 views
Skip to first unread message

久世雄一

unread,
Apr 29, 2023, 2:27:17 AM4/29/23
to radstu...@googlegroups.com

皆様

久世です。

ComboBoxでドロップダウンリストの絞り込みを実装しようと思ったのですが
上手くいかないため、お知恵をお貸しください。

下記のサンプルコードで、'a', '2'と入力すると、
ComboBox1への入力が、'a2'ではなく、'2a'になってしまいます。
'a'を打つと、カーソル位置が、自動で先頭に移動してしまうのが
問題だと思っています。
カーソル位置をもとに元に戻す(位置を維持する)方法はないでしょうか?

--------------------------------------------------------
下記は、文字列リスト(a, a2, b, c)の中から、コンボボックスに入力した
文字列に部分一致するものだけを、絞り込んで、ドロップダウンリストに
表示するサンプルになります。
--------------------------------------------------------

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure FormShow(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
Sl : TStringList;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ComboBox1Change(Sender: TObject);
var
I : Integer;
begin
SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 1, 0);
ComboBox1.Items.Clear;
for I := 0 to Sl.Count-1 do
begin
if StrLIComp(PChar(ComboBox1.Text), PChar(Sl[I]),
Length(ComboBox1.Text)) = 0 then
ComboBox1.Items.Add(Sl[I]);
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Sl := TStringList.Create;
Sl.Add('a');
Sl.Add('a2');
Sl.Add('b');
Sl.Add('c');
end;

end.

"寄木 康彦(Yasuhiko Yoriki)"

unread,
Apr 29, 2023, 4:29:25 AM4/29/23
to radstu...@googlegroups.com
寄木です。

> 'a'を打つと、カーソル位置が、自動で先頭に移動してしまうのが
> 問題だと思っています。
> カーソル位置をもとに元に戻す(位置を維持する)方法はないでしょうか?
すみません。時間がなく、コードを書いて確認する時間がないので、

https://docwiki.embarcadero.com/Libraries/Sydney/ja/Vcl.StdCtrls.TCustomCombo.SelStart

この、SelStart  って、使えませんか?

とりあえず、ぱっと思っただけなので、的外れでしたら、申し訳ないです。

-----------------------------------------------------------
Yasuhiko Yoriki 寄木康彦
mailto:yor...@yoriki.jp
http://www.yoriki.jp/

久世雄一

unread,
Apr 29, 2023, 4:41:16 AM4/29/23
to radstu...@googlegroups.com
寄木さん

久世です。

SelStartで解決しました。
ありがとうございました。
修正後のコードを記載します。

procedure TForm1.ComboBox1Change(Sender: TObject);
var
I : Integer;
Pos: Integer;
begin
SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 1, 0);
Pos := ComboBox1.SelStart;
ComboBox1.Items.Clear;
for I := 0 to Sl.Count-1 do
begin
if StrLIComp(PChar(ComboBox1.Text), PChar(Sl[I]),
Length(ComboBox1.Text)) = 0 then
ComboBox1.Items.Add(Sl[I]);
end;
ComboBox1.SelStart := Pos;
end;

"寄木 康彦(Yasuhiko Yoriki)"

unread,
Apr 29, 2023, 7:56:12 AM4/29/23
to radstu...@googlegroups.com
寄木です。

無事に解決できて良かったです。
コードもありがとうございます。
Reply all
Reply to author
Forward
0 new messages