THintContro

  • 长时间的编程工作已经养成了一个习惯那就是当有错误发生的时候,就显示一个错误对话框,当需要提示的时候就显示一个提示对话框,当有一个可以忽略的错误的出现的时候,就显示一个警告对话框。
        因此就有了当需要验证用户输入的数据时候正确的时候,如果输入的内容不合法,那么就显示一个错误的对话框。本来觉得没有什么,但是我们的测试人员给了我一个建议说:这么做太恐怖了,让用户感觉好像发生了什么不可避免的严重问题,他说能不能温柔一些呢?比如使用一个警告的对话框。但是我不同意使用一个警告的对话框,因为我认为那是可忽略的内容才会显示一个警告,通常是不会显示一个警告的。我们尝试了在Windows建立一个非法的文件夹,体会一下Windows的温柔。Windows确实是很温柔,只用一个Hint就解决了这个问题。
        在Delphi中每个组件几乎都具有Hint属性,但是他们只是在鼠标移动到该组件的时候才显示Hint内容。幸运的是,Delphi为我们提供了一个THintWindow组件,这样就不需要我们手工封装一个组件了。为了实现我们温柔的目标,我们封装一个来实现他。
    代码如下:
    1. THintControl = class(TComponent)
    2.   private
    3.     FHint: string;
    4.     HintWindow: THintWindow;
    5.     HintTimer: TTimer;
    6.     FComponent: TControl;
    7.   protected
    8.     procedure HideHint(Sender:TObject); virtual;
    9.   public
    10.     constructor Create(AOwner: TComponent); override;
    11.     destructor Destroy; override;
    12.     property Hint: string read FHint write FHint;
    13.     property Component: TControl read FComponent write FComponent;
    14.     procedure ShowHint(AHint: string); overload;
    15.     procedure ShowHint(AHint: string; AComponent: TControl); overload;
    16.   end;
    17. implementation
    18. { THintControl }
    19. procedure THintControl.ShowHint(AHint: string);
    20. begin
    21.   ShowHint(AHint, FComponent);
    22. end;
    23. constructor THintControl.Create(AOwner: TComponent);
    24. begin
    25.   inherited;
    26.   HintWindow := HintWindowClass.Create(nil);
    27.   HintWindow.Color := Application.HintColor;
    28.   HintTimer:=TTimer.Create(nil);
    29.   HintTimer.OnTimer:=HideHint;
    30.   HintTimer.Interval:=Application.HintHidePause;
    31. end;
    32. destructor THintControl.Destroy;
    33. begin
    34. //  sleep(HintTimer.Interval);
    35.   HintTimer.Free;
    36.   HintWindow.Free;
    37.   inherited;
    38. end;
    39. procedure THintControl.HideHint(Sender: TObject);
    40. begin
    41.   TTimer(Sender).Enabled:=false;
    42.   ShowWindow(HintWindow.Handle,SW_HIDE);
    43. end;
    44. procedure THintControl.ShowHint(AHint: string; AComponent: TControl);
    45. var
    46.   vPoint:TPoint;
    47.   vRect:TRect;
    48. begin
    49.   if AHint<>'' then
    50.   begin
    51.     if not Windows.IsWindowVisible(HintWindow.Handle) or (HintWindow.Caption<>AHint) then
    52.     begin
    53.       vRect:=HintWindow.CalcHintRect(Screen.Width,AHint,nil);
    54.       vPoint.X := AComponent.Left;
    55.       vPoint.Y := AComponent.Top + AComponent.Height ;
    56.       vPoint := AComponent.Parent.ClientToScreen(vPoint);
    57.       Inc(vRect.Left,vPoint.X);
    58.       Inc(vRect.Right,vPoint.X);
    59.       Inc(vRect.Top,vPoint.Y);
    60.       Inc(vRect.Bottom,vPoint.Y);
    61.       HintWindow.ActivateHint(vRect,AHint);
    62.       HintTimer.Enabled:=true;
    63.     end;
    64.   end
    65.   else
    66.     ShowWindow(HintWindow.Handle,SW_HIDE);
    67. end;
    68. //调用示例:
    69. procedure TForm1.Button2Click(Sender: TObject);
    70. var
    71.   vHint: THintControl;
    72. begin
    73.   vHint := THintControl.Create(self);
    74.   try
    75.     vHint.Component := edit1;
    76.     vHint.ShowHint('合法的年龄范围为:18~120');
    77.   finally
    78.   end;
    79. end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值