喫茶XRAYトップページ


[3369] 710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 12:49:26 Mr.XRAY
次のような問い合わせがありました.

>サンプルをそのまま(ウィンドウサイズは300x300に変更)
>Delphi2009でコンパイル実行しますと
>ウィンドウサイズが設計時サイズにならず大きくなります。
>画面と同じ比率?で画面全体の60%か70%くらい縮小
>したサイズになります。
>どうして設計時のウィンドウサイズにならないのでしょうか?


このサンプルでは,実際に表示するフォームは,
SDISubFormというフォームです.
このフォームのPositionプロパティをpoDesignedにしてください.
すると,IDEでの設計時の位置とサイズになると思います.

動作確認は,Windows XP(SP3) + Delphi 2010(UP5)です.

[3370] Re:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 12:54:53 Mr.XRAY
> このフォームのPositionプロパティをpoDesignedにしてください.
> すると,IDEでの設計時の位置とサイズになると思います.


この場合当然,[ファイル][新規]でフォームを新規作成すると,
前のフォームに重なります.重ならないようにするには,
新規にフォームを作成して表示する時に位置とサイズを設定して
ください.

[3371] Re:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 14:59:34 Mr.XRAY
> 次のような問い合わせがありました.

失礼しました.
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201005/10050019.txt

に書き込みがありました.
私目の見落としでした.
板橋のおばあちゃんに叱られるので,謝っておきます.


[3373] Re2:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 16:07:14 ishimizu
ありがとうございました。
新規作成に関しては、poDesignedで解決しました。
が、「重ねて表示」を実行するとやはりウィンドウサイズは
大きくなりますね。これは、しかたがないのでしょうか?
解決策があるようでしたらお教えください。
よろしくお願いします。

同じ内容の返信をを間違えて新規で投稿してしまいました。
削除キーを登録しなかったので削除できません。
申し訳ありませんが、削除できるようでしたら削除してください。

[3374] Re3:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 18:25:23 Mr.XRAY
▼ ishimizuさん.こんにちは.

> 大きくなりますね。これは、しかたがないのでしょうか?
> 解決策があるようでしたらお教えください。


しかたないと言うか,Windowsの仕様ですね.
下のコードは「重ねて表示」の実行部ですが,
CascadeWindows関数は,NSDNによると元に戻ることになります.
http://msdn.microsoft.com/ja-jp/library/cc410624.aspx

やるとすれば,この後に各ウィンドウの位置とサイズを希望の位置とサイズ
に設定しなおすことになると思います.
その設定の前に,現在のサイズ(位置は各フォームで少しずらすこと
になるので - 重ねて表示なので)をどこかに記憶しておくとか,ですね.

procedure TSDISubForm.menuCascadeWindowClick(Sender: TObject);
var
    WndHandleList : array of HWND;
    i             : Integer;
begin
    SetLength(WndHandleList, Screen.FormCount);
    for i:=0 to Screen.FormCount-1 do begin
      WndHandleList[i] := Screen.Forms[i].Handle;
      SetForegroundWindow(WndHandleList[i]);
    end;
    CascadeWindows(0,
                   0,{MDITILE_SKIPDISABLED,}
                   nil,
                   Screen.FormCount,
                   Addr(WndHandleList[0]));
    SetForegroundWindow(Handle);
end;

[3375] Re4:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 18:35:46 Mr.XRAY
> やるとすれば,この後に各ウィンドウの位置とサイズを希望の位置とサイズ
> に設定しなおすことになると思います.


あるいは,最初からCascadeWindows関数を使わないで,
自前でコードを書くかですね.


[3376] Re3:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 18:37:19 Mr.XRAY
▼ ishimizuさん

> 同じ内容の返信をを間違えて新規で投稿してしまいました。

ここは雑談系ですから,あまり気にすることはないです.
別に別のスレッドもいいですよん.
Delphi MLのスレッドなんかズダズダですから.
まっ,気軽に...

[3377] Re4:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 19:31:25 ishimizu
▼ Mr.XRAYさん

回答ありがとうございました。結局以下のようにしてみました。
SetForegroundWindow, SetForegroundWindowがあると
ウィンドウの表示がおかしいのではずしています。
FWHeight、FWWidthは、重ねて表示を実行したWindowのサイズです。
まだ、修正の余地がありますが、実際に実装するときに検討します。
以上 また、よろしくお願いします。

FWHeight := Screen.Forms[0].Height;
FWWidth := Screen.Forms[0].Width;

procedure TSDISubForm.menuCascadeWindowClick(Sender: TObject);
var
  WndHandleList: array of HWND;
  i: integer;
begin
  SetLength(WndHandleList, Screen.FormCount);

  for i := 0 to Screen.FormCount - 1 do begin
    Screen.Forms[i].Height := SDIMainForm.FWHeight;
    Screen.Forms[i].Width  := SDIMainForm.FWWidth;
    Screen.Forms[i].BorderStyle := bsSingle;
    WndHandleList[i] := Screen.Forms[i].Handle;
    //SetForegroundWindow(WndHandleList[i]);
  end;
  CascadeWindows(0,
                 0,  {MDITILE_SKIPDISABLED,}
                 nil,
                 Screen.FormCount,
                 Addr(WndHandleList[0]));

  for i := 0 to Screen.FormCount - 1 do begin
    Screen.Forms[i].BorderStyle := bsSizeable;
  end;
  //SetForegroundWindow(Handle);
end;



[3378] Re5:710_SDIスタイルアのプリケーション返信 削除
2010/5/19 (水) 21:02:27 Mr.XRAY
▼ ishimizuさん.どうも

お疲れ様です.
こんなもんじゃないでしょうか.
CascadeWindowの前でも設定できるんですね.

でも,このコードは他の方にも参考になりますね.
最近はワイドな画面が増えてきて,「あれっ?」
という人もいると思います.

Delphi 2010も,新規フォームが,このWindowsのデフォルトサイズ
になりますね.

INCM/CMT
Cyclamen v3.82