我认为我将列标题提示实现到我自己的DBGrid中。 它似乎很简单 - 我想。
我添加了
TitleHints:TStrings
包含以下格式的信息:
名=值
对于非基于字段的列,名称为(0-99),对于基于字段的列,名称为fieldname。 值是列的提示,crlf是\ n。
一切正常,OnMouseMove是基于位置的提示。
但是:只有第一个提示显示,nexts不是。 我想这是因为提示机制在鼠标到达“控制”时被激活......当我离开控件,再来时,我得到另一个提示 - 一次。 无论我将ShowHint设置为关闭。
因为如果可能的话我不想创建自己的HintWIndow,我搜索一种方法将Hint机制重置为Applicaion相信:这是此控件中的第一个案例。 我能以任何方式进行,例如“发送消息”,或者如果存在则调用“cancelhint”等。
你知道这种方式吗?
感谢您的帮助,祝您有个美好的一天!
问候: DD
答案 0 :(得分:3)
您可以重新激活被覆盖的MouseMove
中的提示,例如:
type
TDBGrid = class(DBGrids.TDBGrid)
private
FLastHintColumn: Integer;
protected
procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
function GetColumnTitleHint(Col: Integer): string;
procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override;
public
constructor Create(AOwner: TComponent); override;
end;
procedure TDBGrid.CMHintShow(var Message: TCMHintShow);
var
Cell: TGridCoord;
begin
if not Assigned(Message.HintInfo) or not (dgTitles in Options) then
inherited
else
begin
Cell := MouseCoord(Message.HintInfo^.CursorPos.X, Message.HintInfo^.CursorPos.Y);
if Cell.Y = 0 then
begin
FLastHintColumn := Cell.X - 1;
Message.HintInfo^.HintStr := GetColumnTitleHint(FLastHintColumn);
end
else
FLastHintColumn := -1;
end;
end;
function TDBGrid.GetColumnTitleHint(Col: Integer): string;
begin
Result := Columns[Col].Title.Caption + ' hint';
end;
procedure TDBGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
Cell: TGridCoord;
begin
inherited MouseMove(Shift, X, Y);
if dgTitles in Options then
begin
Cell := MouseCoord(X, Y);
if Cell.Y = 0 then
begin
if Cell.X - 1 <> FLastHintColumn then
Application.ActivateHint(Mouse.CursorPos);
end
else
Application.CancelHint;
end;
end;
constructor TDBGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FLastHintColumn := -1;
end;
GetColumnTitleHint
只是一个示例,您应该实现它以从TitleHints
属性返回正确的值。
希望这有帮助。