バグかどうかは分かりませんが…「Windows」以外のVCLスタイルを設定するとウィンドウ幅が狭くなってしまいます。
-
これに対する解決策はありますか?
更新 これを QC に送信しました: http://qc.embarcadero.com/wc/qcmain.aspx?d=103697 彼らが修正してくれることを願っています...
バグかどうかは分かりませんが…「Windows」以外のVCLスタイルを設定するとウィンドウ幅が狭くなってしまいます。
-
これに対する解決策はありますか?
更新 これを QC に送信しました: http://qc.embarcadero.com/wc/qcmain.aspx?d=103697 彼らが修正してくれることを願っています...
これは vcl スタイルのバグではありません。これが vcl スタイルの仕組みです。各スタイル (スキン) には独自の境界線の幅と高さがあり、ネイティブ ウィンドウの境界線のサイズと一致しない場合があります。
次の画像をチェック
カーボン スタイルの境界線の幅と高さは 5 ピクセルです
Amakrits スタイルの境界線の幅と高さは 6 ピクセルです
を使用して、各スタイルの枠線スタイルのサイズを確認できます。VCL Styles Designer
したがって、上記のプロパティに応じて、フォームのスタイル フックはクライアント領域の境界を再計算します。
これは確かに VCL のバグのようです。ClientWidth
プロジェクト オプションでスタイルがシステム スタイル以外に設定されている場合、プロパティは .dfm ファイルから適切にストリーミングされません。
QualityCentralに報告を提出することをお勧めします。当面は、フォームの作成後に .dpr ファイルにスタイルを設定することで、この問題を回避できる場合があります。
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
TStyleManager.SetStyle('Amakrits');//after CreateForm, rather than before
Application.Run;
ただし、起動時にすべてを作成する必要はなく、その場でフォームを作成できるようにする必要があるため、これでうまくいくとは思いません。
この問題は、Delphi XE8 にも存在します。簡単な回避策は、次のコードを使用することです。これは、設計時のClientWidth
/ClientHeight
を復元するだけですが、いくつかの注意事項があります (最も重要なのは、AutoScroll
に設定する必要がありますFalse
)。
type
TFormHelper = class helper for Vcl.Forms.TCustomForm
private
procedure RestoreDesignClientSize;
end;
procedure TfrmTestSize.FormCreate(Sender: TObject);
begin
RestoreDesignClientSize;
end;
{ TFormHelper }
procedure TFormHelper.RestoreDesignClientSize;
begin
if BorderStyle in [bsSingle, bsDialog] then
begin
if Self.FClientWidth > 0 then ClientWidth := Self.FClientWidth;
if Self.FClientHeight > 0 then ClientHeight := Self.FClientHeight;
end;
end;
次の設計時のフォームが与えられます。
これにより、次のランタイムが修正されます。
に:
私のブログに詳細と写真があります: http://marc.durdin.net/2015/07/fixing-the-incorrect-client-size-for-delphi-vcl-forms-that-use-styles/
ここには XE2 はありませんが、これはよく知られているように聞こえます。境界線のサイズではなくクライアントのフォームサイズを保存するには、 AutoScroll
True (奇妙なことに、この回答の反対)に設定してみてください。