我嘗試過的第一件事並沒有奏效:我猜想這個問題與Vista上更寬的窗口邊界有關。我認爲VCL中的UpdateAnchorRules由於設計寬度和Vista上窗口的實際寬度之間的差異而以某種方式計算不正確。查看VCL源代碼,很明顯,更改錨點會導致UpdateAnchorRules再次被調用並(希望)正確計算,因爲它現在具有可用表單的實際寬度。
我加
TAnchors t = BlahBtn->Anchors;
t >> akRight;
BlahBtn->Anchors = t;
t << akRight;
BlahBtn->Anchors = t;
到我的窗體構造函數。
沒有快樂。行爲完全不受影響。
我想這可能是在過程中太早,所以移動相同的代碼到FormShow方法,同樣失敗。作爲最後的嘗試,我改變了形式,不再有akRight爲按鈕的設計,改變了代碼
TAnchors t = BlahBtn->Anchors;
t << akRight;
BlahBtn->Anchors = t;
...這太失敗 - 行爲完全不受影響,除此之外,我打破了定位在保存的表單的大小(我從註冊表中讀出並應用於FormShow中的表單)的情況下,XP上的按鈕不是默認值。
在窗體的生命週期的不同時間點,添加了一個公制的調試代碼,輸出窗體的寬度,按鈕的寬度,按鈕的左邊,窗體的ClientRect等等,發現問題。出於某種原因(大概仍然與窗口邊界有關 - 我沒有設法找出究竟是什麼原因),VCL打開窗口的寬度應該低於本應有的4像素。此後不久,寬度得到了修正,但到那時,錨定(和UpdateAnchorRules)已經將按鈕的位置固定在4個像素的右邊。
定盤:
void __fastcall TFooBarDlg::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
int i = GetSystemMetrics(SM_CXSIZEFRAME);
Params.Width=Params.Width+(2*(i-4));
}
這校正的形式的初始寬度,使用所報告的Vista的邊界的不同尺寸。它在Vista上導致正確的行爲,同時將其保留在其他Windows版本(以及具有「經典」外觀的Vista)上。
希望這有助於某人。
我有一個模糊的內存(可能不正確),舊版本的Delphi只存儲了窗體的寬度和高度。這意味着在Windows上使用不同的窗口框架設置運行時,表單可能會重新創建錯誤的大小 - 並且包含2000/XP的自定義版本,因爲您可以在顯示設置中更改該窗體。 Delphi的較新版本將ClientWidth和ClientHeight(窗口框架內的大小)流化,消除了這個問題。看起來你找到了解決方案!但最強大的解決方案是升級到更新的版本...... D5是什麼,十到十二歲? – 2013-04-03 13:54:53