2012-02-14 12 views
7

Tôi đang chạy Lazarus 0.9.30.Làm thế nào bạn có thể nhận được gợi ý cho các ô trong TStringGrid xuất hiện trơn tru hơn?

Tôi có một tiêu chuẩn TStringGrid trên biểu mẫu và muốn hiển thị gợi ý khác khi tôi di chuyển con trỏ chuột qua tiêu đề cột. Tôi đang sử dụng mã này để làm điều này và nó sắp xếp các công trình nhưng bạn thường phải bấm vào ô để có gợi ý thay đổi, khi tôi thực sự muốn nó thay đổi khi con trỏ chuột di chuyển qua nó. Tôi có tất cả các gợi ý được lưu trữ trong một bộ sưu tập mà tôi tìm kiếm thông qua việc sử dụng chỉ mục cột làm khóa. Có cách nào để hiển thị mượt mà hơn các gợi ý không?

procedure TTmMainForm.SgScoutLinkMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
var 
    R, C: Integer; 
begin 
    R := 0; 
    C := 0; 

    SgScoutLink.MouseToCell(X, Y, C, R); 

    with SgScoutLink do 
    begin 
    if (R = 0) then 
     if ((C >= 3) and (C <= 20)) then 
     begin 
     SgScoutLink.Hint := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3); 
     SgScoutLink.ShowHint:= True; 
     end; {if} 
    end; {with} 
end; 

Trả lời

10

Gán một event handler cho sự kiện TApplication.OnShowHint hoặc TApplicationEvents.OnShowHint, hoặc phân lớp các TStringGrid để đánh chặn thông điệp CM_HINTSHOW. Bất kỳ một trong số đó sẽ cung cấp cho bạn quyền truy cập vào bản ghi THintInfo được sử dụng để kiểm soát hành vi của cửa sổ gợi ý. Bạn có thể tùy chỉnh tọa độ của thành viên THintInfo.CursorRect nếu cần. Cửa sổ gợi ý được kích hoạt lại với văn bản thuộc tính Hint mới nhất (có thể được tùy chỉnh với thành viên THintInfo.HintStr trước khi nó được hiển thị) bất cứ khi nào con chuột di chuyển ra ngoài hình chữ nhật đó. Hình chữ nhật càng nhỏ, cửa sổ gợi ý thường xuyên được kích hoạt lại. Tính năng này cho phép điều khiển giao diện người dùng có nhiều phần con trong vùng khách hàng hiển thị các chuỗi gợi ý khác nhau trong khi chuột di chuyển xung quanh cùng một điều khiển giao diện người dùng đó.

Giá trị của thuộc tính TApplication.HintShortPause (hoặc chặn thông báo CM_HINTSHOWPAUSE) kiểm soát xem cửa sổ gợi ý có biến mất hay không trước khi kích hoạt lại. Nếu bạn đặt giá trị tạm dừng bằng 0, cửa sổ gợi ý sẽ cập nhật văn bản ngay lập tức mà không biến mất. Nếu bạn đặt giá trị tạm dừng thành giá trị khác 0, cửa sổ gợi ý biến mất và sau đó xuất hiện trở lại sau khi số mili giây đã chỉ định trôi qua, miễn là con chuột vẫn ở trên cùng một điều khiển giao diện người dùng.

Ví dụ:

procedure TTmMainForm.FormCreate(Sender: TObject); 
begin 
    Application.OnShowHint := AppShowHint; 
end; 

procedure TTmMainForm.FormDestroy(Sender: TObject); 
begin 
    Application.OnShowHint := nil; 
end; 

procedure TTmMainForm.AppShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo); 
var 
    R, C: Integer; 
begin 
    if HintInfo.HintControl = SgScoutLink then 
    begin 
    R := 0; 
    C := 0; 
    SgScoutLink.MouseToCell(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, C, R); 
    if (R = 0) and (C >= 3) and (C <= 20) then 
    begin 
     HintInfo.CursorRect := SgScoutLink.CellRect(C, R); 
     HintInfo.HintStr := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3); 
    end; 
    end; 
end; 

Edit: Tôi chỉ nhận thấy rằng bạn đang sử dụng Lazarus. Những gì tôi mô tả là làm thế nào để xử lý vấn đề này trong Delphi. Tôi không có đầu mối nếu nó cũng áp dụng cho Lazarus hay không.

+0

tôi nghĩ rằng cuộc gọi SgScoutLink.MouseToCell sẽ không hoạt động như mong đợi. Nó dự đoán các tọa độ tương đối so với điều khiển TGrid, nhưng các tọa độ trong CursorPos là tọa độ màn hình tuyệt đối. Vì vậy, SgScoutLink.ScreenToClient nên được gọi là đầu tiên. – dummzeuch

+0

@dummzeuch 'THintInfo.CursorPos' chứa tọa độ khách hàng tương đối trong' THintInfo.CursorRect', chứ không phải tọa độ màn hình –

0

tôi đến các giải pháp sau đây ... không có ý tưởng nếu nó hoạt động trong lazarus nhưng delphi của tôi là ok với nó ... Viết pseudo-code sau đây để xử lý lưới MouseMove:

if (current_coords==old_coords) then 
    {showhint=true;hint=use_mousetocell_call_to_create} 
else 
    {showhint=false;hint=''} old_coords=current_coords;