HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 ファイル一覧 検索 過去ログ

■14080 / 親記事)  フォーム入力途中でESC
  
□投稿者/ 篤姫 -(2023/12/21(Thu) 13:01:41)
    桐10S Windows10

    フォームで入力途中にESCで入力を中止した時に
    指定のコマンドボタンにフォーカスを移動させたいのですが

    よろしくお願いします。
引用返信 [メール受信/OFF] 削除キー/
■14081 / ResNo.1)  Re[1]: フォーム入力途中でESC
□投稿者/ 通りすがり -(2023/12/21(Thu) 15:50:23)
    指定のコマンドボタンを実行じゃダメですか?
1014×592 => 250×145

1703141423.jpg
/77KB
引用返信 [メール受信/OFF] 削除キー/
■14082 / ResNo.2)  Re[1]: フォーム入力途中でESC
□投稿者/ ONnoji -(2023/12/21(Thu) 20:31:27)
    2023/12/22(Fri) 14:42:16 編集(投稿者)
    2023/12/22(Fri) 10:35:04 編集(投稿者)
    2023/12/21(Thu) 21:26:43 編集(投稿者)

    > 桐10S Windows10
    >
    > フォームで入力途中にESCで入力を中止した時に
    > 指定のコマンドボタンにフォーカスを移動させたいのですが

    フォームのテキストボックスにキャレットがある時には、[テキストボックスのエディタ]の中に居ます。

    この[テキストボックスのエディタ]とはいわゆる入力用のバッファ(メモリ)の事です。
      ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

    なので、[テキストボックスのエディタ]に進入している時に発生する[入力後]イベントで他のオブジェクトへフォーカスを移動することは禁止されています。

    つまり、[入力後]イベントが終了してから、他のオブジェクトへフォーカスを移動させてちょうだいね、ということです。
        ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
     ◇ ◇ ◇ ◇

    私も[実行コマンド:ESCキー]が簡便で面倒くさくないのでお勧めします。
      ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

    ただし、テキストボックスにキャレットがある時には、ESCキーを2度押す必要がありますね。

    1度めは、[テキストボックスのエディタ]から脱出するために、

    そして2度めは、[実行コマンド:ESCキー]の設定のために。

    これ位ならば、普通は[この仕様で良し!]じゃないでしょうか????

     ◇ ◇ ◇ ◇

    それでも、どうしてもというのであればサンプルを添付しますので参考にしてください。

    例によってサンプルは数日を目途に削除しますのでダウンロードはお早めに願います。

    なお、サンプルでは時限式タイマーを使用しています。

    時限式タイマーに関しては拙作webページを参考にしてください。

    こちら
     ↓
    桐の釣魚大全のトップ > フォームアプリケーション教書 第1部
    11 [タイマー]イベントの動的セット
    http://silicon7565.html.xdomain.jp/guide/guide_Part1.htm#section11


    ■ダイアログボックス.WFX

     フォーム
     ├ ファミリ
     ├ ワークスペース
     │ └ cmdフォーカス移動
     ├ フォーム操作バー
     ├ フォームヘッダ部
     │ └ tタイトル
     ├ フォーム明細部
     │ ├ テキスト_8
     │ │ └ ラベル_9
     │ ├ テキスト_9
     │ │ └ ラベル_10
     │ └ ラベル_11
     └ フォームフッタ部
       ├ cmdOK
       └ cmdキャンセル

     オブジェクト名: cmdフォーカス移動
     標題     : cmdフォーカス移動

      機能名     機能パラメータリスト
     1 フォーカス移動  "cmdキャンセル"
     2 なし
     3 なし
     4 なし


    ■ダイアログボックス.kex

    名札  メイン



    手続き定義開始 フォーム::タイマー1()
     変数宣言 自動,文字列{ &objectName }
     変数宣言 自動,整数 { &return }

     &objectName = "フォーム"
     オブジェクト操作 &objectName{タイマー1 = 0 } /* 時限式タイマーなので直ちに停止します */

     メソッド呼び出し 戻り値 = &return, @cmdキャンセル.フォーカス設定()
     **戻り値 意味
     ** 1 フォーカスを移した。
     ** 0 フォーカスを移せなかった。
     **-1 フォーカス設定できないハンドラ内で実行した
     トレース出力 _&return

    手続き定義終了

    手続き定義開始 テキスト_9::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
     変数宣言 自動,文字列{ &objectName }
     変数宣言 自動,整数 { &interval = 10 } /* 単位は1/100秒 ただし、0.1秒以下にはしないこと */
     変数宣言 自動,整数 { &return }

     トレース出力 &this
     if ( .not &モード )

      メソッド呼び出し 戻り値 = &return, @cmdキャンセル.フォーカス設定() /* NG!です */
      **戻り値 意味
      ** 1 フォーカスを移した。
      ** 0 フォーカスを移せなかった。
      **-1 フォーカス設定できないハンドラ内で実行した。
      トレース出力 _&return

      メソッド呼び出し 戻り値 = &return, @cmdフォーカス移動.実行() /* NG!です */
      トレース出力 _&return
      **戻り値 意味
      ** 1 正常終了。
      ** 1以外 実行できない。またはエラーで終了した。

      **以上のように[入力後]イベントハンドラ実行中にフォーカスを移動することは不可能

      **次のように、[入力後]イベントハンドラ実行後に時限式タイマーイベントを実行する
      &objectName = "フォーム"
      オブジェクト操作 &objectName{タイマー1 = 1, タイマー値1 = &interval } /* 時限式タイマーをセットします */
     end


    手続き定義終了


