首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++Builder 實現 ComboBox 文字輸入自動完成功能

     編輯:VC 教學

需求場景

在 C++Builder (VCL) 中,標準 TComboBox 的 Style = csDropDown 允許用戶輸入文字,但預設不支援「輸入時自動匹配下拉列表項目並補全」的功能。本文提供一個輕量級實現方案。

核心思路

  1. 攔截 OnChange 事件:用戶輸入/刪除字元時觸發。
  2. 忽略刪除鍵:若最後按鍵為 Backspace 或 Delete,不自動補全,避免干擾編輯。
  3. 確保游標在末尾:僅當選取起點等於文字長度時才補全,防止中間插入字元時誤觸發。
  4. 查找匹配項:使用 CB_FINDSTRING 訊息在列表中尋找以目前文字開頭的項目。
  5. 設定選中並高亮剩餘部分:找到後設定 ItemIndex,並用 CB_SETEDITSEL 選中新增的尾部文字,方便用戶繼續輸入或接受。

完整實作代碼

// 表單單元宣告
private:
    WORD LastKey;  // 記錄最後按下的鍵

//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    AnsiString Value = ComboBox1->Text;

    // 忽略刪除操作
    if (LastKey == VK_BACK || LastKey == VK_DELETE) {
        LastKey = 0;
        return;
    }
    LastKey = 0;

    // 僅在游標位於文字末尾時處理
    if (ComboBox1->SelStart != Value.Length())
        return;

    // 尋找以 Value 開頭的列表項(不區分大小寫)
    int Index = SendMessage(ComboBox1->Handle, CB_FINDSTRING, -1,
                            (LPARAM)Value.c_str());

    if (Index >= 0) {
        ComboBox1->ItemIndex = Index;  // 設定選中項
        AnsiString NewText = ComboBox1->Text;
        // 高亮補全的部分(從原長度到新長度)
        SendMessage(ComboBox1->Handle, CB_SETEDITSEL, 0,
                    MAKELPARAM(Value.Length(), -1));
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key,
                                         TShiftState Shift)
{
    LastKey = Key;  // 記錄按鍵供 Change 事件判斷
}
//---------------------------------------------------------------------------

關鍵點說明

  • CB_FINDSTRING:從指定索引(-1 表從頭)搜尋以給定字串開頭的項目,返回索引或 -1。
  • CB_SETEDITSEL:設定編輯區選取範圍,LOWORD 為起始位置,HIWORD 為結束位置(-1 表至末尾)。
  • 變數 LastKey 需在表單建構子中初始化為 0。

擴展建議

  • 支援大小寫敏感/不敏感切換。
  • 結合 OnKeyPress 過濾非法字元。
  • 若列表極大,可改用虛擬列表或獨立搜尋線程避免 UI 卡頓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved