過去の桐井戸端BBS (桐ver.9)
23486 フォーム起動時に右端に横スクロールさせた状態で表示したい アックン 2003/11/25-18:55
ウィンドウの枠内に収まらないほど幅の長いフォームがあります。
起動すると、当然、一覧表オブジェクトの右端の方が見えません。
フォーム起動当初に、いちばん右端に横スクロールしたのと同様な状態で表示させる方法を教えてください。
フォーム開始イベント内で、一覧表の右端のテキストオブジェクトにフォーカスをあてただけでは、表示しないんですね。
マニュアル操作で横スクロールしたら、フォーカスはちゃんとあたっています。
23488 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには うにん 2003/11/25-21:09
記事番号23486へのコメント

>フォーム起動当初に、いちばん右端に横スクロールしたのと同様な状態で表示
>させる方法を教えてください。

これでいいはずなんですが、なぜか右端にすこしスキマができてしまいます。

変数宣言 長整数{ &終了状態, &桐size[2], &size[2]}
&終了状態 = #ウィンドウサイズ(-2, "桐size", 1)
&終了状態 = #ウィンドウサイズ(&hwindow, "size" , 1)
ウィンドウ位置 設定, &hwindow, 位置=(&桐size[1]-&size[1], 0)

#ウィンドウサイズ()がちょっと変なんですよね。
3つ目のパラメータで全体と作業領域を指定できるのに
1つ目のパラメータが桐ウィンドウ全体と桐ウィンドウの作業領域で違う値にするってところが。

あ、定義モード時に右端にツールバーを表示していたのでその分でした。
編集モードに切替えたときにフォーム開始イベントが発生するのですが、
ツールバーが消える前にサイズを取得しているようです。

23489 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには ONnoji 2003/11/25-21:17
記事番号23486へのコメント
アックンさん、こんばんは。

フォームの属性で[開始時実行コマンド]で任意のコマンドボタンを指定して、
コマンドボタンの機能でフォーカスを移動させるだけで出来ませんか?

疑問形なのは…当方は試しておりませんという意味であります。(^^ゞ

あるいは、タイマーイベントでフォーカスを移動するとか…???
23494 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには 通りすがり 2003/11/26-00:38
記事番号23486へのコメント
ONnojさんも指摘しておりますが、
コマンドボタンに
機能名:フォーカス移動 パラメーター:[飛ばしたいテキスト名]
を設定し、
フォームの実行コマンド、開始時 に、このコマンドボタンを設定すればいいのでは?
こっちで試したら、きちんと右端に移動しましたが?

23507 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには アックン 2003/11/26-13:08
記事番号23494へのコメント
うにんさん、ONnojiさん、通りすがりさん、お忙しい中、回答ありがとうございます。
テスト用のサンプルを保管BBSにアップしました。
みなさんの書き込みのおかげで、ようやく原因を絞り込めました。
「ウィンドウ位置 設定」コマンドがじゃまするんですね。
このコマンドがフォーム開始イベントにあると、コマンドボタンまたはフォーム開始イベントで
フォーカス設定しても、結局は”左端”(スプレッドシートで言えば HOME)を表示します。
そこで、マニュアル操作で右に横スクロールさせると、フォーカス自体は右端にあたっています。
「ウィンドウ位置」と右端表示を両立させることができるでしょうか。

・テスト用のイベント
proc フォーム::フォーム開始(長整数 &表番号)
 method @フォーム.描画禁止(1)

 ジャンプ 行番号=T
 method @t科目月_1.フォーカス設定()

 var 長整数{ &size[2] , &終了状態=#ウィンドウサイズ( -2, "size" , 1 ) }
 ウィンドウ位置 設定,1,位置=(0,0),サイズ=( &size[1] - 4, &size[2] - 4 )

/* ↓「ウィンドウ位置」の前後どちらかでテストしました。 */
* ジャンプ 行番号=T
* method @t科目月_1.フォーカス設定()

 method @フォーム.描画禁止(0)
end

・テスト用フォーム:コマンドボタン
機能名      機能パラメータリスト
フォーカス移動  "t合計_1" (←一覧表の右端のテキストオブジェクト)

なお、改変してアップしてくださっても結構です。よろしくお願いします。

23510 Re:両立させることができるでしょうか ONnoji 2003/11/26-13:54
記事番号23507へのコメント
>自体は右端にあたっています。
>「ウィンドウ位置」と右端表示を両立させることができるでしょうか。

アックンさん、こんにちは。

[フォーム開始]イベント内で自身のウィンドウの位置を変更する場合には、
両立しない場合があると思います。

両立しないのはフォーム属性で[フォームの幅]が自動の場合だったと思います。

[開始時実行コマンド]が実行されるタイミングは、
[トレース出力ウィンドウ]でトレースすれば判りますよ。(^^ゞ

すべてに対して一番確実な方法は、

・[タイマー]イベントでコマンドボタンを[実行]メソッドで実行する
 または
・[タイマー]イベントで一般手続きを呼び出す

のどちらかだと思います。
※この場合のタイマーで実行する内容は一回しか実行しないようにしますけれど。

これは私の拙作で多いにハマッタ所なので間違えないと思いますが…たぶんね。(^^ゞ

※なお、56.lzh は拝見しておりません。


23512 Re:両立させることができるでしょうか ONnoji 2003/11/26-14:11
記事番号23510へのコメント
間違えました。

× 両立しないのはフォーム属性で[フォームの幅]が自動の場合だったと思います。

○ 両立しないのはフォーム属性で[ウィンドウのサイズ]が「自動」の場合だったと思います。

>[開始時実行コマンド]が実行されるタイミングは、
>[トレース出力ウィンドウ]でトレースすれば判りますよ。(^^ゞ

アックンさん、↑がポイントですよ。

ひょっとして…あっとおどろ〜く、タメゴロ〜〜状態になるかもしれません。(^^ゞ

23515 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには うにん 2003/11/26-15:26
記事番号23507へのコメント

>「ウィンドウ位置 設定」コマンドがじゃまするんですね。
>このコマンドがフォーム開始イベントにあると、コマンドボタンまたはフォーム開始
>イベントでフォーカス設定しても、結局は”左端”(スプレッドシートで言えば HOME
>)を表示します。そこで、マニュアル操作で右に横スクロールさせると、フォーカス
>自体は右端にあたっています。
>「ウィンドウ位置」と右端表示を両立させることができるでしょうか。
>
>・テスト用のイベント
>proc フォーム::フォーム開始(長整数 &表番号)
> method @フォーム.描画禁止(1)
>
> ジャンプ 行番号=T
> method @t科目月_1.フォーカス設定()
>
> var 長整数{ &size[2] , &終了状態=#ウィンドウサイズ( -2, "size" , 1 ) }
> ウィンドウ位置 設定,1,位置=(0,0),サイズ=( &size[1] - 4, &size[2] - 4 )

じゃまするというより、位置=(0,0)なんだから左端に表示するのが当然と思いますが?
右と左のどっちに表示したいんでしょうか^^;
右にしたければ私の例のように位置を0,0でなく右にあった数値にすれば。

23519 Re:フォーカスを指定するオブジェクト名が正しくないようです。 ONnoji 2003/11/26-17:14
記事番号23512へのコメント
アックンさん、こんにちは。

コマンドボタン b_1 でフォーカスを指定するオブジェクト名が正しくないようです。

× t合計_1

○ t科目月_1 ( それとも? t合計 )

ところで、b_1 の機能名に[手続き実行]、機能パラメータリストに test を組み込んで見ました。

*-------------------------------------------------*
名札 メイン
 
 *
 
proc フォーム::フォーム開始(長整数 &表番号)
 method @フォーム.描画禁止(1)
 
 ジャンプ 行番号=T
 method @t科目月_1.フォーカス設定()
 
 var 長整数{ &size[2] , &終了状態=#ウィンドウサイズ( -2, "size" , 1 ) }
 ウィンドウ位置 設定, 1, 位置=( 0, 0 ), サイズ=( &size[1] - 4, &size[2] - 4 )
 
 * ジャンプ 行番号=T
 * method @t科目月_1.フォーカス設定()
 
 method @フォーム.描画禁止(0)
end

手続き定義開始 test()
 トレース出力 "私は開始時実行コマンド"
手続き定義終了
*-------------------------------------------------*


それで、トレースすると次のようになりますよ。
したがってタイマーイベントで b_1 を実行するなどの方がよい結果になりますよ。

■トレースの内容 桐ver.9

 "test20031126.kev"を一括処理実行で開きました
 
┌when メイン処理を実行開始しました
└end
 
┌when "フォーム::フォーム開始(1)"を実行開始しました

│┌when コマンドボタン呼出し手続き"test( )"を実行開始しました
││
││┌when "test( )"を実行開始しました
│││
│││ :私は開始時実行コマンド
│││
││└end
││
│└end

└end

<追伸>

(1)フォーム編集→(2)表編集→(3)フォーム編集と遷移した場合には、
3の時点でちゃんと動くはずですよ。でもこれでは意味がないですね。


23523 Re:トレースを見比べた方が分かりやすいですね ONnoji 2003/11/26-17:29
記事番号23519へのコメント
アックンさん、こんにちは。

[フォーム開始]イベントで[ウィンドウ位置]コマンドを、
使う場合と使わない場合のトレースを見比べた方が分かりやすいですね。

■[フォーム開始]イベントで[ウィンドウ位置]コマンドを使う場合

 "test20031126.kev"を一括処理実行で開きました
 
┌when メイン処理を実行開始しました
└end
 
┌when "フォーム::フォーム開始(1)"を実行開始しました

│┌when コマンドボタン呼出し手続き"test( )"を実行開始しました
││
││┌when "test( )"を実行開始しました
│││
│││ :私は開始時実行コマンド
│││
││└end
││
│└end

└end


■[フォーム開始]イベントで[ウィンドウ位置]コマンドを使わない場合


 "test20031126.kev"を一括処理実行で開きました
 
┌when メイン処理を実行開始しました
└end
 
┌when "フォーム::フォーム開始(1)"を実行開始しました
└end
 
┌when コマンドボタン呼出し手続き"test( )"を実行開始しました

│┌when "test( )"を実行開始しました
││
││ :私は開始時実行コマンド
││
│└end

└end

ね!、動きが違うでしょう〜。(^^ゞ


23530 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには アックン 2003/11/26-19:46
記事番号23515へのコメント
まとめレスにて長文失礼します。
先に補完BBSにアップしたフォームに一部ミスがあったので、再度アップしました。
Windows98SE ,桐v9sp1で動作確認してます。

訂正個所:コマンドボタン b_1 の機能パラメータリスト:t科目月_1 が正しいです。
他にもイベント内容若干変更あります。

うにんさん、ウィンドウ右端を作業領域の右端に寄せるわけですね。
ぼくの希望は、フォームのウィンドウ位置の基点を、(0,0) にしたいんです。(^^;
(桐ウィンドウは常時、1024x768画面いっぱいに広げてます。)
最後に動作報告しております。

ONnojiさん、ミスをご指摘くださってありがとうございました。再度アップしました。ご提案いただいているタイマーイベントですが、
私の遅いマシンと速い機種では何か若干の違いが出るんじゃなかろうかと思えて、
これは最後の手段にしておこうと思い、最初の質問に至った次第です。
トレースはたいへん参考になります。どうやら、このあたりに曲者(くせもの)が潜んでいるような。
なお、フォームはチャイルド、「ウィンドウのサイズ」は「フォームのサイズ」で、この点は前回からの変更はないです。

以下、動作報告です。>ALL
1.コマンドボタンを実行コマンド開始時に指定して、
「ウィンドウ位置 設定」コマンドをコメントアウトした場合。
ちゃんと右端を表示します。
フォームのウィンドウを作業領域いっぱいに広げられないのが難点です。

2.method @b_1.実行() を生かして、
「ウィンドウ位置 設定」コマンドをコメントアウトした場合。
ちゃんと右端を表示します。
フォームのウィンドウを作業領域いっぱいに広げられないのが難点です。

3.コマンドボタンを実行コマンド開始時に指定して、
「ウィンドウ位置 設定」コマンドをコメントアウトしない場合。
起動方法によって、動作にムラがあります。
ファイルパレットまたは、メニュー→ファイル→開く で起動すると、右端を表示しません。
フォーム定義画面から「編集へ」ボタン(アイコン)で起動すると、ちゃんと右端を表示します。

4.うにんさんの方法を使った場合。
ウィンドウ右端を作業領域の右に寄せて、さらにフォーカスを右端のオブジェクトにあてるのですね。
きちんと動作したり、ウィンドウ位置が左端になったり、左寄せくらいの位置になったりと、動作が不安定です。
ぼくの環境のせいなのか、「ウィンドウ位置」を使うせいなのか、まだはっきりわかりません。

フォーム開始イベント内容
変数宣言 長整数{ &終了状態, &桐size[2], &size[2]}
&終了状態 = #ウィンドウサイズ(-2, "桐size", 1)
&終了状態 = #ウィンドウサイズ(&hwindow, "size" , 1)
ウィンドウ位置 設定, &hwindow, 位置=(&桐size[1]-&size[1], 0)
ジャンプ 行番号=T
method @t科目月_1.フォーカス設定()

5.以上に共通のことで、動作がおかしな点。
フォームのウィンドウを、作業領域いっぱいに広げた状態にしたくて、#ウィンドウサイズ の関数ヘルプの使用例を使っています。
が、初回アップ後に気づいたのですが、高さがフォームの初期値のままです。(明細部の繰り返し数の定義のまま。)
起動時にいったん高さが広がって、すぐに縮んでしまうのが、はっきり目に見えます。(ぼくのマシンが遅いから見えるんですねー。
いやはや。(^^;)
そこで、テスト用でなくて実際使用のフォームを試したところ、自作メニューのウィンドウ作成コマンドでフォームを開くと、
ちゃんといっぱいに拡がるものの、wfmを単独で起動すると、高さが初期値のままです。
幅はどちらでの方法でも、めいっぱい広がっています。
なお、ウィンドウ作成コマンドは、ウィンドウ位置ならびにサイズの指定をしていません。

なんだか、だんだんどつぼにはまっていくような・・・・。(^^;
これを書いている最中に、桐9-2004が届きました。まだ開封していません。
23532 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには うにん 2003/11/26-21:06
記事番号23530へのコメント

>うにんさん、ウィンドウ右端を作業領域の右端に寄せるわけですね。
>ぼくの希望は、フォームのウィンドウ位置の基点を、(0,0) にしたいんです。(^^;

あ、わかった!ウィンドウ自体でなく中身をスクロールしたかったのですね。
中身より小さいウィンドウって使ったことなかったので勘違いしてました。
(スクロールは常に桐ウィンドウの方でしてます)

>1.コマンドボタンを実行コマンド開始時に指定して、
>「ウィンドウ位置 設定」コマンドをコメントアウトした場合。
>ちゃんと右端を表示します。
>フォームのウィンドウを作業領域いっぱいに広げられないのが難点です。

そんな要望は初耳ですが(^^;
それならウィンドウの位置は指定しなくていいので
ウィンドウ位置 「設定」でなく「最大化」を使うべきでは?
んで右のオブジェクトにフォーカス設定で中身をスクロールする。

23534 Re:朦朧とした記憶を手繰ったところ… ONnoji 2003/11/26-21:23
記事番号23523へのコメント
アックンさん、こんばんは。

>× 両立しないのはフォーム属性で[フォームの幅]が自動の場合だったと思います。
>○ 両立しないのはフォーム属性で[ウィンドウのサイズ]が「自動」の場合だったと思
います。

昔にことなのでこの辺の記憶があいまいでして、
桐ver.8と桐ver.9を行ったり来たりしていたもので…
朦朧とした記憶を手繰ったところ…
両立するのはフォーム属性で[ウィンドウのサイズ]が「最大化」の場合だったと…、
しかし、桐ver.8の場合だけだったのかもしれません。

いずれにしても、[フォーム開始]イベントは鬼門です。

[ウィンドウ位置]コマンドを使うと…思いもよらぬ結果になりますね。

一番確かなのは[タイマー]イベントです。(^^v

あくまでも私の場合ですが・・・
[フォーム開始]イベントで[ウィンドウ位置]コマンドを使う場合には、
[開始時実行コマンド]のプロパティを取得しておき、
プロパティに内容を空にして、[タイマー]イベントにて実行( )メソッドを使っています。

また、更新モード設定(2)などもいわく付きなので、
これはnullフォームの時だけにして、
編集対象表があるフォームでは、
[開始時実行コマンド]で指定したコマンドボタンで、
更新モードを変更しています。

それでは失礼します(@^^)/~~~
23537 Re:思い出したような… ONnoji 2003/11/26-22:20
記事番号23534へのコメント
アックンさん、こんばんは。

>両立するのはフォーム属性で[ウィンドウのサイズ]が「最大化」の場合だったと…、
>しかし、桐ver.8の場合だけだったのかもしれません。

うにんさんのコメントで思い出したような…

同じ最大化でも…
[ウィンドウ位置 最大化]コマンドの方だったような気がしてきました。

それでは失礼します(@^^)/~~~

23540 Re:フォーム起動時に、右端に横スクロールさせた状態で表示するには アックン 2003/11/27-10:48
記事番号23532へのコメント
うにんさん、ONnojiさん、ぼくのわがままにお付き合いいただいて、どうもすみません。
「ウィンドウ位置 最大化」も試しましたが、なぜか最大化しません。
希望としては、最大化はしたくないんです。
現在は最大化ではなく、作業領域いっぱいにウィンドウを広げています。
テスト用フォームはなぜか広がらないんですけど。
複数のフォームウィンドウを任意の大きさで位置をずらして同時に開くこともしており、
そういうときにもフォーム右端表示をしたいので、そのテクニックを身につけたいのです。
昨日の報告にあるように、どうも動きが不定ですし、タイマー使うしかないかもしれません。
その前に、Winodws 他バージョンの機種で追試して、動作を検証してみるつもりです。
いったんここでこの件終えて、またご報告できるよう、試行してみます。
うにんさん、ONnojiさん、通りすがりさん、どうもありがとうございました。

戻る