過去の桐井戸端BBS (桐ver.9)
23589 フォームウィンドウの「水平・垂直位置の調整」を指定したい 悲しげ 2003/11/30-22:13
「オブジェクト操作」コマンドでは、フォームウィンドウの「水平・垂直位置の調整」を指定することはできませんよね?
で、この位置を自在に操るためには、フォームの設定ではここの位置の調整を「自動」に設定しておいた上で、
フォーム開始イベントで

 手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
  ウィンドウ位置 設定,&hwindow,位置=(&始点x,&始点y)
  ・・・・・・

とやるしかないような気がするのですが、他にうまいやり方がありますでしょうか?

もし、これしか無いとすれば、質問は続きます。
上記コマンドで云う「&始点x,&始点y」なる変数は、固有変数として別途
宣言済みで、呼び出す直前にdot値を代入するものとします(註)。
では、ここで入れるdot値をどう決めるか、と云うのが次なる疑問です。
自分の環境(画面の解像度とか、個々の呼び出し元フォームの諸属性)で、
色々試行錯誤すればいいのかもしれませんが、この辺りの法則性と云うか、
一般的考え方と云ったところにつき、先輩のご助言を戴きたいのです。
おそらく、かなり悩んだ末に、ある程度の境地に達した方がいらっしゃる
のではないかと期待して。(^^;)
「上付け」ならこれくらいとか、「下寄せ」ならどうとか・・・、一般的に云えるものが有ったりすれば嬉しいです。

話があとさきになりましたが、今回の用途を記しておきます。
伝票(または一覧表)フォーム上で、商品マスター類からデータを取得するために、
まずは検索文字列入力用のフォームを「フォーム呼び出し」します。

この呼び出すフォームウィンドウの垂直位置を、今までは「下寄せ」として来たのですが、
この位置だと入力行数がまだ少ないうちは按配がいいものの、
処理対象行の明細行番号が下の方に位置してくると、
丁度カレント行が隠れてしまうようになってしまいます。
そこで、「明細番号取得」メソッドの返り値がある値以下だと「下寄せ」ふう、
ある値以上だと「上寄せ」ふうにしてみたいと思ったのです。
最悪の場合は、それぞれ「下寄せ」と「上寄せ」に設定した2種類のフォームを用意して、
明細番号如何で呼び出すフォームを切り替えるなんてやり方もありそうですが。(^^;)

(註) 昔作ったある処理では、呼び出す直前に呼び出し元の方で次のようにやっていたようですが、どうにも汎用的ではありません。

 ウィンドウ位置 取得,&hwindow,位置=(&窓始x,&窓始y)
 &始点x=#int(&窓始x)+#int(#PointToDot(4)) \
 ,&始点y=#int(&窓始y)+#int(#PointToDot(364))

23590 「ウィンドウ位置 設定,位置=」のdot値について(追記) 悲しげ 2003/11/30-23:09
記事番号23589へのコメント
ちなみに、「垂直位置」が「上寄せ」「下寄せ」であっても、
「水平位置」の方は、この場合「中央揃え」にしたいと思っていたりします。
これは次のようにするつもりです。

  呼び出し先フォームの始点X=a
  呼び出し元フォームの始点X=b
  呼び出し元フォームの幅  =c
  呼び出し先フォームの幅  =d
とした時、
  a=b+(c−d)÷2

23591 Re:「ウィンドウ位置 設定,位置=」のdot値について うにん 2003/11/30-23:18
記事番号23589へのコメント

>では、ここで入れるdot値をどう決めるか、と云うのが次なる疑問です。
>自分の環境(画面の解像度とか、個々の呼び出し元フォームの諸属性)で、

チャイルドフォームなら桐ウィンドウの相対座標なので画面解像度は関係ないと思うのですが。

>「上付け」ならこれくらいとか、「下寄せ」ならどうとか・・・、一般的
>に云えるものが有ったりすれば嬉しいです。

左右を中央で、上下が下寄せなら