引用返信 [メール受信/OFF] 削除キー/
■14083 / ResNo.3)  Re[2]: フォーム入力途中でESC
□投稿者/ 篤姫 -(2023/12/22(Fri) 09:05:49)
    通りすがりさん
    ありがとうございます。
    やってみます。
引用返信 [メール受信/OFF] 削除キー/
■14084 / ResNo.4)  Re[2]: フォーム入力途中でESC
□投稿者/ 篤姫 -(2023/12/22(Fri) 09:09:00)
    ONnojiさん

    ご指導いただいたイベント勉強します。

    ありがとうございます。
引用返信 [メール受信/OFF] 削除キー/
■14085 / ResNo.5)  Re[3]: フォーム入力途中でESC
□投稿者/ ONnoji -(2023/12/22(Fri) 11:32:19)
    2023/12/22(Fri) 16:54:20 編集(投稿者)

    蛇足です。

    ┌when 手続き"テキスト_9::入力後("2023年12月22日",0,0)"を実行開始しました

    │ :テキスト_9
    │ :&return : -1
    │ :&return : 0

    └end

    ┌when 手続き"フォーム::タイマー1( )"を実行開始しました

    │ :&return : 1

    └end

    [入力後]イベントハンドラの引数:&モード/長整数

     入力したデータが確定されたか、キャンセルされたかを示す番号が格納されます。

    値 説明
    1 確定
    0 [Esc]キーによるキャンセル

    ↑これは論理値と同じなので

    if ( .not &モード )
     :
    end

    とすれば、[Esc] キーを検出することになります。

    このように便利なのですが、フォーム上にテキストボックスが多数ある時には、

    それぞれのオブジェクトごとに[入力後]イベントハンドラを作成しなければなりません。

    何故ならば、ファミリには[入力後]イベントハンドラが無いからです。
          ・・・・・・・・・・・・・・・・・・・・・・
    なので、テキストボックスが多数ある時には、コツコツと作るしかありません。(^^ゞ

    これは愚直で格好悪く思えますが、一目瞭然なのでヨシだと思います。

     ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

    格好悪いのを嫌って、[キーダウン]イベントで対応する方法も考えられますが、

    常時[キーダウン]イベントをオンにしておくのは無駄に[キーダウン]イベントが発生するのでデバッグし難いです。
                           ・・・・・・・・・・・・・・・・・・・
    なので、エディタに進入した時に限り[キーダウン]イベントをオンにして、

    それ以外の時には[キーダウン]イベントをオフにするのがスマートです。
                               ・・・・・・
    しかし、スマートにしようとすると、今度はプログラムが複雑になります。

    なので、[キーダウン]イベントよりも、[入力後]イベントの方が優れていると思いますよ。

    なお、[実行コマンド:ESCキー]の方が簡便で面倒臭くないのでお勧めします。

    私だったら[Esc] キーを2度押してね!を採用すると思いますよ。


引用返信 [メール受信/OFF] 削除キー/
■14086 / ResNo.6)  Re[4]: フォーム入力途中でESC
□投稿者/ 篤姫 -(2023/12/22(Fri) 17:08:37)
    ONnojiさん
    実行コマンドで処理を検討しています。
    現在週末で業務処理を行っていますので
    時間がある時にやってみます。

    ありがとうございます。
引用返信 [メール受信/OFF] 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -