過去の桐井戸端BBS (桐ver.9)
22499 表引きした文字列の中でカーソル位置を自動的に指定したい よご 2003/09/29-10:39
 表引きで“○○第号”という文字を入力した後(○○はいろいろあります)、号の前にカーソルが自動的に来るようにしたいのです。
入力支援クローズイベントを使えばできるかと思ったのですがうまくいきません。
コマンドの記述自体は間違っていないようで、適当なコマンドボタンから実行させたらちゃんとできたのですが、
以下のようなものです。

条件 ( #文字位置([文書番号],"号"))  メソッド呼び出し @テキスト領域_9.編集選択位置設定( #文字位置([文書番号],"号") ,0 )

こういう場合に入力支援クローズイベントを使うことが間違っているのでしょうか。
何かいい方法がありましたら教えてください。


22504 Re:表引きした文字列の中でカーソル位置指定 悲しげ 2003/09/29-15:11
記事番号22499へのコメント
どもっ、よごさん
試した訳では全くないので、外している可能性大ですが、
もしかしたら「編集選択位置設定」メソッドは「入力支援クローズ」イベント
ではうまく動かないのかもしれません。
「入力支援クローズ」イベントのヘルプによれば、

>このイベントが発生した後に、[編集文字列変更]イベントが発生します。
>[入力支援ボタン]の[自動終了]属性を ON にしている[入力支援ボタン]では、
>[入力後]イベントと[ソース値更新]イベントも発生します。

と云うことですから、例えば引き続き発生するであろう「入力後」イベント
あたりで試してみてはいかがでしょう?

22505 Re:表引きした文字列の中でカーソル位置指定 うにん 2003/09/29-15:46
記事番号22504へのコメント

>試した訳では全くないので、外している可能性大ですが、
>もしかしたら「編集選択位置設定」メソッドは「入力支援クローズ」イベント
>ではうまく動かないのかもしれません。
>「入力支援クローズ」イベントのヘルプによれば、

使用目的が「[入力支援ボタン]の機能によって入力された値を、[テキスト]オブジェクトに設定する前に加工します。 」なので、
「入力支援クローズ」の段階ではまだ親のオブジェクトの値は元のままなのでしょう。

>と云うことですから、例えば引き続き発生するであろう「入力後」イベント
>あたりで試してみてはいかがでしょう?

「このイベントが発生した後に、[編集文字列変更]イベントが発生します。」
なので、そこでやる方が普通では?
ただ、このイベントは手入力している間も随時発生するらしいので、
「入力支援クローズ」イベントでフラグを立てておいて最初の1回だけ
「編集選択位置設定」する必要がありそうです。
22506 Re:表引きした文字列の中でカーソル位置指定 ド・モ・ONnoji 2003/09/29-16:42
記事番号22505へのコメント

>「このイベントが発生した後に、[編集文字列変更]イベントが発生します。」
>なので、そこでやる方が普通では?
>ただ、このイベントは手入力している間も随時発生するらしいので、
>「入力支援クローズ」イベントでフラグを立てておいて最初の1回だけ
>「編集選択位置設定」する必要がありそうです。

よごさん、こんにちは。

うにんさん、横レス失礼します。

うにんさんのおっしゃるように、
トレースウィンドウで確認すると、
[入力支援クローズ]イベントの次に、
[編集文字列変更]イベントが発生しているようです。

私も試していませんが…(^^ゞ

┌when "t〒::入力前("100-0000")"を実行開始しました
└end
 
┌when "入力支援ボタン_12::入力支援オープン( )"を実行開始しました
└end
 
┌when "入力支援ボタン_12::入力支援クローズ("100-0000",1)"を実行開始しました

│ ここでフラグを立てる

└end
 
┌when "t〒::編集文字列変更( )"を実行開始しました

│┌if ( #文字位置([文書番号],"号").and フラグが立っている ) 
││ メソッド呼び出し ….編集選択位置設定( ・… )
│└end

└end

こんな感じでうまくいくといいかカモ…(^^ゞ

しかし、エディタ内のことなので、
はたして、項目名:[文書番号]を指定してうまくいくか?です。

タラレバの話ですいません。

22507 Re:表引きした文字列の中でカーソル位置指定 ド・モ・ONnoji 2003/09/29-17:00
記事番号22506へのコメント
>しかし、エディタ内のことなので、
>はたして、項目名:[文書番号]を指定してうまくいくか?です。

[入力支援クローズ]イベントハンドラには便利な引数がありますね。

手続き定義開始 入力支援ボタン_12::入力支援クローズ(参照 文字列 &入力文字列,長整数 &モード)

手続き定義終了

という具合に、引数:&入力文字列 を使えばいいかもしれません。

× 条件 ( #文字位置([文書番号],"号")) の代わりに

○ 条件 ( #文字位置(&入力文字列,"号")) を使うのはどうでしょう。

もしも、[入力支援クローズ]イベントで、
やっぱり[イベント編集選択位置設定]メソッドが駄目だったら、
なんとかして[編集文字列変更]イベントまで引っ張ってみるしかないかもしれませんね。

タラレバの話ですいません。



22508 Re:表引きした文字列の中でカーソル位置指定 よご 2003/09/29-17:01
記事番号22505へのコメント
 悲しげさん、うにんさんありがとうございます。
入力後イベントもソース値更新イベントもフォーカス取得イベントもやってみましたがうまくいかず、
入力支援クローズを見つけてこれならと思ったのですが… 
後は編集文字列変更イベントしかないかなあと思っていたところですが、ちょっと難しくてよく分かりません。
一括処理ヘルプを見てもこれに限って具体例が載ってないんですよ。
正式にプログラムを勉強したわけでもないのでフラグを立てるというのもどういうことなのかよく分からないし。
簡単な例があれば何とかやれると思うんで、申し訳ありませんが何か見せていただけないでしょうか。
 ただあの後で気がついたことですが、“第号”が入っている状態で入力支援ボタンを押し、
キャンセルすると“号”の前にカーソルが来たんですよ。キャンセルだと入力支援クローズイベントが効くっていうのは
どういうことなんでしょうね。

22511 Re:表引きした文字列の中でカーソル位置指定 うにん 2003/09/29-20:16
記事番号22508へのコメント
> ただあの後で気がついたことですが、“第号”が入っている状態で入力支援ボタンを押
>し、キャンセルすると“号”の前にカーソルが来たんですよ。キャンセルだと入力支援ク
>ローズイベントが効くっていうのはどういうことなんでしょうね。

キャンセルだと効いてるんでなく、クローズイベントの時点では項目値は元々入ってる文字列のままだということです。
[編集文字列変更]イベントの段階で#文字位置(&編集文字列,"号")を使えばいいでしょう。
項目値は入力後よりさらに後のソース値更新イベントでないと元の値のままです。

と思ったら、[編集文字列変更]イベントは引数がないんですね^^;
ちょっとだけ面倒ですね。こんなんでできました。
&秒がフラグ用の変数です。

手続き定義開始 入力支援ボタン_6::入力支援オープン()
 &秒=0
手続き定義終了

手続き定義開始 入力支援ボタン_6::入力支援クローズ(参照 文字列 &入力文字列,長整数 &モード)
cond (&モード=1) &秒=1
手続き定義終了

手続き定義開始 tコード::編集文字列変更()
if (&秒=1)
 method 戻り値=&元号年,@tコード.編集文字列取得(&STR)
 if (&元号年>0 .and #文字位置(&STR,"号"))
  メソッド呼び出し @tコード.編集選択位置設定(#文字位置(&STR,"号"),0)
 end
end
手続き定義終了

22531 Re:表引きした文字列の中でカーソル位置指定 よご 2003/10/01-09:18
記事番号22511へのコメント
 うにんさんありがとうございました。お陰様でうまくいきました。
ただ、号の前にカーソルを移動させたかったのはそこへ直ちに番号を打てるようにということだったのですが、
確定させた後で間違いに気づいた場合、1字訂正するたびにカーソルが移動してしまいました(^^;)。
こりゃ最初のアイデアから間違ってたかなと思いましたが、最後に &秒=0 を追加したらうまくいきました。

 最初ちょっととまどったのが“method”という部分で、一括処理ヘルプ見てもコマンド入力時にも、
英字のコマンドはif関係しか見た憶えがなかったのでなんだこりゃと思いましたが、
メソッド呼び出しと同じなんですよね。
これってVBAとかに慣れた人のための裏コマンドみたいなものなんでしょうか。

 それと[編集文字列変更]イベントは[編集文字列取得]メソッドとセットでないと使えないのかと思ったのですが、
そういうわけでもないのですね。
今回の場合は表引きした文字列を&STRに代入できればそれでいいので、ド・モ・ONnojiさんが
教えてくれた[入力支援クローズ]イベントの&入力文字列が使えそうだなと思ってやってみたら、
[編集文字列取得]メソッドなしでも一応できました。

手続き定義開始 入力支援ボタン_66::入力支援クローズ(参照 文字列 &入力文字列,長整数 &モード)
cond (&モード=1) &秒=1
&STR=&入力文字列
手続き定義終了

手続き定義開始 テキスト領域_9::編集文字列変更()
条件 (&秒=1) メソッド呼び出し @テキスト領域_9.編集選択位置設定(#文字位置(&STR,"号"),0)
&秒=0
手続き定義終了

これでも一応希望するような動作はしていますが、何か問題があったら教えてください。


22533 Re:表引きした文字列の中でカーソル位置指定 よご 2003/10/01-09:32
記事番号22507へのコメント
ド・モ・ONnojiさんこんにちは。私が22508をもたもた書いているうちに22506・22607が投稿されていました。
すぐに返事できなくてすみません。あれからやってみたのですがやはり&入力文字列を使っても
[入力支援クローズ]イベントの中ではうまくいかず、おっしゃるように[編集文字列変更]イベントでやるしかないようだなと
思っていましたら、うにんさんから教えていただいて解決しました。ありがとうございました。
またなにかありましたらよろしくお願いします。


22534 Re:表引きした文字列の中でカーソル位置指定 アックン 2003/10/01-10:28
記事番号22499へのコメント
よごさん、こんにちは。
以下は、入力支援ボタンを付けないで、つまり入力支援クローズイベントを使わない方法です。
やっている内容は、帳簿の摘要欄に「○○○ 月分」と表引きして、「月」の前にカーソルを位置させます。
適当に変更して試してください。

方法1. 編集対象表の 項目属性>表引き(タブ)>「自動終了する」にチェックマークがない場合

proc t摘要::編集文字列変更()
   var 整数 { &pos } ,\
      文字列{ &txt , &focus }
   method @フォーム.フォーカスオブジェクト取得 ( &focus )
   method &focus.編集文字列取得 ( &txt )
   if( #set( pos , #文字位置 ( &txt , " 月" ) ) )
     method &this . 編集選択位置設定 ( &pos+1 , 0 )
   end
end

方法2. 「自動終了する」にチェックマークがある場合
こちらは、表引き後にカーソルが、
文字列の先頭から指定位置に移動するのがちらっとわかるかも。(^^;dahaha...

名札 メイン
 var 整数 { &pos , &count=0 } ,\
    文字列{ &focus , &txt }

proc t摘要::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
   if( &モード .and &count=0 )
     if( #set( pos , #文字位置 ( &編集文字列 , " 月" ) ) )
       method &this . 編集選択位置設定 ( &pos+1 , 0 )
       &入力継続 = 1
       &count  = 1
     else
       &入力継続 = 1
     &count  = 1
     end
   else
       &入力継続 = 0
       &count  = 0
   end
end

で、「自動終了する」のチェック有無にかかわらず共通に使えるイベントってのは、
ちっとも考えたことないんで、すみません。
                        アックン(=^・^=)


22535 Re:表引きした文字列の中でカーソル位置指定 アックン 2003/10/01-10:32
記事番号22534へのコメント
>   method @フォーム.フォーカスオブジェクト取得 ( &focus )

実際にイベントを書くときは、「フォーム」は半角にしてください。
22538 Re:表引きした文字列の中でカーソル位置指定 うにん 2003/10/01-12:00
記事番号22531へのコメント
>最後に &秒=0 を追加したらうまくいきました。

あ、フラグのクリアですよね。すっかり忘れてました。

> 最初ちょっととまどったのが“method”という部分で、一括処理ヘルプ見てもコマンド入力時にも、英字のコマンドはif
>関係しか見た憶えがなかったのでなんだこりゃと思いましたが、メソッド呼び出しと同じなんですよね。これってVBAとか
>に慣れた人のための裏コマンドみたいなものなんでしょうか。

裏というわけではなく、別名です。

>手続き定義開始 入力支援ボタン_66::入力支援クローズ(参照 文字列 &入力文字列,長整数 &モード)
>cond (&モード=1) &秒=1
>&STR=&入力文字列

なるほど、どっちみちここを通るのでこの時点で保存しておけば楽ですね。


戻る