変数 長整数{&桐w,&桐h,&w,&h}
ウィンドウ位置 取得, -1, サイズ=(&桐w, &桐h), クライアント領域=する
ウィンドウ位置 取得, &hwindow, サイズ=(&w, &h), クライアント領域=しない
ウィンドウ位置 設定,&hwindow,位置=((&桐w-&w)/2,&桐h-&h)

で十分だと思うのですが。
上寄せの場合y座標を0にするとぴったりなのに、下寄せの場合
ウィンドウ枠分4dot位ずらさないとスクロールバーが出てきてしまいますね。


23592 Re:「ウィンドウ位置 設定,位置=」のdot値について うにん 2003/12/01-00:35
記事番号23589へのコメント

>「オブジェクト操作」コマンドでは、フォームウィンドウの「水平・垂
>直位置の調整」を指定することはできませんよね?

というよりも、

>「フォーム呼び出し」します。

なので、コマンドの実行がそこで一時停止してしまいますから

>調整を「自動」に設定しておいた上で、フォーム開始イベントで

>とやるしかない

ことになるわけですね(^^;

>上記コマンドで云う「&始点x,&始点y」なる変数は、固有変数として別途
>宣言済みで、呼び出す直前にdot値を代入するものとします(註)。
>では、ここで入れるdot値をどう決めるか、と云うのが次なる疑問です。

さっきのは桐ウィンドウに対する位置でしたが、親ウィンドウの位置とサイズで
オフセットを加えてやればいいはずです。

モーダルだとめんどくさいのでウィンドウ作成コマンドで試してみると
変数 長整数{&x,&y,&w,&h,&子w,&子h,&wh}
ウィンドウ位置 取得, &hwindow, 位置=(&x, &y), サイズ=(&w, &h),
クライアント領域=しない
*フォーム呼び出し "ウィンドウ位置子"
ウィンドウ作成 "ウィンドウ位置子",ハンドル=&wh
ウィンドウ位置 取得, &wh, サイズ=(&子w, &子h), クライアント領域=しない
ウィンドウ位置 設定, &wh, 位置=(&x+(&w-&子w)/2,&y+&h-&子h)
でよさそうです。

23607 Re:「ウィンドウ位置 設定,位置=」のdot値について 悲しげ 2003/12/01-15:44
記事番号23592へのコメント
どもっ、うにんさん、
参考になりました。ありがとうございました。

1.実は「ウィンドウ位置 取得」コマンドの「クライアント領域」
パラメータについては、初めて見たような気がします。(^^;)
これって、V8の初期からあったでしょうか?
そもそも「クライアント領域」って何なのかも知らなかったので、
googleで検索してようやく判りました。今まで、このパラメータを
省略して来たのですが(存在すら知らなかったので当然ですが)、
それは「クライアント領域=しない」だったのですね。たまたまズレ
が生じないケースで使っていたようなのですが、知らないってことは何つーか・・・。(^^;)


2.「下寄せ」と「下付け」
>ウィンドウ位置 設定,&hwindow,位置=((&桐w-&w)/2,&桐h-&h)

これは「下寄せ」ならぬ「下付け」ですね。私が知りたかったのは
「下寄せ」の方だったのですが、でも何となく想像がつきました。
ズバリ「中央寄せ」と「下付け」の間でしょうね。


3.
>ウィンドウ位置 取得, &hwindow, サイズ=(&w, &h), クライ・・・

そうですね、これでよかったのですね。私が以前に「#PointToDot」関数を使ってあんなことをやってたのは、
フォーム内の特定のオブジェクトに重ねるためだったことを思い出しました。

以上、おかげさまで何とかできそうです。ありがとうございました。


ps:
昨夜のあの後、水平位置を「下寄せ」と「上寄せ」に設定した2種類のフォームを用意して試してみましたが、
そのやり方でも単にwfmがひとつ増えるだけで(kevは当然共用だし)、
結構いけそうな感触はあったりしました。ちなみに「上寄せ」の方は「中央寄せ」にした方が、
感じはよかったりしました。一応両方試してみます。

戻る