喫茶XRAYトップページ


[10213] ShellExecute等返信 削除
2016/7/22 (金) 17:04:02 Mr.XRAY
[ShellExecute等]
http://www.freeml.com/delphi-users/4477/latest

これもコードが変.
良い子の皆さんは,コードは必ずコピペしてね.
えっ !? お前もな ! ハイ,肝に銘じて...

>Form1.Top+Form1.Height と Form2.Top の値が同じでも
>4ドットの空きができてしまいます。


これは,以下の現象ですね.多分.

[01_Vista 以降の拡張フレームのウィンドウ ]
http://mrxray.on.coocan.jp/Delphi/plSamples/368_ScreenCaptureTest.htm#01

動作確認は,Windows 10(1511 ビルド 10586) + Delphi XE(UP1) Pro


//-------------------------------------------------------------------------
//  Windows Vista以降では,フォームのフレームの仕様が拡張されている
//  これを考慮したウィンドウのTRect構造体の値を取得
//  usesにDWMAPIが必要
//-------------------------------------------------------------------------
function GetWindowRectForVista(hWindow: HWND): TRect;
var
  LRect : TRect;
begin
  //Windows Vista以降は拡張フレーム
  if CheckWin32Version(6, 0) then begin
    //拡張したウィンドウのフレームのTRect構造体の値を取得
    DwmGetWindowAttribute(hWindow,
                          DWMWA_EXTENDED_FRAME_BOUNDS,
                          @LRect,
                          SizeOf(TRect));
  end else begin
    GetWindowRect(hWindow, LRect);
  end;
  Result := LRect;
end;

//-------------------------------------------------------------------------
//  Form1のすぐ下にForm2を表示
//  GetWindowRect関数で取得する場合と同じ結果になる
//-------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Left := Self.Left;
  Form2.Top  := Self.Top + Self.Height;
  Form2.Show;
end;

//-------------------------------------------------------------------------
//  Form1のすぐ下にForm2を表示
//  Windows Vista 以降のフレームに対応したウィンドウの高さを取得して処理
//-------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  LRect : TRect;
begin
  LRect := GetWindowRectForVista(Form1.Handle);
  Form2.Left := Self.Left;
  Form2.Top  := Self.Top + (LRect.Bottom - LRect.Top);
  Form2.Show;
end;


※ 私の環境では「空き」は 7 ドットです (ML の質問者の環境では 4 ドット)


[10214] ふる〜い Delphiの方への参考返信 削除
2016/7/22 (金) 17:09:34 Mr.XRAY
> [01_Vista 以降の拡張フレームのウィンドウ ]
> http://mrxray.on.coocan.jp/Delphi/plSamples/368_ScreenCaptureTest.htm#01


DwmGetWindowAttribute が実装されていないふる〜い Delphi の方への参考

function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD;
  pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;

  DWMWA_EXTENDED_FRAME_BOUNDS = 9;


TForm の Width, Height が,相当する値を返してくれればいいと思った方,
それでは個人的に困るんです.
TForm.Width, TForm.Height の値を使用して,フォーム内のコントロールの配置
をしているのがあるんです !!
そういうこをしてもらうと Windows のバージョンで配置が変わってしまって,
困るんです !!


[10216] Re:ふる〜い Delphiの方への参考返信 削除
2016/7/22 (金) 17:27:18 Mr.XRAY
> TForm.Width, TForm.Height の値を使用して,フォーム内のコントロールの配置

Clientxxx かを使うべきだとおっしゃる方がいるかも知れません.
でも,いままでのは,誰が修正してくれるんですか ?


[10221] Re:ふる〜い Delphiの方への参考返信 削除
2016/7/23 (土) 18:57:12 Mr.XRAY
> function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD;
>   pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
>
>   DWMWA_EXTENDED_FRAME_BOUNDS = 9;


「delphi DwmGetWindowAttribute」でググったら 3 番目にありました.

http://www.delphipraxis.net/159936-form-mit-bssingle-unter-aero-zu-gross.html

関数のところだけコピペして動作確認してみました.
後は前のテストコードと同じです.
動作確認は Windows 10(1511 ビルド 10586) 64 bit + Delphi 7 Pro
Form1 と Form2 の間に隙間があるように見えますが,隙間ではありません.
Windows 10 ではウィンドウのフレームが青いのです.それです.

追加したコードです.

const
  DWMWA_EXTENDED_FRAME_BOUNDS = 9;

function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
  external 'dwmapi.dll';



[10222] Re2:ふる〜い Delphiの方への参考返信 削除
2016/7/23 (土) 19:04:48 Mr.XRAY
>[ShellExecute等]
>http://www.freeml.com/delphi-users/4477/latest


