過去の桐井戸端BBS (桐ver.8)
15989 フォームが開いた時点で最初から指定したオブジェクトにフォーカスを設定したい 磯田 2002/05/17-10:37
いつもお世話になります。
一括とイベントを組み合わせてプログラムを組んでいます。
フォームでメニュー画面を作りそこからいろんな処理を行っているのですが、
各処理を終えてメインのメニューに戻るとき、前回実行したボタンにフォーカスが
あるように次のようにしています。
  ウインドウ作成 メニュー,ハンドル=&AHndl
  メソッド呼び出し ハンドル=&AHndl,&ABtn.フォーカス設定()
  ウインドウ会話 &AHndl,ボタン=&ABtn
  ウインドウ終了 &AHndl
ウィンドウ作成にはカーソル位置=<オブジェクト名>というのがあるのですが、
編集対象表がないために使用できません。
これはウィンドウズ会話で初期項目=<オブジェクト名>に関しても同じようです。
ところが実際にプログラムを走らせて見ると、
フォームが開いた時点では別のボタンにフォーカスがあり、
そのあと指定したボタンにフォーカスが移るのです。
何も実害はないのですが、見た目がすっきりせず、何とかならないかと考えています。
フォームが開いた時点で最初から指定したオブジェクトにフォーカスを設定する方法はないものでしょうか。
15990 Re:フォームのフォーカス初期値 ONnoji 2002/05/17-11:21
記事番号15989へのコメント
磯田さん

>ところが実際にプログラムを走らせて見ると、フォームが開いた時点では別のボタ
>ンにフォーカスがあり、そのあと指定したボタンにフォーカスが移るのです。

メニューフォーム側のコマンドボタンの属性の[表示]タブで、
[フォーカス設定可能]が "許可" または "自動" だとそうなると思います。

>フォームが開いた時点で最初から指定したオブジェクトにフォーカスを設定する方
>法はないものでしょうか。

メニューフォーム側のコマンドボタンに次のような[マウス左クリック]イベントを設定すると出来るかもしれません。

手続き定義開始 コマンドボタンオブジェクト名::マウス左クリック(…省略…)
 メソッド呼び出し &this.フォーカス設定( )
手続き定義終了

なお、一つ一つのコマンドボタンに[マウス左クリック]イベントを用意するのが面倒な場合には、
複数のコマンドボタンを任意のファミリに所属させて、そのファミリの[マウス左クリック]イベントを設定するとよいと思います。

手続き定義開始 ファミリオブジェクト名::マウス左クリック(…省略…)
 メソッド呼び出し &this.フォーカス設定( )
手続き定義終了

メニューフォーム側のコマンドボタンのフォーカスのことだろうと理解しましたが、
外していたら、すいません。
15991 Re:フォームのフォーカス初期値 磯田 2002/05/17-11:41
記事番号15990へのコメント
ONnojiさん、コメントありがとうございます。
マウスでのフォーカス移動はうまくいきましたが、
僕が気になっているのはフォームを開いた時点でのフォーカスの移動です。
フォーム開始イベントでやってもタイムラグは生じてしまいます。
15992 Re:フォームのフォーカス初期値 ONnoji 2002/05/17-11:54
記事番号15991へのコメント

>ONnojiさん、コメントありがとうございます。マウスでのフォーカス移動はうまくいきましたが、
>僕が気になっているのはフォームを開いた時点でのフォーカスの移動です。フォーム開始イベントでやっても
>タイムラグは生じてしまいます。

磯田さん、こんにちは。

やっぱり外していましたね。m(__)m

メニューから開いたフォーム側の問題ですね。
フォームを閉じる時点でフォーカスしていたオブジェクトを覚えておいて、
次にフォームを開いた時にそこへフォーカスを移すということなんでしょうか???

どうも私は一括処理は使わないので外しまくりしそうです。
ということで、失礼いたしました。m(__)m
15993 Re:フォームのフォーカス初期値 尾形 2002/05/17-12:45
記事番号15989へのコメント
>ウィンドウ作成にはカーソル位置=<オブジェクト名>というのがあるのですが、編集対
>象表がないために使用できません。これはウィンドウズ会話で初期項目=<オブジェクト
>名>に関しても同じようです。
編集対象表を設定すればいい?
という問題とも違うのでしょうか (^^;


15994 Re:フォームのフォーカス初期値 hidetake 2002/05/17-13:03
記事番号15989へのコメント
ウィンドウを非表示で作成、そして操作終わったら表示させる。
では?
ウィンドウ会話の場合は、非表示のままでも表示されるけど、
礼儀として事前に表示させてた方が良いと思うけど・・・

ウインドウ作成 メニュー,ハンドル=&AHndl,オプション=非表示
メソッド呼び出し ハンドル=&AHndl,&ABtn.フォーカス設定()
ウィンドウ位置 表示,&AHndl
ウインドウ会話 &AHndl,ボタン=&ABtn
ウインドウ終了 &AHndl


15996 Re:フォームのフォーカス初期値 ONnoji 2002/05/17-13:47
記事番号15989へのコメント
磯田さん、こんにちは。

外してばかりいるONnojiです。(^^ゞ

NULLフォームで試したのですが、
フォームが開いた時にフォーカスされるオブジェクトは、
フォーム明細部のフォーカス可能なオブジェクトで、
[タブオーダーの設定]や[オブジェクトのリスト]の上位のオブジェクトのようです。

(a)フォーカスしたいオブジェクトをフォーム明細部へ移動するか
  ※実験する分には問題ないでしょ〜。
または、
(b)フォーカスしたいオブジェクトが配置されているセクション(ヘッダ・フッタ)を止めて、
  フォーム明細部へセクションのオブジェクトを移動する

そして、[タブオーダーの設定]や[オブジェクトのリスト]でオブジェクトを最上位に移動する。

というのはいかがでしょうか?

これは、イベントも要らないし簡単ですが、NULLフォームでないとうまくいかないようです。

編集対象表を持っているフォームの場合には、
どうしてもソースに項目を指定したテキストボックスにフォーカスが取られてしまうようです。

今度も外していたら、すいません。
15997 Re:フォームのフォーカス初期値 ONnoji 2002/05/17-14:03
記事番号15996へのコメント
ONnojiさん
>これは、イベントも要らないし簡単ですが、NULLフォームでないとうまくいかないようです。
>
>編集対象表を持っているフォームの場合には、
>どうしてもソースに項目を指定したテキストボックスにフォーカスが取られてしまうようです。

その後判ったのですが、
新規にフォームを開く場合ならば編集対象表を持っているフォームでも大丈夫のようです。

ソースに項目を指定したテキストボックスに負けるのは、
表編集とフォーム編集を行ったり来たりするとか、フォーム再定義→フォーム編集の場合のようです。

※いきなりフォーム定義→フォーム編集の場合は負けないようです。
15998 Re:フォームのフォーカス初期値 磯田 2002/05/17-14:18
記事番号15994へのコメント
hidetakeさんありがとうございます。見事にうまくいきました。この非表示
オプションはこのような使い方があったのですね。またひとつ勉強になりました。
ところで
    ウィンドウ位置 表示,&AHndl
として、ウィンドウを表示させると、左上に寄ってしまいます。フォームの設定は
中央に表示するようにしてあるのですが。
表示位置を座標で指定しなければならないのでしょうか。
そうすると解像度の違うモニターで使用するときに不都合が出てしまうような気がします。
何か設定の方法があるのでしょうか。
15999 Re:フォームのフォーカス初期値 磯田 2002/05/17-14:24
記事番号15997へのコメント
ONnojiさんいろいろありがとうございます。
結局 hidetakeさんの ご指摘のようにウィンドウ作成で非表示オプションをつける方法が一番いいようです。
フォーカスを移すオブジェクトは直前に実行したコマンドボタンなのでそれを変数に入れて処理をしています。
ただあとはhidetakeさんへのコメントにも書いたようにフォームの表示位置の問題だけです。
またよいアイデアをよろしくお願いします。
16000 Re:フォームのフォーカス初期値 hidetake 2002/05/17-14:57
記事番号15998へのコメント
>ところで
>    ウィンドウ位置 表示,&AHndl
>として、ウィンドウを表示させると、左上に寄ってしまいます。フォームの設定は
>中央に表示するようにしてあるのですが。表示位置を座標で指定しなければならな
>いのでしょうか。そうすると解像度の違うモニターで使用するときに不都合が出て
>しまうような気がします。何か設定の方法があるのでしょうか。

一番手っ取り早くには

>ウィンドウ会話の場合は、非表示のまま
>でも表示されるけど、礼儀として事前に
>表示させてた方が良いと思うけど・・・

と言う事で、「ウィンドウ位置 表示,&AHndl」
を省略してみる! (^_^ゞ


細かくやるには、「ウィンドウ作成」の後で
「ウィンドウ位置 取得」と「 #ウィンドウサイズ」
等を使い、桐のサイズや開いたフォームのサイズ
から中心に描画するための位置を割り出し、
「ウィンドウ位置 設定」した後で
「ウィンドウ位置 表示,&AHndl」で表示を
戻す・・・

後は工夫してみてください。 (^^;


16002 Re:フォームのフォーカス初期値 磯田 2002/05/17-20:14
記事番号15997へのコメント
ONnojiさんいろいろアドヴァイスありがとうございます。結局
  オプション=非表示
とするだけですべてうまくいきました。
  ウィンドウ位置 表示
は書かないほうがうまくいきました。なんだか邪道のようですが、画面上は最もすっきりした形で表示されます。
これからはウィンドウ作成にはすべて  オプション=非表示  を付けたほうがいいのでしょうかね。
16003 うまくいきました 磯田 2002/05/17-20:16
記事番号16000へのコメント
hidetakeさんいろいろアドヴァイスありがとうございます。結局
  オプション=非表示
とするだけですべてうまくいきました。
  ウィンドウ位置 表示
は書かないほうがうまくいきました。なんだか邪道のようですが、画面上は最もすっきりした形で
表示されます。これからはウィンドウ作成にはすべて  オプション=非表示  を付けたほうがいいのでしょうかね。
16004 ご解決おめでとうございます。 ONnoji 2002/05/17-21:03
記事番号16002へのコメント
磯田さん、こんばんは。

> ONnojiさんいろいろアドヴァイスありがとうございます。結局
>   オプション=非表示
> とするだけですべてうまくいきました。

なるほど、解決されてよかったですね。(^^v

>   ウィンドウ位置 表示
> は書かないほうがうまくいきました。なんだか邪道のようですが、画面上は最もすっきりした形で
> 表示されます。これからはウィンドウ作成にはすべて  オプション=非表示  を付けたほうが
> いいのでしょうかね。

なんでもかんでも「オプション=非表示」を使うのちょっと思います。
今回のように格好が悪くてどうにも我慢ができないときにお使いになったらいかがでしょうか。

私の感想ですが…
今回の件はフォーカスをこっそりと移動するつもりが、
(a)フォームの描画が遅いために、見え見えになり格好がわるかったのでしょうか…ね。
※ネットワーク上のフォーム?、フォントの種類が多い?、画像をファイルから読み込んでいる?、etc.

それとも(b)一括処理から制御しているために、ワンテンポ待たされたのでしょうか…ね。
※私は一括処理をバッチ処理にしか使わないので、この辺はまったく判りません。m(__)m

というのは…、私にはワンテンポしてからフォーカスが移るという体験がありませんでしたから。
※決して記憶に自信があるわけではありませんが…(^^ゞ

いずれにせよ、ご解決おめでとうございます。
16005 Re:フォームのフォーカス初期値(ちょっと気になったので) KH 2002/05/17-21:14
記事番号15989へのコメント
磯田さん、こんばんわ。
以下がちょっと気になったものですからコメントします。

>ウィンドウ作成にはカーソル位置=<オブジェクト名>というのがあるのですが、編集対
>象表がないために使用できません。これはウィンドウズ会話で初期項目=<オブジェクト
>名>に関しても同じようです。

編集対象表が無くてもボタン名を初期位置にできます。以下は自分の一括の一部分で、
「設定」と言うコマンドボタン部分を初期位置に出来ます。

ウィンドウ作成 &wfm,位置=(0,0),サイズ=(100,100),ハンドル=&ハンドル名,
カーソル位置=@設定,オプション=非表示,編集表=しない

外していたらごめんなさい。
16008 Re:やはり外していました、ゴメンなさい。 KH 2002/05/18-09:24
記事番号16005へのコメント
磯田さん、おはようございます。
やはり外していました、申し訳ありません。

>各処理を終えてメインのメニューに戻るとき、前回実行したボタンにフォーカスが
>あるように次のようにしています。

ここを読み飛ばして欠落していました。

オブジェクト名が変数でなければいけないので、ウィンドウ作成ではやはり無理でした。余計なコメント失礼しましたm(__)m


戻る