Gavin

知识管理(KM, Knowledge Management)

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;
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