Eat to live, and not live to eat. -Benjamin Franklin
〓いろんなものの置き場です。〓
純志のページ 更新日   

テキストオブジェクトをイベントで制御する


テキストオブジェクトでの入力を制御する
イベント

  1. 入力前

    入力前にテキストオブジェクトに表示させておく文字列などをこのイベントで

  2. 編集開始

    編集開始時の文字カーソルの位置と、文字列の範囲選択を設定するために使用。

  3. 編集文字列変更

    入力が始まって、編集中の文字列が変更されるたびに繰り返し発生する
    このイベントハンドラの中で、以下のメソッドを使えば変更された文字列を確認できる

  4. メソッド 編集文字列取得

    編集文字列を変数に取得する

  5. メソッド 編集選択位置取得

    文字カーソル位置と範囲選択されている文字列を変数に取得する

  6. 入力後

    入力が終わる(エンターキーを押す)と発生する。この時点ではソースはまだ更新されていない。
    &編集文字列の値をチェックすることで、再入力させることや(&入力継続="1"を設定)、文字列を変更することができる
    このイベントハンドラが終了すると、&編集文字列の値がオブジェクトのソースに代入される

  7. ソース値更新

    ソースの値が更新されたときに発生する
    このハンドラの中で、次にフォーカスさせるオブジェクトや次に実行させる手続きなどを指定するとよい

以上を図式的に書けば、1→2→3→6→7の順に発生するイベントのなかで、3→6の間に以下のようなメソッドを使って入力中の文字をコントロールできる。

編集選択位置取得;上で示した
編集選択位置設定;文字カーソル位置を変更して、指定された文字数分を範囲選択する
編集選択文字列置換;編集選択位置設定で範囲選択した文字列を別の文字に置き換える
編集文字列取得;上で示した
編集文字列設定;すべての編集文字列を別の文字に置き換える
編集文字列長;編集文字列の文字数を変数に取得する

テキストオブジェクトで入力制御 入力支援ボタン

  1. 入力支援オープン

    入力支援ボタンでの操作が始まる前に発生する。この中でメソッド「編集文字列取得」が使える。

  2. 入力支援クローズ

    入力支援ボタンでの操作が終了して、親のテキストオブジェクトの操作に戻る前に発生する。

入力支援オープンで、親テキストボックスの文字列を取得できる。
入力支援クローズで、組み込み変数「&入力文字列」を変更することができる。

「入力後、再計算」

  1. 入力後

    このイベントハンドラが終了すると、&編集文字列の値がオブジェクトのソースに代入される。

  2. 「入力後、再計算」にチェック

    「項目計算式」がある項目、またはソースに変数を使った項目は、行の入力が終わった時点で更新される。
    しかしここをチェックすると、この項目の入力が終わった時点で行全体が再計算される。

  3. 入力後の後にソース値更新イベントが続くが、今回は必要ない。

桐の「表示モード」と「訂正モード」

  1. 表示モード
  2. 編集モード

    a. 行追加
    b. 行挿入
    c. 行訂正
    d. 項目訂正

    • 行追加

      :最後に新規行を追加する
      :実行後は終端行に移動する
      :終了状態 = 〈変数名〉

    • 行挿入

      :処理対象行の直前に新規行を追加する
      :表を専有状態で開いていないと実行できない
      :実行後は処理対象行のまま(変わらない)

    • 行訂正

      :行追加、行挿入、いずれでも行訂正に移行する
      :表示モードに切り替えないと、この状態を終了できない
      :入力後、再計算をONにすると、この項目の入力が終わるとレコード全体を再計算する

    • 項目訂正

      :既存レコードの1項目だけを編集する時のモード
      :1項目の訂正が終了すると、自動的に表示モードに戻る
      :訂正モードをONにすると、行訂正になる

    • メソッド 更新モード取得(〈変数名〉)で、変数に次の番号が挿入される

      0.表示モード
      2.訂正モード
      4.行挿入モード
      6.行追加モード
      8.項目訂正モード(レコード更新を伴わない訂正も含む)

「更新モード取得」と「更新モード設定」

 For 1. 更新モード取得と更新モード設定の手続きを用意する桐 イベント

proc 表示0 (参照 整数 &mode)
    メソッド呼び出し @フォーム.更新モード取得(&mode)
    cond (&mode>0) メソッド呼び出し @フォーム.更新モード設定(0)
end
proc 表示1 (参照 整数 &mode)
    メソッド呼び出し @フォーム.更新モード取得(&mode)
    cond (&mode>0) メソッド呼び出し @フォーム.更新モード設定(2)
end
proc 表示2 (整数 &mode)
    メソッド呼び出し @フォーム.更新モード設定(&mode)
end

 For 2. 表示0の参照変数を&実行リターンで受けて表示2で設定する桐 イベント

proc 拡大()
   var 文字列 {&focus}
   call 表示0(&実行リターン)
   メソッド呼び出し @フォーム.フォーカスオブジェクト取得( &focus )
        object &平均値 = @tContents_2.画面表示
           if (&平均値=0)
              object @tContents_2.画面表示=1, @cmd拡大{標題="戻す", 背景色="薄紅色", ヒントテキスト="元に戻します"}
              cond (&focus="tContents") メソッド呼び出し @tContents_2.フォーカス設定()
           else
              cond (&focus="tContents_2") メソッド呼び出し @tContents.フォーカス設定()
              object @tContents_2.画面表示=0, @cmd拡大{標題="拡大", 背景色="月見草色", ヒントテキスト="詳細部分を大きくします"}
           end
    call 表示2(&実行リターン)
end

 For 3. カーソル位置を行末に設定する桐 メソッド

proc tContents_2::編集開始()
   メソッド呼び出し @tContents_2.編集選択位置設定( 1 ,-1 )
   メソッド呼び出し @tContents_2.編集選択位置設定( 0 ,0 )
end
proc tContents::編集開始()
   メソッド呼び出し @tContents.編集選択位置設定( 1 ,-1 )
   メソッド呼び出し @tContents.編集選択位置設定( 0 ,0 )
end

初期カーソル位置設定 「表」「ウィンドウ作成」「フォーム形式編集」

 For 1. フォームを開いたとき カーソルをどこに置くか桐 一括処理

 表 "morningstar.tbx", モード=共有更新, リトライ=しない, 終了状態=&実行リターン
 cond (&実行リターン<>1) 実行終了 破棄, 表題="処理を中止します", メッセージ="表を開くことができませんでした。終了します。"
 ウィンドウ作成 "MStar.wfx", ハンドル=&hWnd, 編集表=する
名札 再開
 フォーム形式編集 更新=許可, 許可作業=*, 画面消去=しない, 起動時ボタン=有効, 終了状態=&実行リターン

  1. 表 : カーソル位置設定はない
  2. ウィンドウ作成 : カーソル位置設定がある(下) 「フォーム形式編集」で効かなくされる
     カーソル位置 = <項目名>|<項目番号>|<オブジェクト名>|先頭|最終
  3. フォーム開始イベント メソッド呼び出し オブジェクト名.フォーカス設定()  フォーム形式編集で上書き
    [フォーム開始]イベントは、表を開いた後、かつフォームウィンドウを開く前に発生するイベントです。
  4. フォーム形式編集 : 以下の設定のいずれかをする
    • 初期項目 = <項目名>|<項目番号>
    • 「このパラメータを省略すると、現在のフォーカス位置を引き継ぎます」
    • 起動時ボタン = 無効|有効
    • 「フォーム編集に入る前に、フォームに定義されている起動時実行コマンドボタンを実行するかどうか指定します」
  5. 起動時ボタン=有効 を選択して、起動時ボタン(フォームのオブジェクト属性)は以下の設定
  6. ※ 実行コマンド:開始時:cmdFocus
  7. 4. と 5. の設定でうまくいく

メソッド呼び出し「明細番号設定」

 For 1. 伝票フォームで処理対象行の表示位置を先頭に桐 メソッド

proc 面()
    メソッド呼び出し @フォーム.明細番号設定(1)
end


PageTop▲

Copyright © 2010 "Junshi Toyoda, Okinawa Japan"