2008-10-01 23 views
7

Cách chính xác để triển khai hành vi "tìm khi bạn nhập" trên thành phần hậu duệ TComboBox có kiểu là csOwnerDrawFixed là gì?Cách triển khai tìm khi bạn nhập vào hậu duệ TComboBox

+0

Tùy thuộc, bạn chỉ muốn thực hiện phần "tìm kiếm khi bạn nhập" mà không hiển thị bất kỳ phản hồi nào đối với người dùng (cách Firefox thực hiện trên danh sách dài), hoặc bạn có muốn hiển thị một điều khiển phụ nhỏ hiển thị chuỗi tìm kiếm hiện tại không? – dguaraglia

Trả lời

1
  1. Sử dụng TTimer (hãy gọi nó là timIncSearch). Đặt (tại thời điểm thiết kế) các thuộc tính sau: Đã bật: = False;
    Khoảng thời gian: = 400; // tìm thấy theo kinh nghiệm - đó là độ trễ được sử dụng trong Windows Explorer

... và trong OnTimer bạn sẽ viết công cụ tìm kiếm của mình. Hãy chắc chắn rằng dòng đầu tiên ở đây sẽ là timIncSearch.Enabled: = False; Cũng bởi vì bạn sử dụng csOwnerDrawFixed có lẽ nó là tốt hơn để thực thi một repaint kiểm soát của bạn.

Là một sang một bên, - chỉ đoán vì bạn đã không cung cấp cho chúng tôi nhiều chi tiết - có lẽ bạn phải móc OnEnter và OnExit sự kiện để tùy chỉnh mở và đóng danh sách thả xuống. (Normaly, điều này được thực hiện bằng cách thiết lập thuộc tính AutoDropDown cho phù hợp)

  1. Trong ComboBox.KeyPress của bạn, bạn sẽ viết

with timIncSearch do
begin
Enabled:=False;
Enabled:=True;
end;

... cũng chăm sóc ở đây, có lẽ bạn phải có một 'trường hợp Key của' xây dựng để xử lý # 13 riêng biệt (hoặc bất cứ điều gì).

gợi ý khác:

  • tùy thuộc vào tình hình của bạn, có lẽ bạn phải móc (hay còn?) Các onKeyDown (nếu bạn muốn xử lý các phím đặc biệt như ví dụ BackSpace, Del, mũi tên vv - tham. trong trường hợp sự kiện lặp lại chính nó khi phím được nhấn xuống) và/hoặc OnKeyUp (nếu bạn muốn xử lý tương tự như trên nhưng mà không cần tính năng tự động lặp lại phím của bàn phím).
0

Trước tiên, bạn cần quyết định xem bạn có cần chức năng "* my_string *" hoặc "my_string *" hay không, có nghĩa là quyết định xem bạn có tìm kiếm bên trong chuỗi hay chỉ từ đầu. Khi bạn đã tìm ra, sau đó bạn sẽ phải buld chỉ mục của tất cả các từ được nhập vào hộp kết hợp và tìm kiếm nó sau mỗi lần gõ phím. Tôi không nghĩ rằng việc xử lý OnTimer là một cách tiếp cận đúng. Tôi thà sử dụng "OnChange" hoặc tương tự. Bạn có thể làm điều đó với TStringList được sắp xếp (dupignore) hoặc có thể xây dựng chỉ mục bằng cách sử dụng các bảng băm (việc triển khai tùy thuộc vào bạn). Kiến trúc phụ thuộc vào số chuỗi tối đa mà combo của bạn có thể chứa. Nếu nó là một số quan trọng hơn bạn có thể sử dụng bảng băm (một băm Cardinal chỉ đến nhiều chỉ mục: mảng, TList ...)

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