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.
Nguồn
2012-02-15 01:38:39
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
@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 –