Windows10でフォームのサイズ、位置が思い通りにならない


螺子まき  2017-03-22 21:42:36  No: 48619

標記の件、Windows10でフォームのサイズ、位置が思い通りになりません。
下記で(ディスプレイの横幅1920、拡大率?は100%です)、左右に 7dot ほど隙間ができます。

何がかわってしまったのでしょうか?
宜しくお願いします。

procedure TForm1.FormCreate(Sender: TObject);
begin

  Width:= 1920;
  Left:= 0;

end;


通りすがり  2017-03-22 23:25:53  No: 48620

そのあとで、ボタンのクリックイベントか何かでWidth、Leftを表示させたらどのような値になっていますか?

# 相変わらずWindowsのテーマが悪さをしてる気が…


螺子まき  2017-03-23 00:23:47  No: 48621

1920  と  0  になっています。
※VCLです。
FireMonkeyだとさらに変になります。(左に大きくずれてしまう)

宜しくお願いします。


螺子まき  2017-03-23 00:32:08  No: 48622

これだとVCLではうまくいきます。

ご参考まで。

procedure TForm1.FormCreate(Sender: TObject);
var
  W: Integer;
begin

  W := Form1.Width - ClientWidth;

  Left := 0 - (W div 2);

  Width := 1920 + W;

end;


take  2017-03-23 20:47:52  No: 48623

フォームの Widthは一番外側のサイズなので Width で指定しても装飾の分 ClientWidthは減って正常なのではないでしょうか?
ClientWidth を 画面一杯にする場合は余計な装飾が使われないフォームの種類を使えば良いかと思われます。


螺子まき  2017-03-24 21:15:42  No: 48624

通りすがりさん、takeさん、返信ありがとうござます。

環境を書いていませんでした。
10.1Berlinです。
10.2Tokyoでも試しましたが状況は同じです。

わかったのは、
・スタイルなしだと、Win10では Left、Widthが思い通りにならない(一回り小さくなる)
・なにかしらスタイルありだと、Win10でも Left、Widthが思い通りになるようです。


take  2017-03-25 01:53:59  No: 48625

話がかみあってないかもしれませんが
Leftを0に設定しても画面左端に行かない(Leftが0にならない)という話であれば
Windowsのスタイルが邪魔しているのでプログラム上から超えるのはちょっと厳しい

画面一杯に自分のフォームを広げて Imageとかで 1920x1080のサイズの画像を表示しようとしたら
フォームとの隙間が邪魔で全体が表示できないという話であれば枠のフチが0ピクセルのフォームの種類を使うということ

  W := Form1.Width - ClientWidth; の例で
  
  えっとForm1のスコープ内だから
  
  W := Form1.Width - Form1.ClientWidth; 
  
  と同等だっけ?
  
これが0にならないってことならフォームの外側とフォームの内側を区切るフチがある
ってことなんじゃないの?


Mr.XRAY  2017-03-25 02:20:53  No: 48626

>左右に 7dot ほど隙間ができます。 

Windows Vista 以降では,フォームのキャプション部分とフレームの部分は,
DWM (Desktop Window Manager) が描画を実行しています.
したがって,これは Delphi の問題というわけではありません.
実際のウィンドウの幅 (フォームの幅ではなく) は,例えば以下のようにして取得できます.

procedure TForm1.Button1Click(Sender: TObject);
var
  LRect  : TRect;
  LWidth : Integer;
begin
  //DwmXXXの使用にはusesにDWMAPIが必要
  DwmGetWindowAttribute(Handle,
                        DWMWA_EXTENDED_FRAME_BOUNDS,
                        @LRect,
                        SizeOf(LRect));

  LWidth := LRect.Right - LRect.Left;
  ShowMessage(IntToStr(LWidth));
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加