2010-07-29 27 views
1

我无法检测窗体的滚动条是否可见。 谷歌互联网显示,下面的代码应该工作。每个人都使用它:检测窗体的滚动条是否在mdi子项中可见

​​

我这样称呼它:

procedure TFrmBaser.Button1Click(Sender: TObject); 
begin 
if VertScrollBarVisible(MainForm.Handle) 
then Caption:= 'visible'; 
end; 

返回false所有的时间,甚至是滚动条是可见的。它们可以通过一些MDI子窗体显示出来,我拖出一些屏幕。


德尔福7,Win XP的SP3,在

+0

所以你有这个代码,你就这样称呼......会发生什么? – 2010-07-29 02:51:24

+0

对不起。它一直返回False。 – Ampere 2010-07-29 03:17:08

+0

注意:MDI严重分层,出于很多原因。 – 2010-07-30 13:04:30

回答

1

返回false所有的时间,甚至是滚动条是可见的。它们可以通过一些MDI子窗体显示出来,我拖出一些屏幕。

显示您遇到问题的表单是MDI父表单(FormStylefsMDIForm)。

MDI父窗体与常规窗体的不同之处在于它们创建了一个特殊的客户窗口,它填充窗体的整个客户区,并管理MDI子窗口/窗体。 MDI客户端窗口永远不会比其父窗口的客户区大,所以父窗体将永远不会显示滚动条。这就解释了你的问题中的代码总是返回false。

您看到的滚动条是MDI客户端窗口的一部分。修改代码以检查客户端窗口的窗口风格,其手柄可以与MDI父窗体的ClientHandle属性来访问:

procedure TFrmBaser.Button1Click(Sender: TObject); 
begin 
    if VertScrollBarVisible(MainForm.ClientHandle) then 
    Caption := 'visible'; 
end; 

有关MDI在Windows的API级别的详细信息,请参阅About the Multiple Document Interface MSDN上。

1

主题试试这个:

function VertScrollBarVisible(Form : TForm) : Boolean; 
    begin 
    Result:=(Form.Width-Form.ClientWidth>10) 
    end; 

我不知道,如果它的工作原理,但它比较形式的 “可用” 的宽度与窗体的“总”宽度相比(通常它们在彼此的2-3像素范围内,但使用滚动条时,可用宽度应该明显更低)。

+0

这是一个非常意想不到的想法,但它可能工作! – Ampere 2010-07-29 14:42:40

+0

这只能在最坏的情况下使用,因为它只适用于“大多数情况下”。例如,增加窗口边界的厚度是非常可能的,所以即使在没有滚动条的情况下,它也会返回true。 – 2010-07-29 14:45:27

+0

我同意你Andreas,但你知道,当没有别的工作,你使用你有:) :) – Ampere 2010-07-29 15:26:30

相关问题