2010-01-06 33 views
16

Mọi người đều có thể hiểu ý tôi, nhưng để làm rõ sự kiểm soát sẽ cần phải:Google thích chỉnh sửa/kết hợp điều khiển cho Delphi?

  • Kích hoạt sự kiện khi người dùng chỉnh sửa văn bản. Sự kiện sẽ cung cấp một SuggestionList: TStrings mà bạn có thể điền vào các trận đấu/đề xuất.
  • nếu danh sách Đề xuất không trống thì thả xuống sẽ xuất hiện.
  • Không giống như kết hợp, điều khiển không được cố gắng tự động chọn/tự động hoàn thành hoặc ảnh hưởng đến chỉnh sửa.

Vì vậy, có điều khiển chỉnh sửa/kết hợp Delphi hoạt động như thế không?

Trả lời

23

Sử dụng autocompletion feature được tích hợp cho tất cả các điều khiển chỉnh sửa của Windows.

Trước tiên, hãy điền vào đối tượng TStrings của bạn theo bất kỳ cách nào bạn muốn. Sau đó, sử dụng GetOleStrings để tạo ra một TStringsAdapter để quấn nó. (Bộ điều hợp không yêu cầu quyền sở hữu đối tượng TStrings, vì vậy bạn phải đảm bảo rằng bạn không phá hủy nó trong khi bộ điều hợp vẫn còn hoạt động.) Bộ điều hợp cung cấp cho bạn giao diện IStrings, mà bạn cần vì tính năng tự động hoàn thành yêu cầu Giao diện IEnumString để cung cấp các kết quả khớp hoàn thành. Hãy gọi _NewEnum cho điều đó.

Tiếp theo, gọi CoCreateInstance để tạo đối tượng IAutoComplete. Gọi phương thức Init của nó để liên kết nó với tay cầm cửa sổ của điều khiển chỉnh sửa của bạn. Nếu bạn đang sử dụng hộp tổ hợp, hãy gửi thông báo cbem_GetEditControl để tìm cửa sổ chỉnh sửa cơ bản.

Bạn có thể dừng tại thời điểm đó và tính năng tự động hoàn thành sẽ hoạt động tự động. Bạn có thể tắt tự động hoàn thành nếu bạn muốn hoặc bạn có thể đặt bất kỳ số nào của autocompletion options.

Bạn nói bạn không muốn tự động hoàn thành, nhưng trong thuật ngữ hệ điều hành, tôi nghĩ những gì bạn thực sự không muốn được gọi là tự động thêm, trong đó phần còn lại của chuỗi được nhập vào hộp chỉnh sửa tự động loại người dùng, nhưng được chọn để gõ thêm sẽ ghi đè lên nó và người dùng cần xóa văn bản thừa nếu giá trị mong muốn ngắn hơn một trong các kết quả phù hợp.

Ngoài ra còn có tự động đề xuất, hiển thị danh sách các đề xuất thả xuống.

Bạn có thể bật một hoặc cả hai tùy chọn. Bạn không cần tự lọc danh sách các đề xuất; đối tượng tự động hoàn thành tự lọc danh sách IEnumString.

+0

Đây là không có gì ngắn hoàn hảo, chính xác những gì tôi muốn, tôi đã không nhận thức được các tùy chọn tự động hoàn thành, cảm ơn. –

+0

IAutoComplete dường như không hỗ trợ khớp với bất kỳ chuỗi phần nào, nhưng chỉ hỗ trợ khớp từ đầu. Tôi có nghĩa là, cho hai dây, 'bcd' và 'abcd', nếu tôi gõ 'bc', chỉ 'bcd' sẽ được xuất hiện, nhưng tôi cũng muốn 'abcd' được so khớp. –

+0

Sau đó, "tự động điền" không phải là tính năng bạn muốn ở vị trí đầu tiên, @Edwin. Nó * hoàn thành * những gì bạn đã gõ. –

4

Bạn có thể sử dụng tiêu chuẩn TComboBox và thư viện faststrings (cho chức năng stringMatches()).

procedure TForm1.cbChange(Sender: TObject); 
var 
    s:Integer; 
    tmpstr:string; 
begin 
    //suggestions: tstringlist 
    cb.AutoComplete:=false; 
    tmpstr:=cb.Text; 
    cb.Items.Clear; 
    for s:=0 to suggestions.Count - 1 do 
    if StringMatches(suggestions[s],cb.Text+'*') then 
     cb.Items.Add(suggestions[s]); 
    cb.DroppedDown:=(cb.Items.Count<>0) and (Length(cb.Text)<>0); 
    cb.Text:=tmpstr; 
    cb.SelStart:=Length(cb.Text) 
end; 
+0

Có, điều này rất gần nhưng có một vài vấn đề. Khi bạn nhập ký tự đầu tiên vào một combo trống, trong một giây, nó sẽ tự động hoàn thành nó trước khi bạn đặt cb.text trở lại thành nó. Ngoài ra, nếu bạn di chuyển tiêu điểm đến một số điều khiển khác trong khi trình đơn thả xuống hiển thị, nó sẽ tự động hoàn thành lại. Và nếu bạn sử dụng các phím lên/xuống để điều hướng các mục thả xuống, văn bản sẽ lại được tự động hoàn thành. Và cuối cùng, bạn đặt SelStart thành ký tự cuối cùng, nhưng nó nên được đặt ở vị trí của nó, vì vậy SelStart cần phải được lưu trữ ở chế độ ăn xin của phương thức và được khôi phục ở cuối. –

3

Nếu bạn chỉ muốn hiển thị một tập tin hoặc url danh sách:

SHAutoComplete(GetWindow(eb_MyComboBox->Handle, GW_CHILD), SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYS_DIRS); 
2

đầu tiên tôi thực hiện tính năng này như Rob mô tả nó trong câu trả lời của mình. Sau đó tôi thấy rằng TComboBoxEx có thuộc tính AutoCompleteOptions nơi tôi đặt acoAutoSuggest thành TrueacoAutoAppend đến False. ComboBox hiện lọc danh sách mục của nó khi thực hiện một số mục nhập và hiển thị các mục phù hợp.

Tôi đang sử dụng RAD Studio 10 Seattle và XE2 nhưng không biết liệu tính năng này có khả dụng ở các phiên bản cũ hay không.

Các vấn đề liên quan