2017-06-14 47 views
0

當強制用戶從下拉列表中選擇 時,我將組合框樣式設置爲csDropDownlist。 enter image description here鍵入ahead TComboBox csDropDownList; Delphi 10

但是,以後所有的輸入只是一個字符。 這意味着,用戶不能通過鍵入多個字符來縮小組合中的搜索範圍。那麼不是有用的。

當設置風格csDropDown,您可以鍵入多個字符來縮小搜索範圍, enter image description here

但你不會被強迫從列表中任意選擇不再

enter image description here

有一種結合這些行爲的方式?

+1

剛剛在Delphi 2007中測試過(現在手邊沒有更新的版本) - 在csDropDownList Combobox中,我可以輸入'Item 4',它會正確選擇那個元素。這是不是所需的行爲?我錯過了什麼嗎? –

+0

_「有沒有辦法將這些行爲結合起來?」_是的。停止輸入:)或者確保用戶在沒有要匹配的項目時不能輸入。您根本無法選擇不存在的項目。 – Victoria

+1

行爲是你想要的,但有警告。如果你多次按下I鍵,它會一個接一個地下到列表中。如果您足夠快地鍵入文本*,它將按照您的想法行事。如果你輸入太慢,它會按照你描述的方式進行。我認爲這是Windows的行爲,所以不應該是Delphi版本依賴。 – Dsm

回答

0

謝謝你的所有輸入。

我發現這裏一個解決辦法: How to both autocomplete and limit to list with Delphi TComboBox ,我已經修改了一下:

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); 
var 
s, t: string; 
i, l: Integer; 
const CrLf = #13#10; 
begin 
// Skip functional keys 
if Key < ' ' then 
    Exit; 

    key := upcase(key); 

    // Get text which can be in the combo after key pressed 
    i := ComboBox1.SelStart; 
    l := ComboBox1.SelLength; 
    t := ComboBox1.Text; 
    s := Copy(t, 1, i) + Key; 

    // Check is this text corresponds to the values list 

    if pos(CrLf+s, CrLf+combobox1.Items.Text) > 0 then 
    exit; 


    Key := #0; 
end; 

現在,它的工作原理完全如願,但我還沒有長的項目列表中進行過測試。

但是,謝謝大家。

+0

想想剪貼板粘貼以及。 – Victoria