2010-07-29 28 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

相關問題