http://www.freeml.com/delphi-users/4488
>私には敷居の高いことではありますが、少しずつやってみようと思います。

そうですかぁ ?
すぐできると思うんですが...
あまり緊急ではなかったのね.


[10227] 仕事の作法?返信 削除
2016/7/24 (日) 14:20:15 Mr.XRAY
> >私には敷居の高いことではありますが、少しずつやってみようと思います。
>
> そうですかぁ ?
> すぐできると思うんですが...


敷居が高かろうと,低かろうと,
やらなければならない時はやらなければならないんです.
ゴチャゴチャと言っている場合じゃないんです.
アプリを使用するユーザが待っているんです.

今回の例は,DwmGetWindowAttribute という関数です.
ネットでこの関数を使用した例を探します.
使ったことがなければ,ほとんどこれしか手はありません.

そのコードをコピペして実行します.
当然未定義のエラーが出ます.
また,ネットで,その関数の定義文が書いてあるページがあるか探します.
運がよければ,今回のように,使用例と関数の定義文のコードが見つかります.
なければ,MSDN の記事を元に作成します.

その関数の定義文を,使用するソースコードに貼り付けます.
コンパイルして実行します.
どこに貼り付けたらいいか分からなければ,
それこそ,コミュニティの存在価値があるというものです.

以上です.
で,「敷居の高い」のはどの部分 ?
と,こういうこと言ってもヤル気のない人には無理か...


[10228] リホームのすすめ返信 削除
2016/7/24 (日) 16:12:47 Mr.XRAY
> > >私には敷居の高いことではありますが、少しずつやってみようと思います。

サラリーマン男二人の会話

男 A
「敷居が高くてプログラムが中々進まない人がいるらしいよ」

男 B
「その人は高齢者か障害のある人かも知れないね.
最近は,敷居の高さをなくした,障碍者や高齢者にやさしい住居があるらしいよ.
リホームするといいかもね」

-----------  半可通 -------------------------------------------


[10230] Re:リホームのすすめ返信 削除
2016/7/25 (月) 00:41:27 Nov
▼ Mr.XRAYさん
> > > >私には敷居の高いことではありますが、少しずつやってみようと思います。
>
> サラリーマン男二人の会話
>
> 男 A
> 「敷居が高くてプログラムが中々進まない人がいるらしいよ」
>
> 男 B
> 「その人は高齢者か障害のある人かも知れないね.
> 最近は,敷居の高さをなくした,障碍者や高齢者にやさしい住居があるらしいよ.
> リホームするといいかもね」
>
> -----------  半可通 -------------------------------------------


敷居が高い≠ハードルが高い
というのを知ったのは、意外と最近ですが...

http://kotowaza-allguide.com/si/shikiigatakai.html

ハードルは低くても苦手です。

---- 1/4可通 ----

[10231] Re2:リホームのすすめ返信 削除
2016/7/25 (月) 08:35:12 Mr.XRAY
▼ Novさん

> ハードルは低くても苦手です。

メタボ ?
 
> ---- 1/4可通 ----

ハハハッ.更に半分ですか.


[10223] Re2:ふる〜い Delphiの方への参考返信 削除
2016/7/23 (土) 21:41:08 Mr.XRAY
> 後は前のテストコードと同じです.

ウソです.
uses 部から DWMAPI を削除しています.


[10224] Re2:ふる〜い Delphiの方への参考返信 削除
2016/7/23 (土) 22:23:16 Mr.XRAY
> 動作確認は Windows 10(1511 ビルド 10586) 64 bit + Delphi 7 Pro

というわけで,Delphi 3 でも EXE を作成して確認してみました.



[10217] Re:ShellExecute等返信 削除
2016/7/22 (金) 20:05:46 Mr.XRAY
> ※ 私の環境では「空き」は 7 ドットです (ML の質問者の環境では 4 ドット)

4 ドットと 7 ドットではどのくらいの違いかを確認してみました.
確かなことは分かりません.
前に TStringGrid のセルの質問で 4 ドットを 10 ドットと表現した方もいます.
見た目と実際の値は,主観が入りますから.

もし本当に 4 ドットだとしたら,原因は別かも知れません.
私の推測は,おそらく 4 ドットというのは主観であって,原因は,
既に書いたウィンドウのフレームの問題だと思っています.
本当のことは分かりません.
これぐらい単純なことでしたら,例によって「新規作成」で確認できます.
しかし,実際にはコードは提示されていませんし.

# こういうのって,どうやって測ったの,って訊いてくれる人っていないな (ボソッ)
# いえ,独り言です.ハイ.


INCM/CMT
Cyclamen v3.82