年前散分(300分) ( 积分: 300 )

  • 主题发起人 主题发起人 hotboys
  • 开始时间 开始时间
请继续,在评论中发表了好的建议和其它思路的分加倍
 
[:)][:D][8D][:(][:(][:(!][^][?]
 
[?]求助:一个很常用的属性,为什么将控件的ParentShowHint属性设置为False,还会显示父窗体的提示?
举个例子:
新建一个窗口,添加一个DBGridEh控件(可以是任意控件),再另外任意添加一些其它控件;
窗体属性设置为:
.Hint:='aaa';
//这里的提示希望在本窗体和窗体中的DBGridEh控件不显示,
而在本窗体的其它控件中显示;
.ShowHint:=false;
窗体中的控件DBGridEh设置:
.Hint:='';
.ParentShowHint:=false;
//为什么将控件的ParentShowHint属性设置为False,
还会显父窗体的提示?
.ShowHint:=true;
//这里设置为ture,因为需要显示DBGridEh控件中的列名的提示,
即DBGridEh.Cloumns[0].Title.Hint,但不希望显示窗体的提示
请问:怎样才能做到其它控件继承和使用窗体的.Hint,而DBGridEh控件不继承和
使用窗体的.Hint,而且DBGridEh控件显示DBGridEh.Cloumns[0].Title.Hint


来自:ww20000309, 时间:2005-1-10 16:29:23, ID:2959032
.ParentShowHint:=false;
.ShowHint:=true;
你将它反过来就不显示窗体的HINTS了。
即:
.parenshowhint:=true;
.showhint:=false;


来自:饭前饭后, 时间:2005-1-10 22:15:31, ID:2959079 | 编辑
反过来是不提示,但这会连DBGridEh控件中的列标题的提示都没有显示
我的目的是不要显示父窗体的提示,而显示子DBGridEh控件中的
DBGridEh.Cloumns[0].Title.Hint


来自:abookdog, 时间:2005-1-10 18:16:38, ID:2959207
显示之前给hint重赋值。

来自:饭前饭后, 时间:2005-1-10 22:04:56, ID:2959416 | 编辑
各位,我举多个例子解释吧:
TToolBar控件可以实现工具条不显示父窗口的提示,而单个按钮可以显示提示
但DBGridEh控件能不能够实现不显示父窗口的提示,而DBGridEh.Cloumns[0].Title.Hint显示提示呢

来自:wrl_001, 时间:2005-1-11 0:55:05, ID:2959547
不知道我理解有没有问题
If ParentShowHint is true, the control uses the ShowHint property value of its parent. If ParentShowHint is false, the control uses the value of its own ShowHint property.
帮助中和我理解的应该没有问题吧:如果ParentShowHint为True,这个控件使用他父窗口(准确说应该是包含他的容器,下同)的ShowHint属性的值,如果为False,这个控件使用他自己ShowHint属性的值。
因此ParentShowHint与是否显示Hint没有直接的关系,只是用于确定本控件与其父窗口的ShowHint属性是否相等,而会显示父窗口的'aaa'是因为你的DBGridEh的Hint为空,这在很多控件中都会有,不然你试试看Button、Edit等等,在这些组件中如果ShowHint为True,而Hint为空则会是使用父窗口的Hint属性。

来自:饭前饭后, 时间:2005-1-11 9:09:25, ID:2959641 | 编辑
wrl_001提出的答案很有参考性,但有没有办法实现:
只显示DBGridEh.Cloumns[0].Title.Hint

来自:wrl_001, 时间:2005-1-11 10:56:06, ID:2959868
那只要你把
窗体属性设置为:.Hint:='';
DBGridEh.ShowHint:=true;
就可以了啊,

来自:饭前饭后, 时间:2005-1-11 12:35:41, ID:2960050 | 编辑
窗体属性不能设置设为:.Hint:='';
虽然窗体本身不需要显示提示,但有其它控件需要继承或使用窗体的.Hint属性
这就是问题的难点

来自:wrl_001, 时间:2005-1-11 14:51:50, ID:2960308
StatusBar1.SimpleText := GetLongHint(Application.Hint);
// GetCursorPos(p);
// hHandle:=WindowFromPoint(p);
// if TControl(FindControl(hHandle)).Name='DBGridEh1' then
// listbox1.items.add(TControl(FindControl(hHandle)).Name+':'+Application.Hint);
我本来是想可否在Application.OnHint事件中做些判断,然后撤销这次Hint,谁知如果加入注释掉的语句只有在启动程序的时候才会触发一次,以后就不会再触发这个事件了


来自:牛刀小试, 时间:2005-1-11 15:43:18, ID:2960395
1、把窗体的hint:='aaaa'
2、然后设置起属性showhint:=false;////窗体就不会显示hint了
3、然后设置dbgrideh的属性parentshowhint:=false;//
showhint:=true;//或者先置为false在它需要显示hint的时候再置为true,可以给他的hint属性任意赋值。
4、把窗体上的其他欲显示'aaaa'的控件的属性做如下设置parentshowhint:=false;
showhint:=true;
我刚试过


来自:饭前饭后, 时间:2005-1-11 23:32:27, ID:2961002 | 编辑
谢谢各位的回答,特别要感谢wrl_001,他一直很诚肯,努力地帮我分析问题,
对我的问题要求也理解得比较透彻。
可惜问题到现在还没有解决,看来为有散分了

来自:wrl_001, 时间:2005-1-12 1:08:28, ID:2961077
兄弟你就别笑我了,嘻嘻
procedure TForm1.CustHint(Sender: TObject);
var
p:TPoint;
hHandle:THandle;
s:string;
begin
GetCursorPos(p);
hHandle:=WindowFromPoint(p);
listbox1.items.add(FindControl(hHandle).Name);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnHint :=CustHint;
end;
很奇怪,这段代码在delphi5和7下表现不同,在delphi7下可以添加TForm,TStatusBar,TListBox的name值倒listbox中,但是在delphi5下不行。
而这段代码又都可以取得到数据
procedure TForm1.Timer1Timer(Sender: TObject);
var
p:TPoint;
hHandle:THandle;
begin
GetCursorPos(p);
hHandle:=WindowFromPoint(p);
listbox1.items.add(FindControl(hHandle).Name);
end;
哪位大侠赶紧给个答案吧!!!!!!!!!!!!!
还有饭前饭后没有解决不要结贴啊!

来自:wrl_001, 时间:2005-1-12 15:54:03, ID:2961932
终于找到一个办法啦
先设置你的DBGridEh1的Hint属性为CustDBGridEhHint,然后把下面这个单元加入你的工程之中就可以了
unit Unit2;
interface
uses
Windows, Controls, Forms;
type
TWrlHintWindow=class(THintWindow)
public
procedure ActivateHint(Rect:TRect;const AHint:string);override;
end;

implementation
{ TWrlHintWindow }
procedure TWrlHintWindow.ActivateHint(Rect: TRect;
const AHint: string);
var
p:TPoint;
hHandle:THandle;
s:string;
begin
GetCurSorPos(p);
hHandle:=WindowFromPoint(p);
if FindControl(hHandle).Name='DBGridEh1' then
begin
if AHint<>'CustDBGridEhHint' then
inherited ActivateHint(Rect,AHint);
end else
inherited ActivateHint(Rect,AHint);
end;

initialization
application.ShowHint :=false;
HintWindowClass:=TWrlHintWindow;
Application.ShowHint :=True;
end.


来自:wrl_001, 时间:2005-1-12 15:59:31, ID:2961944
//很奇怪,这段代码在delphi5和7下表现不同,在delphi7下可以添加TForm,TStatusBar,TListBox的name值倒listbox中,但是在delphi5下不行。
这段话有错,应该是如果设置了组件的Hint属性不为空则都可以,而且如果组件的Hint属性为空的时候即使显示Hint也不会触发Application.OnHint这个事件。

来自:饭前饭后, 时间:2005-1-13 8:57:59, ID:2962601 | 编辑
昨天比较忘,所以没有时间看.今天看过了,这段代码应该接近成功了,但还有一点问题吧:
我设置的DBGridEh1的Hint属性为CustDBGridEhHint,把这个单元加入工程,好像所有Hint都没有显示,还有这里的如果语句,为什么条件不同,处理都一样呢:
if AHint<>'CustDBGridEhHint' then
inherited ActivateHint(Rect,AHint);
end else
inherited ActivateHint(Rect,AHint);
end;


来自:wrl_001, 时间:2005-1-13 23:58:11, ID:2964011
if FindControl(hHandle).Name='DBGridEh1' then
begin
;//只有是DBGridEh1的时候才需要判断是否显示
if AHint<>'CustDBGridEhHint' then
//这句主要是要显示title的hint,
inherited ActivateHint(Rect,AHint);
end else
inherited ActivateHint(Rect,AHint);//这句是用于其他组件的hint窗口显示
//把这个单元加入工程,好像所有Hint都没有显示,
这个我这里完全正常啊,除非你的工程中有其他东西冲突了

来自:饭前饭后, 时间:2005-1-14 8:25:24, ID:2964068 | 编辑
最近比较忘,我可能没有试清楚,
有时间我一定会试清楚!先谢过

来自:饭前饭后, 时间:2005-1-19 14:45:56, ID:2970133 |
 
接分啦。
 
有分就接,理他日月星辰
 
结了算了,没劲呀。。。。。
 
多人接受答案了。
 
不管多少,弄点分吧.反正分不够了,以后再多送点给大虾们.
 
后退
顶部