桐の釣魚大全のトップ > フォームアプリケーション教書 第1部
トップページに戻る
鋭意校正中です。
念のためにブラウザでF5キーを押してリロードしてからお読みください。
フォームアプリケーション教書 第1部 ― 桐のイベント処理の詳細な解説
目次
1 パラダイムシフト
Windowsに対応した桐が発売されてからすでに久しいですが、PC環境のパラダイムシフトを意識した人はそれほど多くないかもしれない。
パラダイムシフトという言葉の意味をウィキペディアなどから引用しよう。
【引用】パラダイムシフト 出典: フリー百科事典『ウィキペディア(Wikipedia)』
パラダイムシフト(英: paradigm shift)とは、その時代や分野において当然のことと考えられていた認識や思想、社会全体の価値観などが革命的にもしくは劇的に変化することをいう。
パラダイムチェンジともいう。
科学史家トーマス・クーンが科学革命で提唱したパラダイム概念の説明で用いられたものが拡大解釈されて一般化したものである。
【引用】パラダイム‐シフト paradigm shift の意味 出典:デジタル大辞泉(小学館)
ある時代・集団を支配する考え方が、非連続的・劇的に変化すること。社会の規範や価値観が変わること。
例えば、経済成長の継続を前提とする経営政策を、不景気を考慮したものに変えるなど。
パラダイムチェンジ。パラダイム変換。パラダイム転換。発想の転換。
1.1 古いCUIスクリーン 新しいGUIスクリーン
PCのスクリーンは長らくキャラクタベースであり、画面のサイズは横80桁×25行です。
これは MS-DOS の標準です。
DOSのアプリケーションでは、文字の入力を含めて、キーボードのキーやファンクションキーで操作するのが一般的です。
一方、PCの新しいスクリーンはグラフィックベースであり、画面のサイズはVGA(640×480ピクセル)以上の画面解像度です。
これは、Microsoft Windows の標準です。
Windowsのアプリケーションでは、マウスなどのポインティングデバイスで操作するのが一般的です。
もちろん、文字入力にはキーボードを使いますが、操作をキーボードのキーやファンクションキーで行うのは一般的ではありません。
以上をまとめると次のようになります。
・古いCUI … キーボードのキーやファンクションキーで操作するのが一般的
・新しいGUI … マウスなどのポインティングデバイスで操作するのが一般的
古いCUIはDOSの方法で、新しいGUIはWindowsの方法です。
【引用】キャラクタユーザインタフェース 出典: フリー百科事典『ウィキペディア(Wikipedia)』
キャラクタユーザインタフェース (character user interface, CUI)、キャラクタベースユーザインタフェース (character-based user interface, CUI)、
コンソールユーザインタフェース (console user interface, CUI)、またはコマンドラインインタフェース (command line interface, CLI) は、
キーボード等からの文字列を入力とし、文字列が表示されるウィンドウや古くはラインプリンタで印字される文字などを出力とする、ユーザインタフェースの様式である。
もっぱらグラフィカルユーザインタフェース (GUI) の対義語として使われる。
【引用】グラフィカルユーザインタフェース 出典: フリー百科事典『ウィキペディア(Wikipedia)』
グラフィカルユーザインタフェース(Graphical User Interface、略称:GUI(ジーユーアイ))は、
コンピュータグラフィックスとポインティングデバイスなどを用いる、グラフィカル(ビジュアル)であることを特徴とするユーザインタフェース。
1.2 古い操作方法 新しい操作方法
古い操作方法は、最初に[操作]を選び、次に[操作の対象]を選びます。
例えば表編集でレコードを削除する場合を例に挙げると、
表編集状態で、最初に[ファンクションキー:B]→[F9:行削除]を選び、[行削除]メニューから{1:指定行,2:範囲,3:全行}を選びます。
そのほかに、[スラッシュメニュー:1レコード処理]→[D:行削除]を実行しても同じです。
新しい操作方法は、最初に[操作の対象]を選び、次に[操作]を選びます。
同じく表編集でレコードを削除する場合を例に挙げると、
表編集状態で、最初に任意の行セレクタを選択し、次に[Delete]キーを押します。
そのほかに、最初に任意の行セレクタを選択し、次に[メニューバー]→[行削除(R)]→[行削除]を実行しても同じです。
以上をまとめると次のようになります。
・古い操作法 … 最初に[操作]を選び、次に[操作の対象]を選びます
・新しい操作 … 最初に[操作の対象]を選び、次に[操作]を選びます。
↑このように新旧の操作方法では、[操作]と[操作の対象]の順番が正反対です。
古い操作法はDOSの方法で、新しい方法はWindowsの方法です。
なお、このような新旧の操作方法が混在するWindowsソフトは少数派です。
なぜならば、Win桐には前身のDOS桐の存在があったからです。
すなわち、Win桐ではDOS桐ユーザの資源(データファイル等)の上位互換性を達成する必要がありました。
そして、操作に関してもDOS桐を継承する必要がありました。
Win桐の生い立ちはWindowsソフトの中でも異色のものであり、有名なソフトで同様なものはワープロソフトの一太郎くらいだと思われます。
つまり、Win桐はコンプレックス( 英:complex 複合の )なのです。
1.3 古典一括処理 拡張一括処理 フォーム+イベント処理
桐では、他のソフトに比べて比較的容易に高度なアプリケーションを作成することが出来ます。
具体的には、次のようになります。※便宜上、一括処理を[古典一括処理]と[拡張一括処理]と区別して呼びます
DOS桐では、[古典一括処理]を作成して高度なアプリケーションを作成できます。[古典一括処理]はCUIベースなのでGUIのウィンドウという概念がありません。
桐ver.7 では、DOS桐の[古典一括処理]を制限付きながらGUIで実行できます。ただし、CUIである[一括処理実行]ウィンドウでしか実行できない[古典一括処理]もあります。
桐ver.7 では、さらにウィンドウハンドル番号を用いたGUIの[拡張一括処理]でアプリケーションを作成できます。
桐ver.8 では、[フォーム+イベント処理]を使ったWindowsらしい高度なアプリケーションが作成できるようになりました。
これらのうち、[フォーム+イベント処理]だけが新しいアプリケーション開発手法です。
一見すると、ウィンドウハンドル番号を用いたGUIの[拡張一括処理]も新しい手法のように思えますが、
[古典一括処理]を拡張しただけの内容であり、Windows環境に対応させただけの改良版にすぎません。
以上をまとめると次のようになります。
・古いアプリケーション開発手法 … 古典一括処理・拡張一括処理
・新しいアプリケーション開発手法 … フォーム+イベント処理
↑このように新旧の違いは、一括処理を実行することを出発点とするか、またはフォームウィンドウを開くことを出発点とするかの違いです。
古いアプリケーション開発手法はDOSの方法で、新しいアプリケーション開発手法はWindowsの方法です。
桐のアプリケーション開発手法にも、Win桐がコンプレックス( 英:complex 複合の )であることが大きく影響しています。
Win桐ではDOS桐ユーザの資源(データファイル等)の上位互換性を達成する必要がありました。
そして、操作に関してもDOS桐を継承する必要がありました。
そこで[古典一括処理]から[拡張一括処理]が生まれたわけですが、しかし、それは上位互換の帰結でしかありません。
本当にWindows時代に対応した桐のアプリケーション開発手法は、[フォーム+イベント処理]によるものです。
2 動作の概観
フォームウィンドウを開くことを出発点とするべきか、一括処理を実行することを出発点とするべきか、それが問題だ。 ― ウィリアム・シェイクスピア
2.1 フォーム+イベント処理 古典一括処理・拡張一括処理
[フォーム+イベント処理]と[古典一括処理・拡張一括処理]の動作を、以下に[編集フェーズ]と[コマンド実行フェーズ]に分けて示します。
特に両者において始まり<begin>と終わり<end>の位置が異なることに注目してください。
<フォーム+イベント処理>
編集フェーズ コマンド実行フェーズ
────────────┬───────────────────
│
│ イベント処理( kev / kex )
<begin> │
フォームを開く │
│
コマンドボタン │ 一般プロシージャ(一般手続き)
機能名:手続き実行 →→→ 手続き定義開始
│ ↓
復帰 ←←← 手続き定義終了
│
│
│ イベントプロシージャ(イベントハンドラ)
イベントの発生 →→→ 手続き定義開始
│ ↓
復帰 ←←← 手続き定義終了
│
<end> │
フォームを閉じる │
<古典一括処理・拡張一括処理>
編集フェーズ コマンド実行フェーズ
────────────┬───────────────────
│
│ 一括処理( cmd / cmx )
│
│ <begin>
一括処理起動 →→→ 一括処理メインモジュール
│
│
表ウィンドウ ←←←[表形式編集]コマンド
[×]ボタン →→→ 次のコマンドへ
│
│
フォームウィンドウ ←←←[フォー形式編集]コマンド
[×]ボタン →→→ 次のコマンドへ
│
│
│ [ウィンドウ作成]コマンド
│ ↓
ウィンドウ ←←←[ウィンドウ会話]コマンド
一括括処理へ戻る →→→ 次のコマンドへ
│
│ <end>
│ [終了]コマンド[中止]コマンド
復帰 ←←←[実行終了]コマンド[会話処理実行]コマンド
│ 予期せぬエラーによる中断
│ キー操作による中断
2.2 フォーム+履歴を改変した一括処理
番外編になりますが、コマンドボタンの[機能名:開く]で履歴を改変した一括処理( cmd / cmx )を指定する方法もあります。
つまり、[フォーム+履歴を改変した一括処理]手法と呼べる内容です。
これは、フォームでは履歴( cmd / cmx )が実行できないので、履歴を改変した一括処理をなんとかフォームで実行しようとして考案されたように思います。
しかし、桐ver.8以降では、[フォーム+イベント処理]が利用できるのですから、[フォーム+履歴を改変した一括処理]という手法はおススメできません。
今となっては、たとえ履歴を改変した一括処理だとしても、フォームに古い手法(古典一括処理・拡張一括処理)を適用することがナンセンスに思えます。
なお、コマンドボタンの[機能名:開く]で実行した履歴を改変した一括処理からは、当然ながらフォームの局所変数は直接見えないのでダイレクトに参照できません。
従って、イベント処理のようにフォームの局所変数を扱えないので、変数のスコープが広いことによる事故の危険性が高くなります。
そして、デバッグが非常に行いにくいことも難点です。
このように、[フォーム+履歴を改変した一括処理]という手法は、[繰り返し]文も[if]文も無い一本道の単純なバッチ処理を実行する場合には簡便な方法ですが、
本格的なアプリケーションを構築する手法としては不向きです。
<フォーム+履歴を改変した一括処理>
編集フェーズ コマンド実行フェーズ
────────────┬───────────────────
│
│ 履歴を改変した一括処理( cmd / cmx )
フォームを開く │
│
コマンドボタン │ <begin>
機能名:開く →→→ 一括処理メインモジュール
│
│
(フォームが閉じられて)│
表編集に遷移 ←←← もしも、履歴で使用されている[使用フォーム]コマンドを実行すると
※編集対象表があれば │ 表編集に遷移して、一括処理を続行しますが、
※注1参照 │ コマンドボタンの[次に指定している機能名]を実行しない
│
(フォームが解除されて)│
表編集に遷移 ←←← もしも、デバッグ目的で[表形式編集]コマンドを実行すると
※編集対象表があれば │ 表編集に遷移したまま、コマンド実行フェーズに戻らないので、
※注1参照 │ 一括処理の次の行のコマンドを実行しない
│ コマンドボタンの[次に指定している機能名]を実行しない
│
フォーム編集 ←←← もしも、デバッグ目的で[フォーム形式編集]コマンドを実行すると
│ フォーム編集に遷移したまま、コマンド実行フェーズに戻らないので、
│ 一括処理の次の行のコマンドを実行しない
│ コマンドボタンの[次に指定している機能名]を実行しない
│
│ <end>
│ [終了]コマンド[中止]コマンド
復帰 ←←←[実行終了]コマンド[会話処理実行]コマンド
│ 予期せぬエラーによる中断
│ キー操作による中断
注1:フォームにイベント処理がセットされている場合、フォームが閉じられるので[フォーム終了]イベントが発生します。
もちろん、[フォーム+履歴を改変した一括処理]という手法の場合には、イベント処理をセットすることは無いでしょうけれど。
3 [フォーム+イベント処理]の要素
[フォーム+イベント処理]のファイル要素はシンプルで、たった2つまたは3つのファイルで1つのモジュール(機能)を構成します。
3.1 ファイル構成
[フォーム+イベント処理]は、次の3種類のファイルで構成されます。
・フォームファイル ( wfm/wfx )
・イベント処理ファイル( kev/kex )
・表ファイル ( tbl/tbx )
ただし、編集対象表がない、NULLフォームの場合もあります。
<編集対象表を持つフォーム>
┌──────┬──────┐
│ │ │
│フォーム │イベント │
│ │ 処理 │
│( wfm/wfx ) │( kev/kex ) │
│ │ │
│ │ │
└──┬───┴──────┘
│
編集対象表
│
┌──┴───┐
│ │
│ 表 │
│ │
│( tbl/tbx ) │
│ │
│ │
└──────┘
<編集対象表を持たないNULLフォーム>
┌──────┬──────┐
│ │ │
│フォーム │イベント │
│ │ 処理 │
│( wfm/wfx ) │( kev/kex ) │
│ │ │
│ │ │
└──────┴──────┘
フォームを開くと、これらのファイルは結びついて動作します。
このことから、いっそのことファイルが3つに分かれているよりも、1つに統合されている方が便利なハズですが、
桐はそれぞれのファイルを基本単位にしているので仕方ありません。
なお、NULLフォームがあるように、3種類のファイルの中で表ファイルは必須というわけではありません。
しかし、少なくともフォーム( wfm/wfx )とイベント処理( kev/kex )は必須です。
3.2 運用とファイル名の原則
ファイルとしては、フォーム( wfm/wfx )とイベント処理( kev/kex )は別々のものですが、
使用する際には、2つのファイルをペアにして用いるのですから、関係が判りやすい方が便利です。
そこでフォーム( wfm/wfx )とイベント処理( kev/kex )の関係を明瞭にするために、次のように運用・命名するのが適当です。
原則1 フォームとイベント処理は1対1で対応させる
これは、1つのイベント処理を複数のフォームで使い回さないということです。
つまり、フォームのファイル数とイベント処理のファイル数は同数になるようにします。
たとえ、同じ内容のイベント処理だからといっても、フォーム毎に対応するイベント処理を作ります。※注2参照
原則2 フォームとイベント処理は、同じフォルダの同じファイル名にする
同じフォルダにフォームとイベント処理が存在する方が、そうでない場合よりも管理が楽です。
また、フォームとイベント処理のファイル名が同じである方が、そうでない場合よりも管理が楽です。
これは、フォルダやファイルをコピー・移動する作業を想像してみれば明らかなことでしょう。
原則3 表ファイルもフォーム+イベント処理と同じフォルダにする
表ファイルのファイル名がフォーム+イベント処理と同名の必要はありませんが、同じフォルダの方が管理が楽になります。
これも、フォルダやファイルをコピー・移動する作業を想像してみれば明らかなことでしょう。
注2:明らかに同じ内容のイベント処理の場合には、1つのイベント処理を複数のフォームで使い回しても問題ありませんが、
やがてフォーム毎に差異が生じるのが普通なので避ける方が無難です。
また、イベント処理において、[if]文[ケース]文を用いてフォーム毎の差異を吸収することも可能ですが、
イベント処理の内容が複雑になり、デバッグが行いにくくなってしまいます。
4 ウィンドウ
ウィンドウは次のように定義できる。
「ソフトウェアアプリケーションや文書ファイルを含む長方形の領域。
ウィンドウはオープン(開く)、クローズ(閉じる)、リサイズ(大きさ変更)、移動などの操作が可能である。
複数のウィンドウをデスクトップ上に同時にオープンしたり、小さくしてアイコンにしたり、デスクトップを覆うまで拡大することができる[1]。」
4.1 デスクトップ アプリケーションウィンドウ ドキュメントウィンドウ ※この項の説明は、桐sでは[リボンを使用しない]で利用する場合に該当します。
MS Windows では、デスクトップの内にアプリケーションウィンドウが表示されて、アプリケーションウィンドウの内にドキュメントウィンドウが表示されます。
表とフォームのどちらもドキュメントウィンドウです。
┌─────────┐
│ │
│ MS Windows │
│ │
│ デスクトップ │
│ │
└────┬────┘
│
│
┌────┴────┐
│ │
│ 桐9s / 桐10s │ ┌────────────┐
│ ├───┤ドキュメントウィンドウに│
│アプリケーション │ │対応するメニューバー │
│ ウィンドウ │ └────────────┘
│ │
└────┬────┘
│
│
┌────┴────┐
│ │
│ 表 (tbl/tbx)│
│フォーム (wfm/wfx)│
│ │
│ ドキュメント │
│ ウィンドウ │
│ │
└─────────┘
Fig.1 アプリケーションウィンドウとドキュメントウィンドウ
4.2 MDI チャイルドウィンドウ ※この項の説明は、桐sでは[リボンを使用しない]で利用する場合に該当します。
桐は、MDI(マルチ・ドキュメント・インタフェース)を採用しています。
MDIとは、アプリケーションウィンドウの内に複数のドキュメントウィンドウを表示して管理するグラフィカルユーザインタフェース方式のことです。
つまり、桐のウィンドウの内側に複数の表とフォームを表示できます。
そして、このように親ウィンドウの内側に表示される複数の子ウィンドウをチャイルドウィンドウといいます。
すなわち、[桐]ウィンドウの内側に表示される表やフォームはチャイルドウィンドウです。
【引用】フリー百科事典『ウィキペディア(Wikipedia)』
MDI、Multiple Document Interface(マルチ・ドキュメント・インタフェース)とは親ウィンドウ内に複数の子ウィンドウを表示して管理するグラフィカルユーザインタフェース方式である。
SDI、Single Document Interface(シングル・ドキュメント・インタフェース)は、アプリケーションのウィンドウを単独表示する方式のグラフィカルユーザインタフェースである。
SDIウィンドウはそれにとっての親ウィンドウのようなものを持たず、各ウィンドウがそれぞれメニューやツールバーなどを表示する方式である。
SDIアプリケーションで複数のファイルを編集する場合、ユーザーはアプリケーションを重複起動して利用する。
4.3 タイトルバー ※この項の説明は、桐sでは[リボンを使用しない]で利用する場合に該当します。
MS Windows のような OS では、ウィンドウ操作がほぼ共通の操作(ルール)で扱えるからこそ価値があります。
つまり、最初に OS の基本操作を覚えてしまえば、はじめてのソフトでも大体の操作ができてしまうから便利なのです。
ところが、桐ではタイトルバーを非表示にしたフォームを作ることも可能です。
しかしながら、このような行為はウィンドウ操作を共通の操作で扱えなくするので、「不親切なルール変更」と言わざるをえません。
従って、[フォーム+イベント処理]のアプリケーションの場合には、タイトルバーを非表示にするのは厳禁です。
4.4 チャイルド形式 ポップアップ形式 オーバーラップ形式
表はチャイルドウィンドウとしてしか表示できませんが、フォームではチャイルド形式の他に、ポップアップ形式とオーバーラップ形式でも表示できます。
4.4.1 ポップアップ形式 フローティングウィンドウ
桐ウィンドウの上に重なるウィンドウにします。この形式のフォームは、桐ウィンドウの外側に出すことができます[2]。
ポップアップ形式のフォームは、常にドキュメントウィンドウの前面に表示されるのでフローティングウィンドウと呼ぶこともあります。注3
注3:ツールバーやトレース出力ウィンドウが桐ウィンドウにドッキングしていない状態もフローティングウィンドウと呼びます。
ただし、チャイルド形式のフォームであっても、モーダルフォームとして表示する場合には、自動的にポップアップ形式になって表示されます。
従って、通常の場合にはフォームをポップアップ形式にする必要はありません。
次の場合には、フォームをポップアップ形式にするのが適当です。
【主ウィンドウを補助するウィンドウの場合】
これは、主ウィンドウの編集対象表のレコードを検索する等といった補助的なウィンドウです。
なお、モーダルウィンドウでは毎回閉じなければならず不便なため、この補助的なウィンドウはモードレスウィンドウにします。
そして、主ウィンドウが閉じられたならば、これらの補助ウィンドウは一緒に閉じられる必要があります。
この具体例としては、拙作:utx_list3 の[整形]フォームと[手続き一覧]フォームの関係が挙げられます。
主ウィンドウの[整形]フォームが閉じられると、補助的な[手続き一覧]フォームは自動的に閉じられます。
なお、主ウィンドウは、最大化してピクセルを贅沢に使うようにしましょう。
ピクセルをケチった狭苦しいウィンドウでは作業の効率が悪いだけです。
Fig.2 主ウィンドウを補助するウィンドウ
【ウィジェット・ガジェット(小規模なアクセサリーソフト)の場合】
ウィジェット・ガジェットとは、カレンダーや時計などといった小規模なアクセサリー的なフォームです。
この場合には、主ウィンドウを補助するという対応関係が存在しませんので、ウィジェット・ガジェットとして必要がなくなるまで表示し続けます。
この具体例としては、拙作:toy_launcher が挙げられます。
Fig.3 ウィジェット・ガジェットのウィンドウ
4.4.2 オーバーラップ形式
桐ウィンドウを隠して、独立したウィンドウにします。
この形式のフォームを表示した場合、いままで編集していた桐のウィンドウはすべて隠れます。また、タスクバーにも、桐が表示されなくなります[2]。
オーバーラップ形式のフォームを表示した場合には、チャイルドウィンドウは表示できません。
従って、表を表示することは出来ません。
また、オーバーラップ形式のフォームから開いたフォームはすべて自動的にポップアップ形式になります。
オーバーラップ形式のフォームでは桐のアプリケーションウィンドウが隠されるので、桐ウィンドウを意識させないアプリを好む人や、
いわゆる「キオスク」モードを好む人がこの形式を利用すると思われます。
しかし、[フォーム+イベント処理]のデバッグが非常に行いにくくなるので、著者( ONnoji )はおススメしません。
4.5 モーダルウィンドウ モードレスウィンドウ
モーダルウィンドウとは、そのウィンドウを閉じるまでほかの作業ができなくなるウィンドウのことです。対義語はモードレスウィンドウです。
モーダルウィンドウが表示されている間はアプリケーションの状態が「ユーザの応答待ちモード」になっています。
4.5.1 モーダルフォーム
表を開くとモードレスウィンドウになりますが、フォームではモーダルウィンドウとして開くことも可能です。
モーダルウィンドウとして開いたフォームは、すなわちモーダルフォームです。
モーダルフォームは、自動的にポップアップ形式(フローティングウィンドウ)として開かれます。
モーダルフォームは閉じられるまで他のウィンドウの操作をブロックしますが、ユーザはモーダルフォームであることに気づかない場合があり、
主ウィンドウが反応しなくなったことで困惑したり、入力すべきデータが判らないといった副作用も発生します。
このような理由から、モーダルフォームは安易に使用せずに、総合的に判断して必要だと結論した場合に限り使用すべきです。
なお、モーダルフォームでは、一覧表印刷とレポート印刷のプレビューは実行できませんので注意が必要です。
【引用】フリー百科事典『ウィキペディア(Wikipedia)』
モーダルウィンドウ(英: modal window)は、コンピュータアプリケーションソフトウェアのユーザインタフェース設計において、
何らかのウィンドウの子ウィンドウとして生成されるサブ要素のうち、ユーザーがそれに対して適切に応答しない限り、制御を親ウィンドウに戻さないもの。
モーダルウィンドウはGUIシステムで、ユーザーに注意を促したり、選択肢を提示したり、緊急の状態を知らせたりする目的でよく使われる。
モーダルダイアログやポップアップと呼ばれることもある。
"modal"とは「モードを持つ」という意味であり、モーダルウィンドウが表示されている間はアプリケーションの状態が「ユーザーの応答待ちモード」になっている。
対義語は"modeless"(モードレス)である。
4.5.2 ダイアログボックス
ユーザに情報を提示し、必要に応じてユーザーに応答してもらうためのウィンドウをダイアログボックスといいます。
ダイアログボックスは、モーダルフォームを利用するのが一般的です。
ダイアログボックスとしてのモーダルフォームでは、[OK][キャンセル][はい][いいえ]などの応答ボタンを設置します。
この具体例としては、拙作:utx_list3 の[整形]フォームと[字下げ設定]フォームの関係が挙げられます。
[字下げ設定]フォームでは、[OK]/[キャンセル]ボタン、タイトルバーの[×]ボタン、キーボードの[Esc]キーのいずれかを実行しないと[整形]フォームに制御が戻りません。
Fig.4 モーダルなダイアログボックス
【引用】フリー百科事典『ウィキペディア(Wikipedia)』
ダイアログボックス(英: dialog box)とは、GUIにおける特殊なウィンドウの一種であり、ユーザーに情報を提示し、必要に応じてユーザーに応答してもらうもの。
(ユーザーに何かを伝えたり、ユーザーに何か入力してもらったりといった)ユーザーとコンピュータ間の対話 (dialog) に使われるため、このように呼ばれる。
主に開発者が使う言葉で、利用者向けには「ポップアップウィンドウ」と説明される場合が多い。
4.5.3 メッセージボックス
最も単純なダイアログボックスはメッセージボックスです。
メッセージボックスは、モーダルフォームを利用して自作可能ですが、[メッセージボックス]コマンドで表示するのが一般的です。
なお、[古典一括処理]から用意されている[確認]コマンドでは、応答ボタンは[OK]のみで、メッセージは70桁目までしか表示できません。
従って、[フォーム+イベント処理]では、4種類のアイコンと6通りの応答ボタンが指定出来て、表示文字列を途中で改行できる[メッセージボックス]コマンドを用いるべきです。
【アイコンの種類】
! 警告
? 問い合わせ
i 情報
E エラー
【応答ボタン】
[OK]のみ
[OK]と[キャンセル]
[中止]、[再試行]、[無視]
[はい]、[いいえ]、[キャンセル]
[はい]、[いいえ]
[再試行]、[キャンセル]
Fig.5 [OK]のみのメッセージボックス アイコンに( i )情報が指定されている
5 ウィンドウフォーカス ※この項の説明は、桐sでは[リボンを使用しない]で利用する場合に該当します。
複数のチャイルドウィンドウ(表やフォーム)を開くと、アプリケーションウィンドウ(桐ウィンドウ)内ではチャイルドウィンドウが次々に重なっていきます。
アクティブなチャイルドウィンドウは、他のチャイルドウィンドウの手前に表示されるウィンドウです。
別のチャイルドウィンドウをアクティブにするには、次の方法でウィンドウをフォーカスします。
・フォーカスするチャイルドウィンドウ(表やフォーム)内をクリックする
・フォームの場合には、[Ctrl] + [F6] を押す
または、
タイトルバーのドキュメントアイコンをクリックして、コントロールメニューの[次のウィンドウに移る]を選ぶ ※注4
・表の場合には、表のタイトルバーのドキュメントアイコンをクリックして、コントロールメニューの[次のウィンドウに移る]を選ぶ ※注4
・メニューバーの[ウィンドウ]メニューで[番号が付いている項目]を選ぶ
注4:チャイルドウィンドウ(表やフォーム)のコントロールメニューは、[Alt] + [-]ハイフンで表示できます。
桐ウィンドウとポップアップウィンドウのコントロールメニューは、[Alt] + [SP]スペースで表示できます。
【タイトルバーのアイコンとショートカットキー】
コントロールメニューを開く 次のウィンドウに移る 閉じる
桐ウィンドウ [Alt] + [SP]スペース N/A [Alt] + [F4]
表 [Alt] + [-]ハイフン メニューを選択 メニューを選択
チェイルド形式 [Alt] + [-]ハイフン [Ctrl] + [F6] [Alt] + [F4] ※注5
ポップアップ形式 [Alt] + [SP]スペース N/A [Alt] + [F4] ※注5
注5:[Alt] + [F4]を長押しすると、桐ウィンドウも閉じられてしまいます。
【引用】出典: フリー百科事典『ウィキペディア(Wikipedia)』
ウィンドウフォーカス
デスクトップでのフォーカスの振る舞いは、ウィンドウ管理のポリシーが支配している。
マイクロソフトやアップルのGUIでは、クリックに追随してフォーカスが移動する (focus follows click, FFC)。
すなわち、あるウィンドウ内でマウスをクリックすると、そのウィンドウがフォーカスを得る。その際に同時にそのウィンドウが最前面に表示される。
6 ウィンドウの最大化ボタンと最小化ボタン ※この項の説明は、桐sでは[リボンを使用しない]で利用する場合に該当します。
複数のチャイルドウィンドウ(表やフォーム)を開くと、アプリケーションウィンドウ(桐ウィンドウ)内ではチャイルドウィンドウが次々に重なっていきます。
メニューバーの[ウィンドウ]メニューで{重ねて表示,上下に並べて表示,左右に並べて表示}のいずれかを選ぶと、
チャイルドウィンドウ(表やフォーム)が再配置されますが、それぞれのウィンドウの面積は狭くなり作業が行いにくくなります。
そこで作業を快適に行うためにチャイルドウィンドウ(表やフォーム)のタイトルバーの[最大化]ボタンをクリックして使い易くします。
桐がMDI(マルチ・ドキュメント・インタフェース)だという理由から、作業中のチャイルドウィンドウを最大化せずにピクセルをケチるのは好ましくありません。
なぜならば、ピクセルをケチった狭苦しいウィンドウは作業の効率が悪いだけだからです。
従って、アクティブなチャイルドウィンドウ(表やフォーム)は最大化して効率よく作業することが望ましいです。
最大化したチャイルドウィンドウ(表やフォーム)を元の大きさにするには、タイトルバーの[元に戻す(縮小)]ボタンをクリックします。
チャイルドウィンドウ(表やフォーム)はタイトルバーの[最小化]ボタンをクリックして最小化することも出来ます。
最大化したチャイルドウィンドウ(表やフォーム)を元の大きさにするには、タイトルバーの[元に戻す(拡大)]ボタンをクリックします。
【メニューバーの[ウィンドウ]メニュー】
重ねて表示 :開いているすべての子ウィンドウのタイトルバーが、重なり合わないように並べ替えます。
上下に並べて表示:開いているすべての子ウィンドウが、画面上で重なり合わないように上下に並べ替えます。
左右に並べて表示:開いているすべての子ウィンドウが、画面上で重なり合わないように左右に並べ替えます。
アイコンの整列 :最小化されている子ウィンドウが、画面上で重なり合わないように整列します。
7 複数のフォームウィンドウの連携 ※この項の説明は、桐sでは[リボンを使用しない]で利用する場合に該当します。
チャイルドウィンドウである表ウィンドウには、(UI部品としての)オブジェクトが作成できないのでアプリケーションとしては不向きです。
それに対してフォームウィンドウには、さまざまな種類のオブジェクトが作成できるので高度なアプリケーションが作成できます。
小規模なアプリケーションでは、たったひとつのフォームウィンドウを用意するだけで済む場合があります。
しかし、多くの場合には複数のフォームウィンドウと連携するアプリケーションになります。
7.1 コマンドボタンでフォームを開く
複数のフォームウィンドウの連携にはコマンドボタンの機能を利用します。
コマンドボタンには、[機能名:開く]と[機能名:閉じる]と[機能名:モーダルフォーム]がありますのでこれを利用します。 ※注6
注6:桐の一括処理コマンドの[ウィンドウ作成]コマンドでもフォームを開くことは可能ですが、それはDOS桐との互換や拡張した一括処理の手法であり、Windows時代に対応した桐のアプリケーション開発手法ではありません。
■[開く]型
Aフォーム Bフォーム Cフォーム
┌────────────┐ ┌────────────┐ ┌────────────┐
│コマンドボタンの標題 │ │コマンドボタンの標題 │ │コマンドボタンの標題 │
│Bフォームを開く │ │Cフォームを開く │ │Cフォームを閉じる │
│ │ │ │ │ │
│機能名 機能パラメータ│ │機能名 機能パラメータ│ │機能名 機能パラメータ│
│1 開く Bフォーム ├→→→┤1 開く Cフォーム ├→→→┤1 閉じる │
│2 なし │ │2 なし │ │2 なし │
│3 なし │ │3 なし │ │3 なし │
│4 なし │ │4 なし │ │4 なし │
└────────────┘ └────────────┘ └────────────┘
Aフォーム → Bフォーム → Cフォーム の順に開く。
フォームウィンドウは重なっている。
タイトルバーの[×]ボタンを実行すると、Cフォーム → Bフォーム → Aフォーム へウィンドウフォーカスを移動。
タイトルバーの[×]ボタンを実行する代わりにコマンドボタンの[機能名:閉じる]を実行しても同じです。
注意:すでに開かれているフォームを開こうとするとエラーになります(多重化を許可したフォームとNULLフォームを除く)。
■[開く+閉じる]型 ※注意:オーバーラップ形式のフォームでは不可
Aフォーム Bフォーム Cフォーム
┌────────────┐ ┌────────────┐ ┌────────────┐
│コマンドボタンの標題 │ │コマンドボタンの標題 │ │コマンドボタンの標題 │
│Bフォームを開く │ │Cフォームを開く │ │Aフォームを開く │
│ │ │ │ │ │
│機能名 機能パラメータ│ │機能名 機能パラメータ│ │機能名 機能パラメータ│
│1 開く Bフォーム ├→→→┤1 開く Cフォーム ├→→→┤1 開く Aフォーム │
│2 閉じる │ │2 閉じる │ │2 閉じる │
│3 なし │ │3 なし │ │3 なし │
│4 なし │ │4 なし │ │4 なし │
└─────┬──────┘ └────────────┘ └─────┬──────┘
│ │
└───────────────←←←───────────────┘
Aフォーム → Bフォーム → Cフォーム → Aフォーム の順に開く。
それぞれのフォームで自身のフォームを閉じているので、フォームウィンドウは重なっていない。
■[主ウィンドウ/ダイアログボックス(モーダル・ポップアップ)]型
主ウィンドウ ダイアログボックス
Aフォーム Bフォーム
┌───────────────────────┐ ┌──────────────────┐
│コマンドボタンの標題 │ │コマンドボタンの標題 │
│ダイアログボックスを開く │ │OK │
│ │ │ │
│機能名 機能パラメータリスト │ │機能名 機能パラメータリスト │
│1 なし #代入( &実行リターン, 0 ) ┝━━━┥1 なし #代入( &実行リターン, 1 ) │
│2 モーダルフォーム Bフォーム ┝━━━┥2 閉じる │
│3 なし │ │3 なし │
│4 なし │ │4 なし │
└───────────────────────┘ └──────────────────┘
【参考】[キャンセル]ボタンの例 1 なし #代入( &実行リターン, 0 )
主ウィンドウのAフォームから、ダイアログボックスのBフォームをモーダルで開く。
ダイアログボックスのBフォームを閉じてウィンドウフォーカスを主ウィンドウのAフォームに戻す。
[機能名:閉じる]を実行する代わりに、[Esc]キーを押すだけでもBフォームは閉じられます。
その場合には、主ウィンドウAフォームで実行したコマンドボタンの残りの行の機能は実行されません(上の例の場合では、3 と 4 の機能名)。
モーダルフォームでは、一覧表印刷とレポート印刷のプレビューは実行できませんので注意が必要です。
チャイルド形式のフォームであっても、モーダルフォームとして表示する場合には、自動的にポップアップ形式になって表示されます。
従って、通常の場合にはフォームをポップアップ形式にする必要はありません。
■[主ウィンドウ/補助ウィンドウ(モードレス・ポップアップ)]型
主ウィンドウ ポップアップ形式の補助ウィンドウ
Aフォーム Bフォーム
┌───────────────┐ ┌───────────────┐
│コマンドボタンの標題 │ │コマンドボタンの標題 │
│Bフォームを開く │ │Bフォームを閉じる │
│ │ │ │
│機能名 機能パラメータリスト│ │機能名 機能パラメータリスト│
│1 開く Bフォーム ├→→→┤1 閉じる │
│2 なし │ │2 なし │
│3 なし │ │3 なし │
│4 なし │ │4 なし │
└───────────────┘ └───────────────┘
主ウィンドウのAフォームから、補助ウィンドウのBフォームを開く。
Bフォームはポップアップ形式にしておくことでAフォームの前面に表示される。
主ウィンドウのAフォームと補助ウィンドウのBフォームのどちらにもウィンドウフォーカス出来る。
7.2 メソッドでコマンドボタンを実行する
一般手続き(またはイベントハンドラ)でフォームを開く場合には、[実行]メソッドでコマンドボタンを実行します。 ※注7
例えば、[オブジェクト名:cmdBフォームを開く]を一般手続き(またはイベントハンドラ)で実行するには次のようにします。
オブジェクト名:cmdBフォームを開く
┌────────────────┐
│機能名 機能パラメータリスト │
│1 開く Bフォーム │
│2 閉じる │
│3 なし │
│4 なし │
└────────────────┘
(例)
手続き定義開始 procedureName( )
変数宣言 自動,文字列{ &objectName }
変数宣言 自動,整数 { &return }
&objectName = "cmdBフォームを開く"
メソッド呼び出し 戻り値 = &return, &objectName.実行( )
手続き定義終了
なお、この例では、[機能名:開く]の[機能パラメータ:Bフォーム]のようにリテラル(直値)で指定していますが、
[機能パラメータ:&variableName]のように変数で指定しても構いません。
注7:メソッドとは、オブジェクトに対する操作のこと。オブジェクトの種類によって使用できるメソッドは異なる。
7.3 レガシーなアプローチ
フォームを開く方法にも、Win桐がコンプレックス( 英:complex 複合の )であることが大きく影響しています。
そのために、レガシーな[拡張一括処理]のコマンドでもフォームを開くことが出来ます。 ※注8
■[ウィンドウ作成]コマンド
[ウィンドウ作成]コマンドには「終了状態 = 変数」パラメータがありませんから、エラーした場合にはコマンドを実行した手続きが中断されてしまいます。
従って、コマンドボタンの[機能名:開く]を利用する方が優れています。
なお、コマンドボタンは[実行]メソッドで実行できますので、一般手続き(またはイベントハンドラ)からでもコマンドボタンの[機能名:開く]が使用できます。
コマンドボタンの[機能名:開く]の場合には、エラーした場合に[実行]メソッドを実行した手続きが中断されることはありません。
■[ウィンドウ終了]コマンド
[フォーム+イベント処理]でも[ウィンドウ終了]コマンドは実行できますが、[ウィンドウ終了]コマンドを使用するのは絶対に止めた方がいいです。※注9
なぜならば、[フォーム+イベント処理]で[ウィンドウ終了]コマンドを実行した場合にはバグが多いからです。
ちなみに、編集対象表があるフォームでは、更新モードの場合にはレコードの変更値は保存されません。
それと同時に[フォーム終了]イベントハンドラが実行されないという問題も発生します。
つまり、かなり「ギャッ〜!」という状況になりますので、[フォーム+イベント処理]では[ウィンドウ終了]コマンドは使うべきではありません。
ということで、コマンドボタンの[機能名:閉じる]を必ず利用するべきです。
なお、コマンドボタンは[実行]メソッドで実行できますので、一般手続き(またはイベントハンドラ)からコマンドボタンの[機能名:閉じる]が使用できます。
■[フォーム呼び出し <フォームファイル名>]コマンド
[フォーム+イベント処理]でも[フォーム呼び出し <フォームファイル名>]コマンドでモーダルフォームを開けます。[Esc]キーを押すだけでモーダルフォームは閉じられます。
このコマンドはレガシーな[拡張一括処理]のコマンドですが、ウィンドウハンドルに関するパラメータがありません。
このコマンドを実行した場合には、桐の[以前開いたファイルの一覧]に<フォームファイル名>が保存されません。
注8:[ウィンドウ会話]コマンドは、レガシーな[拡張一括処理]専用のコマンドです。[フォーム+イベント処理]では利用できません。
[フォーム形式編集]コマンドは、レガシーな[古典一括処理]のコマンドです。[フォーム+イベント処理]では利用できません。
注9:[ウィンドウ終了]コマンドを一括処理で実行した場合は、表と使用フォームが開かれたままになります。
[ウィンドウ終了]コマンドをイベントハンドラ内で実行した場合は、表と使用フォームの両方を閉じます。
7.4 ランチャー
コンピュータにおけるプログラムを呼び出すためのソフトウェアをランチャー(launcher、ローンチャーとも)と呼びます。
[フォーム+イベント処理]では、ランチャーのフォームを作成すると効果的です。
【メニュー型のランチャー】
これはメニュー型のフォームウィンドウです。
フォームアプリケーション毎に専用のランチャーを用意する場合と、汎用のランチャーを利用する場合があります。
■専用ランチャーの例
掲載の例は1列7段のメニューですが、もっと多くの列数や段数のメニューでもよい。
Fig.6 専用ランチャー
■汎用ランチャーの例
汎用ランチャーでは、登録したフォームウィンドウをグループ化したり、メニュー上の位置の変更が行えます。
Fig.7 汎用ランチャー toy_laouncher
【パレット型のランチャー】
アイコンを並べたフォームウィンドウです。
小さなフォームウィンドウに、よく使うアプリケーションなどのアイコンを並べ、アイコンをクリックすることで起動できます。
Fig.8 パレット型のランチャー utx_list3_launcher
【引用】ランチャー(コンピュータ) 出典: フリー百科事典『ウィキペディア(Wikipedia)』
ランチャー(launcher、ローンチャーとも)は、矢の発射や船の進水を意味する英語のlaunchから派生した語である。
コンピュータ用語では、使いやすいようにファイルやアプリケーションソフトウェアを、ショートカットキーのキーボード操作や、ボタンのクリックひとつなどの簡単な操作で起動できる機能である。
近年のグラフィカルユーザインターフェース(GUI)を備えた大抵のオペレーティングシステムに、標準で備えられている機能であるほか、ツールソフトウェアの形で、様々なものが提供されている。
Mac OSであればアップルメニュー、NEXTSTEPやmacOSであればDock、Windowsであればスタートメニューがランチャーといえる。
■ランチャーに関する雑談 ― ブログ版 桐のイベント道場 2007/3/17 INF_Toolsの話 第29話より
※執筆当時の INF_Tools は INF_Framework に置き換えました。
ランチャーというのは案外と面倒なものです。
INF_Framework のランチャーは次の順で動作します。
まず、すでにそのファイルのウィンドウが在るか否か調べて
↓
次に、ウィンドウでなく編集表と開いている表が在るか否か調べて、
↓
次に、ディスクに目標のファイルが存在するか否か調べて、
↓
最後に、本当にフォームや表を開きます。
なお、すでにファイルのウィンドウがある場合は、そのウィンドウへフォーカスし、
すでにウィンドウでなく編集表として開いている表がある場合は、メッセージボックスで通知します。
また、すでに開いたウィンドウのハンドルを覚えている方式は具合悪いので、ランチャーは以上の作業をその都度行います。
つまり、常に最新のウィンドウハンドルを精査することがランチャーの重要な点です。
いうなれば、常にリアルタイムな情報を収集することがランチャーの基本設計になります。
ランチャーの機能は、ミサイルに例えるのが適当です。ミサイルには、無誘導式・誘導式・打ちっ放し式があります。
○無誘導式 ― コマンドボタンの[機能名:開く]です。
○誘導式 ― すでに開いたウィンドウのハンドルを覚えている方式ですが、ハンドル情報が実際と食い違うトラブルが発生します。
○打ちっ放し式 ― INF_Framework が採用しているリアルタイムな情報を収集する方式です。
実際の打ちっ放し式のミサイルには、シーカー(探知機)があります。
これは、ランチャー機能の
まず、すでにそのファイルのウィンドウが在るか否か調べて
↓
次に、ウィンドウでなく編集表と開いている表が在るか否か調べて、
に相当します。
つまり、目標のウィンドウや、編集表が在るか否か調べる機能です。
そして、もしも、目標のウィンドウや、編集表が無ければ、ディスクに目標のファイルが存在するか調査して、ランチャーはフォームや表を本当に開くというわけです。
8 プロシージャ
プロシージャ(procedure)とは手続きのことです。
桐のヘルプでは、[一般手続き]や[イベントハンドラ]という用語が用いられていますが、本書では「プロシージャ」で統一します。
[フォーム+イベント処理]では、プロシージャをイベント処理ファイル( kev/kex )に記述します。
8.1 イベントプロシージャ(イベントハンドラ) 一般プロシージャ(一般手続き)
[イベントプロシージャ(イベントハンドラ)]は、次の操作で桐が自動的に作成してくれます。
フォーム定義の[オブジェクトの属性]の[イベント]タブで[イベント名]をダブルクリックするとイベント定義画面が表示されます。
イベント定義画面には、イベントが発生して呼び出される[イベントプロシージャ]が自動的に作成されています。
一方、[一般プロシージャ(一般手続き)]の場合には、ユーザ自身が[一般プロシージャ]を作成しなければなりません。
(注意)[簡易プロパティ]の場合には[イベント]タブが表示されませんので、必ず[詳細プロパティ]に設定してください。
プロシージャの範囲は、[手続き定義開始]コマンドで始まり、[手続き定義終了]コマンドで終わる部分です。
プロシージャ名の長さは、全角と半角に関係なく 64 文字までです。
プロシージャには仮引数リストが設定できます。
なお[手続き]にも、Win桐がコンプレックス( 英:complex 複合の )であることが大きく影響しています。
そのために、古典一括処理の[名札 <名札名>]コマンドと[手続き終了]コマンドで構成したレガシーな[名札による手続き]は、[フォーム+イベント処理]では全く利用できません。
【引用】プロシージャ 出典: フリー百科事典『ウィキペディア(Wikipedia)』
プロシージャ (procedure)とは、プログラミングにおいて複数の処理を一つにまとめたものをいう。
手続きとするのが定訳である。
一連の処理を意味を持った一まとまりにすることで、再利用性が高まり、プログラム中に繰り返して現れる処理を1ヶ所で記述でき、プログラムの保守、管理を容易にする。
【引用】引数 出典: フリー百科事典『ウィキペディア(Wikipedia)』
引数(ひきすう)は、数学における関数やコンピュータプログラムにおける手続きにおいて、その外部と値をやりとりするための特別な変数、あるいはその変数の値のことである。
関数・サブルーチン・メソッド等を定義する時に、外部から値を渡される特別な変数として指定されるのが仮引数。
関数(等)を呼出す式において、仮引数に対応する式(あるいはその値)が実引数である。
実行時には、実引数の値を仮引数が受け取る。
「引数」を「いんすう」と読む読み方もあるが、術語としては変則的に湯桶読みして「ひきすう」としている。数学分野で因数との取違えを防ぐためといった理由もある。
【引用】オブジェクトの属性にタブが表示されない場合には ― 桐のイベント道場より
オブジェクトの属性に目的のタブが見つからない場合には次のように設定を変更してください。
<操作>
1.フォーム定義で[書式]メニュー → [定義画面の設定]を選びます。
2.[定義画面の設定]ウィンドウを開きます。
3.一番下と下から二番めの項目にチェックマークを付けてください。
□ 操作ナビを消去する
□ 詳細プロパティを使用する
↑
この二つにチェックマークを付けてください。
8.2 コマンドボタンの[機能名:手続き実行]で一般プロシージャを実行する
イベントプロシージャはイベントの発生によって実行されますので、コマンドボタンを[マウス左クリック]してイベントを発生させることが考えられます。
しかし、コマンドボタンには[機能名:手続き実行]が用意されているので、コマンドボタンの[マウス左クリック]イベントを使う必要はありません。※注10
従って、コマンドボタンでは[機能名:手続き実行]で一般プロシージャを実行するのが定番の手法になります。
コマンドボタンの[機能名:手続き実行]の右の[機能パラメータリスト]には、一般プロシージャに渡す引数も指定できます。
フォーム( wfm/wfx )のコマンドボタン
オブジェクト名:cmdObjectName イベント処理ファイル( kev/kex )
┌─────────────────┐
│機能名 機能パラメータリスト│
│1 表示 │
│2 手続き実行 一般プロシージャ │→→→→ 手続き定義開始 一般プロシージャ( )
│3 なし │←←←┐
│4 なし │ │ * コマンドまたはメソッド
└─────────────────┘ │
└ 手続き定義終了
注10:
・Shift + マウス左クリックした時
・Ctrl + マウス左クリックした時
・普通にマウス左クリックした時
これらのモードが必要な場合には、Shift や Ctrl のフラグを検出するために [マウス左クリック]イベントを使用する必要があります。
8.3 イベントプロシージャから一般プロシージャを呼び出す
イベントプロシージャはイベントの発生に対応するプロシージャですから、それぞれのオブジェクト毎にそしてイベントの種類毎にプロシージャが必要になります。
しかし、数多くのイベントプロシージャに同じ処理内容を記述するのは手間であり冗長です。
またそれだけではなく、処理内容が変更になった場合の保守も非常に面倒になります。
このような場合には、それぞれのイベントプロシージャから、一般プロシージャを呼び出すようにすると手間も冗長さも軽減されて保守も容易になります。
また、イベントプロシージャ名は「オブジェクト名+::+イベント名」形式なので他のフォームでオブジェクト名が異なれば再利用出来ません。
しかし、一般プロシージャではそのプロシージャの機能を表すプロシージャ名を付けるので、他のフォームでの再利用がし易くなります。
手続き定義開始 オブジェクトA::イベント名( 仮引数リスト )
手続き実行 一般プロシージャ( )
手続き定義終了
手続き定義開始 オブジェクトB::イベント名( 仮引数リスト )
手続き実行 一般プロシージャ( )
手続き定義終了
8.4 一般プロシージャをサブルーチンとして呼び出す
プロシージャはサブルーチンとして呼び出すことが出来ます。
上位ルーチン 下位ルーチン 下位ルーチン
プロシージャA プロシージャB プロシージャC
┌────────────┐
│手続き定義開始 A( ) │
│ │ ┌────────────┐
│ 手続き実行 B( ) →→→→→→手続き定義開始 B( ) │
│ * ここから以下実行 ←←←←┐│ │ ┌────────────┐
│ │ ││ 手続き実行 C( ) →→→→→→手続き定義開始 C( ) │
│手続き定義終了 │ ││ * ここから以下実行 ←←←←┐│ │
└────────────┘ ││ │ ││* コマンドまたはメソッド│
└←手続き定義終了 │ ││ │
└────────────┘ └←手続き定義終了 │
└────────────┘
【引用】サブルーチン 出典: フリー百科事典『ウィキペディア(Wikipedia)』
サブルーチン(英: subroutine)は、コンピュータプログラミングにおいて、プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたものである。
繰り返し利用されるルーチン作業をモジュールとしてまとめたもので、呼び出す側の「主」となるもの(メインルーチン)と対比して「サブルーチン」と呼ばれる。
サブプログラム (subprogram) と呼ばれることもある。また、「サブ」をつけずに「ルーチン」と呼ぶこともある。
プログラムのソース中で、繰り返し現れる作業をサブルーチン化することで、可読性や保守性を高く保つことができる。
繰り返し現れる作業でなくても、意味的なまとまりを示すためにサブルーチン化することもある。
9 イベントとは
イベントとは、コンピュータを操作する人が行なった操作、またはその操作によって発生した一連の出来事のことをいいます。[3]
9.1 イベントループ
ところでこのイベントはどのような仕掛けで検知されるのでしょうか?
それを目に見える形で分かり易くする方法は次のようなものです。
コマンドボタンの[機能名:実行条件]の[機能パラメータリスト]の条件式に運悪く宣言されていない変数名を記述したとします。
この場合、特に桐からエラーメッセージは表示されませんが、[トレース出力ウィンドウ]を表示して[トレース出力開始]を選ぶとエラーが繰り返し表示されます。※注11
Fig.9 [トレース出力ウィンドウ]表示されたエラー
エラー :KD1593:未定義の変数名があります &a(C:\KIRI10\テスト\kesiteii.TBX )
エラー :KD1593:未定義の変数名があります &a(C:\KIRI10\テスト\kesiteii.TBX )
エラー :KD1593:未定義の変数名があります &a(C:\KIRI10\テスト\kesiteii.TBX )
:
:
この結果からフォームには自身の状態を監視するループが動作しているということが分かります。
このようなループを一般的には[イベントループ]と呼びます。
注11:[トレース出力ウィンドウ]を使えるようにするには、
メニューバーの[環境設定]の[一括]タブの[高度な設定ボタン]を実行して現れる[高度な設定(一括)]の[トレース出力ウィンドウを使用する(再起動時に有効)]のチェック
をオンにします。
┌───────────┬─────┬─────┐ ┌──────────┐
│ │ │ ├─┤ コマンドボタン │
│フォームのウィンドウ │イベント │イベント │ │ の機能 │
│ │ループ │ディス │ └──────────┘ イベント処理実行モード
│ │ │パッチャー│ ┌──────────┐ ┌──────────┐
│ │ │ ├─┤ コマンドボタン ├──┤一般プロシージャ │
│ │(イベント │(イベント │ │機能名:手続き実行 │ │ │
│ │ 監視 )│ 割り当て)│ └──────────┘ └──────────┘
│ │ │ │ ┌──────────┐ ┌──────────┐
│ │ │ ├─┤ イベントの発生 ├──┤イベントプロシージャ│
│ │ │ │ │ │ │ │
│ │ │ │ └──────────┘ └──────────┘
│ │ │ │ イベントハンドラー
│ │ │ │
└───────────┴─────┴─────┘
※イベントループとイベントディスパッチャーはユーザから見えません
・イベントループ
イベントを待機するループを持つ機構。イベントループ内にイベントディスパッチャーを持つ構造が一般的である。
メッセージループ、メッセージポンプとも呼ばれる。
・イベントディスパッチャー
発生したイベントをイベントハンドラーに振り分ける機能のこと。
・イベントハンドラー
イベントが発生した際に実行すべきサブルーチンのこと。イベントフック、イベントリスナーなどの呼び方がある。
9.2 [イベント]属性のオン/オフ コマンドボタンの[機能名:実行条件]
[オブジェクトの属性]の[イベント]タブの[イベント名]のチェックをオフ( OFF )にした場合には、
該当するイベントプロシージャがイベント処理ファイル( kev/kex )に作成されていてもイベントは発生しません。
つまり、イベントの属性がオンの場合にイベントが発生する仕掛けなのです。
しかし、イベントが発生しても該当するイベントプロシージャが作成されていない場合には何も実行されません。
どんなイベントが発生するのかは、[トレース出力ウィンドウ]を表示して[トレース出力開始]を選ぶと観察することが出来ます。
コマンドボタンの場合には、[フォーカスの設定]プロパティ(属性)のプロパティ値(属性値)を[使用不可表示]にするとコマンドボタンを動作しないようにできます。
[使用不可表示]の状態のコマンドボタンは、グレーアウトで表示されていてマウスとキーの両方の操作が出来ません。
また、[フォーカスの設定]プロパティの値が[自動]の場合でも、コマンドボタンの[機能名:実行条件]の[機能パラメータリスト]の条件式を設定すれば、条件が偽の場合にグレーアウトで表示できます。
注意:DOS桐にはグレーアウトという手法が存在しなかったために、選択肢そのものを表示しないという手法が一般的でした。
しかし、Win桐ではオブジェクトを[使用不可表示]に出来るので、状況によってオブジェクト自身を非表示にするという恣意的で乱暴なユーザインターフェースは慎むべきです。
フォームが開かれる
↓
[名札 メイン]
↓
┌ イベントループ ────
│
│ 操作 ┬→ イベント属性がオン → イベントが発生する → イベントプロシージャ → 一般プロシージャ(サブルーチンとして必要ならば)
│ └→ イベント属性がオフ → イベントが発生しない
│
│ 機能名 機能パラメータリスト
│ コマンドボタンを実行 → 1 実行条件 ( 条件式 )
│ 2 表示
│ 3 手続き実行 一般プロシージャ → 一般プロシージャ(サブルーチンとして必要ならば)
│ 4 なし
│
└─────────────
↓
フォームが閉じられる
Fig.10 イベント属性のオン/オフ
【引用】桐10s ヘルプ ― 【イベント処理】定義してみましょう
この項目のON/OFFは、そのオブジェクトで指定したイベントを発生させるかどうかを指定するためのものです。 この項目をOFFにしていても、イベント処理ファイルのイベントハンドラが削除されるわけではありません。
[オブジェクト操作]コマンドを使用すれば、この項目のON/OFFを一時的に切り替えることができます。
Fig.11 コマンドボタンの[機能名:実行条件]
【引用】イベントループ 出典: フリー百科事典『ウィキペディア(Wikipedia)』
イベントループ (event loop)、メッセージディスパッチャ (message dispatcher)、メッセージループ (message
loop)、メッセージポンプ (message pump)、ランループ (run loop) とは、
プログラム内でイベントやメッセージを待ちうけ、それらをディスパッチする構成要素である。
内部または外部の「イベントプロバイダー」(通常、イベントが到着するまで要求をブロックする)に要求することで作動し、次いで適当なイベントハンドラを呼び出す(イベントのディスパッチ)。
【引用】グレーアウトとは 「グレイアウト」 (gray out): - IT用語辞典バイナリ
グレーアウト【英】gray out 別名:グレイアウト
グレーアウトとは、グラフィカルユーザーインターフェース(GUI)において、項目が操作の対象から外れていることを示すため、グレー色で表示されている状態のことである。
グレーアウトで表示される項目は、主に、メニュー上の項目や選択肢のうち、現在の操作の流れでは入力や選択ができない項目などである。
グレーアウトの表示によって、本来は項目があり、かつ、それが入力・選択できないことを示すことができる。
10 [イベント]属性の静的/動的セット
[オブジェクト操作]コマンドでイベント属性はオン/オフ出来ます。
フォームを定義した時のイベント属性のセッティングを維持したままフォームアプリケーションを運用する状態を[イベント属性の静的セット]と呼ぶことにします。
一方、プロシージャ([名札 メイン]を含む)において[オブジェクト操作]コマンドでイベント属性をオン/オフすることを[イベント属性の動的セット]と呼ぶことにします。
【引用】桐10s ヘルプ ― 【イベント処理】はじめに
使用するイベントのON/OFFは、オブジェクトのプロパティ値を変更することで、イベントハンドラの実行中に変更できます。
[オブジェクト操作]コマンドでイベント属性はオン/オフする方法は次の通りです。
■イベント属性のオン/オフを整数のイチ(1)/ゼロ(0) で指定する
(例)
&objectName = "テキスト_2"
** オンに設定
オブジェクト操作 &objectName{ 編集開始 = 1 }
または
オブジェクト操作 &objectName.編集開始 = 1
** オフに設定
オブジェクト操作 &objectName{ 編集開始 = 0 }
または
オブジェクト操作 &objectName.編集開始 = 0
■イベント属性のオン/オフを値を文字列の "1"/"0" で指定する
(例)
&objectName = "テキスト_2"
** オンに設定
オブジェクト操作 &objectName{ 編集開始 = "1" }
または
オブジェクト操作 &objectName.編集開始 = "1"
** オフに設定
オブジェクト操作 &objectName{ 編集開始 = "0" }
または
オブジェクト操作 &objectName.編集開始 = "0"
多くの人は[イベント属性]のオン/オフの値は文字列の "1"/"0" で指定するものだと思っていることでしょう。
なぜならば[オブジェクトのリスト]から[オブジェクト操作]コマンドの雛形を取得する際のチェックボックスの値が "1"/"0"
となっているからです。
しかし、それは[オブジェクト操作]コマンドの雛形が属性値を文字列の形式で表現しているからに過ぎません。
実は、[オブジェクトのリスト]でチェックボックスになっている属性値は整数のイチ(1)/ゼロ(0) でもOKなのです。
気が付かない人が非常に多いのですが、このことは昔からWin桐のヘルプに記載されています。
【引用】桐10s ヘルプ ― 【一括処理】一括処理の書き方
<属性値>
オブジェクトの属性に設定する値を指定します(計算式)。
一覧からいずれかひとつを選択する設定値の全角と半角は区別しません。大文字と小文字は区別します。
各オブジェクトの属性に設定できる値は、<属性名>同様、[オブジェクトのリスト]で確認できます。
[オブジェクトのリスト]でチェックボックスになっている属性値は、ONにするならONまたは1、OFFにするならOFFまたは0(ゼロ)を指定します。
注意:↑これによると、"ON"/"OFF" でもOKとありますが、指定する属性の種類によってはエラーになるので"ON"/"OFF"は使わないことをおススメします。
なお、エラーに関しては本稿を執筆中に著者( ONnoji )が発見してK3殿に報告済みです。
【引用】桐10s ヘルプ ― 【一括処理】一括処理の書き方
<属性名>
オブジェクトの属性名を指定します(定数)。
属性名は、二重引用符で囲んではいけません。
■イベント属性のオン/オフの属性値を変数に取得する
(例)
&objectName = "テキスト_2"
** &integer は整数型の変数とする
オブジェクト操作 &objectName{ &integer = 編集開始 }
または
オブジェクト操作 &integer = &objectName.編集開始
** &string は文字列型の変数とする
オブジェクト操作 &objectName{ &string = 編集開始 }
または
オブジェクト操作 &string = &objectName.編集開始
Fig.12 [オブジェクトのリスト]でチェックボックスになっている属性値
11 [タイマー]イベントの動的セット
桐の[タイマー]イベントには、[タイマー1]と[タイマー2]の2つが用意されています。
[タイマー1]と[タイマー2]は同等のイベントなので、以降の説明では単に[タイマー]イベントと呼びます。
11.1 [タイマー]イベントとは
イベントとは、コンピュータを操作する人が行なった操作、またはその操作によって発生した一連の出来事のことをいいます。[3]
通常のイベントは、ユーザが行った操作によって発生します。
┌ イベントループ ────
│
│ 操作 ┬→ イベント属性がオン → イベントが発生する → イベントプロシージャ → 一般プロシージャ(サブルーチンとして必要ならば)
│ └→ イベント属性がオフ → イベントが発生しない
│
└─────────────
しかし、[タイマー]イベントだけは異なっています。
すなわち、[タイマー]イベントはそのイベント属性がオンであることによってインターバル経過後に発生します。
┌ イベントループ ────
│
│プロシージャ内で実行する プロシージャが実行終了した後
│[オブジェクト操作 設定]┬→ [タイマー]イベント属性をオンに設定 → インターバル経過後にイベントが発生する → イベントプロシージャ
│コマンド └→ [タイマー]イベント属性をオフに設定 → イベントが発生しない
│
└─────────────
タイマーイベントというのは、炊飯器のタイマーやキッチンタイマーのように、ある時間(インターバル)が経過したら動作するという仕組みのイベントです。
しかし、桐に付属している[時計]サンプルの影響で、一定時間毎に繰り返すイベントだと誤解する人が多いのです。
[タイマー]イベントの本来の使い方は、ある時間(インターバル)が経過したら動作する事なのですが、
残念ながら桐に付属している[時計]サンプルを見たの人の中には[タイマー]=[時計]という誤った先入観が植え付けられてしまう人が実に多いのです。
以下にウィキペディアから引用しよう。
【引用】タイマー 出典: フリー百科事典『ウィキペディア(Wikipedia)』
タイマー(timer)は、あらかじめ設定した時間までの残り時間を表示し(カウントダウン)、残り時間ゼロとなったときに、ブザーや発光で設定された時間が経過したことを知らせる装置のことを指す。
その他にも計測開始時からの経過時間(カウントアップ)を行うストップウオッチや、定期的に電源をオンオフしたり、
カウントダウンを意識せずにある時刻を設定しておいて知らせる(目覚まし時計)なども含めて、広い意味で時計(日本においてのクロック/ウォッチ)全般のことを指すこともある。
すなわち、[タイマー]とは、時限装置のことである。
従って、いっそのこと[タイマー]イベントと呼ばずに、[時限]イベントと呼んだ方が動作が理解しやすいと思いますがいかがなものでしょうか。(^^ゞ
11.2 [イベント]属性と[インターバル値]属性の動的セット
時限装置として[タイマー]イベントを利用する手順は以下の通りです。
ステップ1
まず、任意のプロシージャで[オブジェクト操作 設定]コマンドを実行して、[タイマー]イベント属性をオンにして任意の[インターバル値]属性を設定します。
イベント属性のオン/オフは整数のイチ(1)/ゼロ(0)で、インターバル値は1/100秒単位の整数で指定します。
注意:インターバル値は小さすぎると桐の動作が不安定になることがあるので10/100秒(0.1秒)以下にしないようにします。
&objectName = "フォーム"
オブジェクト操作 &objectName{ タイマー1 = 1, タイマー値1 = 10 } /* 単位は1/100秒 ただし、0.1秒以下にはしないこと */
または
&objectName = "フォーム"
&interval = 10 /* 単位は1/100秒 ただし、0.1秒以下にはしないこと */
オブジェクト操作 &objectName{ タイマー1 = 1, タイマー値1 = &interval }
または
&objectName = "フォーム"
オブジェクト操作 &objectName.タイマー1 = 1
オブジェクト操作 &objectName.タイマー値1 = 10
以下のように属性値を文字列で指定することも可能です。
&objectName = "フォーム"
オブジェクト操作 &objectName{ タイマー1 = "1", タイマー値1 = "0.10" }
または
&objectName = "フォーム"
オブジェクト操作 &objectName.タイマー1 = "1"
オブジェクト操作 &objectName.タイマー値1 = "0.10"
ステップ2
次に、[タイマー]イベントプロシージャ内、または[タイマー]イベントプロシージャが呼び出す一般プロシージャ内で、
[オブジェクト操作 設定]コマンドを実行して[タイマー]イベントの[イベント]属性をオフにします。
つまり、[タイマー]イベントが発生しないようにするということです。
なお、[タイマー]イベントの[イベント]属性をオフにするだけでよく、[インターバル値]属性を初期化する必要はありません。
注意:[インターバル値]属性をゼロ(0)にしても[タイマー]イベントが発生しなくなりますが、[イベント]属性をオン/オフする方が意味が明確で分かりやすいです。
■フラグなしの例
任意のプロシージャ イベントプロシージャ
プロシージャA フォーム::タイマー1()
┌────────────────┐ ┌───────────────┐
│ │ │フォーム::タイマー1() │
│&objectName = "フォーム" │ │ │
│&interval = 10 │ │ │
│ : │ │&objectName = "フォーム" │
│ : │プロシージャAが終了 │オブジェクト操作 &objectName │
│ │ した後のインターバル │{タイマー1 = 0 } │
│オブジェクト操作 &objectName │ ↓ │ │
│{タイマー1 = 1, │├─────┤イベントが│ * コマンドまたはメソッド │
│ タイマー値1 = &interval } │ 時間差 発生 │ : │
│ │ │ : │
│ : │ │ : │
│ : │ │ │
│ │ │ │
└────────────────┘ └───────────────┘
[タイマーイベント]プロシージャの冒頭で、[イベント]属性をオフにする。つまり、[タイマー]イベントが発生しないようにする。
■フラグ参照の基本例
任意のプロシージャ イベントプロシージャ
プロシージャB フォーム::タイマー1()
┌────────────────┐ ┌─────────────────┐
│ │ │フォーム::タイマー1() │
│&flagB = 1 /*フラグ立てる*/ │ │ │
│&objectName = "フォーム" │ │┌if ( &flagB ) │
│&interval = 10 │ ││ │
│ : │ ││ &flagB = 0 /*フラグ降ろす*/ │
│ : │プロシージャBが終了 ││ &objectName = "フォーム" │
│ │ した後のインターバル ││ オブジェクト操作 &objectName │
│オブジェクト操作 &objectName │ ↓ ││ {タイマー1 = 0 } │
│{タイマー1 = 1, │├─────┤イベントが││ │
│ タイマー値1 = &interval } │ 時間差 発生 ││ * コマンドまたはメソッド │
│ │ ││ │
│ : │ │└end │
│ : │ │ │
│ │ │ │
└────────────────┘ └─────────────────┘
[タイマーイベント]プロシージャでフラグを参照する。
フラグが立っていたら、フラグを降ろして、[イベント]属性をオフにする。つまり、[タイマー]イベントが発生しないようにする。
フラグ渡しの場合には、フラグ毎に処理を分けることが出来ます。
■フラグ参照の応用例
任意のプロシージャ イベントプロシージャ
プロシージャC フォーム::タイマー1()
┌────────────────┐ ┌─────────────────┐
│ │ │フォーム::タイマー1() │
│&flagC = 1 /*フラグ立てる*/ │ │ │
│&objectName = "フォーム" │ │┌if ( &flagC ) │
│&interval = 10 │ ││ │
│ : │ ││ * コマンドまたはメソッド │
│ : │プロシージャCが終了 ││ │
│ │ した後のインターバル ││ 手続き実行 プロシージャD( ) ┼┐
│オブジェクト操作 &objectName │ ↓ ││ ││
│{タイマー1 = 1, │├─────┤イベントが││ * コマンドまたはメソッド │↓
│ タイマー値1 = &interval } │ 時間差 発生 ││ ││
│ │ │└end ││
│ : │ │ │↓
│ : │ │ ││
│ │ │ ││
└────────────────┘ └─────────────────┘│
┌───←────────←────┘
│
↓プロシージャD
┌─────────────────┐
│ │
│┌if ( &flagC ) │
││ │
││ &flagC = 0 /*フラグ降ろす*/ │
││ &objectName = "フォーム" │
││ オブジェクト操作 &objectName │
││ { タイマー1 = 0 } │
││ │
││ * コマンドまたはメソッド │
││ │
│└end │
│ │
│ │
└─────────────────┘
[タイマーイベント]プロシージャでフラグを参照する。
フラグが立っていたら、一般プロシージャを呼び出す。
一般プロシージャで、フラグを降ろして、[イベント]属性をオフにする。つまり、[タイマー]イベントが発生しないようにする。
フラグ渡しの場合には、フラグ毎に処理を分けることが出来ます。
参考:プロシージャDを[繰り返し]構造にすれば、プログレスバー等の複雑な処理が作れます。
【引用】フラグ(読み)ふらぐ 出典 ASCII.jpデジタル用語辞典
英語で旗の意味。ソースコードで、ある条件を満たしているかどうかを判断するために使う変数のこと。
通常は、0か1といった2値項目を使うが、処理によっては文字列などを使うこともある。条件を満たしていることを「フラグが立つ」などと表現することがある。
■タイマーイベントに関する雑談
[タイマーイベント]という言葉を聞いた時、多くの人は時計を思い浮かべることでしょう。
もしも桐に付属している[時計]サンプルを見てしまった後ならば、それはなおさらのことでしょう。
著者( ONnoji )はこの[時計]サンプルのように[タイマー]イベントの[イベント]属性を常時オンで運用する手法を「ブンブン丸」と呼んでいます。
そう、タイマーがブンブン回っているイメージからの命名です。
しかし、「ブンブン丸」は時計のガジェットでしか使い道がないのです。
本当に役に立つタイマーの利用方法は「時限装置」方式なのです。
なお、「時限装置」方式は取り扱いが複雑なので上級者でないと難しいかもしれませんが、いくつか利用例を示します。
例えば、主ウィンドウが閉じられる時に、補助ウィンドウもいっしょに閉じたい場合には、
補助ウィンドウのハンドルのタイマーイベントをオンにして、そのハンドルの局所変数のフラグを立てます。
そうすれば、タイマーイベントで局所変数のフラグを参照して動作出来るので、[機能名:閉じる]がセットされたコマンドボタンを実行できます。
注意:この場合には、補助ウィンドウのハンドルを調査する必要があるので、非常に高度なプログラミングになります。
例えば、スピンボタンのようにボタンを押し続けた時にリピートする場合にも「時限装置」方式のタイマーを利用します。
例えば、テキストボックスにキャレットがある時、F2(直前値)が押されて直前値が複写された直後に、
キャレットが文字列の末尾に移動しているデザインの場合にも「時限装置」方式のタイマーを利用します。
他にもいろいろ例を挙げることが出来ますが、
いずれの場合にも「ブンブン丸」方式は使わず、すべて「時限装置」方式のタイマーを利用するということを明言しておきましょう。
12 コマンドボタン
[フォーム+イベント処理]によるアプリケーション開発では[コマンドボタン]が重要な働きをします。
12.1 コマンドボタンの機能名は何種類ある?
コマンドボタンの機能名は10分類で91種類が用意されています。※注13
※かっこ内の数字は機能名の数
※似通った機能名はコンマ(,)で区切って列挙しています
※桐sSL では機能グループ名:Webビューが追加されました ※注13
■ファイル(20)
閉じる
上書き保存
開く
表整理
結合表の再抽出
読み込み_{表,テキスト,K3,CSV,PDF}
書き出し_{表,テキスト,K3,CSV,転置,表の枠組み,外部データベース}
併合
一覧表印刷
レポート印刷
■編集(17)
訂正
表示/訂正
表示
ジャンプ
フォーカス移動
検索_{条件名,比較式,値}
次を検索,前を検索
次を検索_比較式,前を検索_比較式
項目置換
置換_条件名
元に戻す
削除
すべて選択
■クリップボード(3)
コピー,切り取り,貼り付け
■表示(6)
ズームイン
ズームアウト
表編集へ
フォームの選択
削除行
スラッシュメニュー
■行操作(29)
行挿入
行追加
行削除_{指定行,全行}
行復活_{指定行,全行}
レコードロック_{指定行,現在行},ロック解除_全行
絞り込み_{条件名,比較式,値,指定行,単一化,重複行,行数,同一値}
補集合
並べ替え_{条件名,昇順,降順}
絞り込み_解除
解除
グループ{指定,検索,値訂正,追加,再抽出,解除}
■入力(3)
直前値
直前行
値複写
■ウィンドウ(2)
多重化_表編集
多重化_フォーム編集
■Webビュー(5) ※注13:この機能グループ名:Webビューは 桐sSL の新機能です
戻る
進む
更新
ホーム
URL取得
■手続き実行(1)
手続き実行
■その他(9)
再生
状況依存ヘルプ
モーダルフォーム
ファイル名入力
編集制御
シェル実行
実行条件
一括処理へ戻る
桐の終了
■なし(1)
なし
12.2 コマンドボタンの機能名と代替コマンド・メソッド
コマンドボタンの多くの[機能名]では[機能名パラメータリスト]を指定しなかった場合に、ダイアログボックスが現れます。
一方、[機能名パラメータリスト]を指定した場合には、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替出来る[機能名]もあります。
そして、コマンド・メソッドでは決して代替出来ない[機能名]も多くあります。
注意:用意周到なプロシージャを用意してコマンドやメソッドを駆使すれば代替可能な[機能名]もありますが、このアプローチは代替の範囲から除きます。
※かっこ内の数字は機能名の数
※似通った機能名はコンマ(,)で区切って列挙しています
■ファイル(20)
{閉じる,上書き保存,開く}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
閉じる
上書き保存
開く
表整理 ※パラメータリストを指定する場合には[表整理]コマンド
結合表の再抽出 → [再抽出]コマンド
読み込み_{表,テキスト,K3,CSV,PDF} ※パラメータリストを指定する場合には[読み込み 条件名]コマンド
書き出し_{表,テキスト,K3,CSV,転置,表の枠組み,外部データベース}※パラメータリストを指定する場合には[書き出し 条件名]コマンド
併合 ※パラメータリストを指定する場合には[併合 条件名]コマンド
一覧表印刷 ※パラメータリストを指定する場合には[一覧表印刷] コマンド
レポート印刷 ※パラメータリストを指定する場合には[レポート印刷]コマンド
■編集(17)
{表示/訂正,元に戻す,削除,すべて選択}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
{訂正,表示}の機能名は、フォームオブジェクトの[更新モード設定]メソッドで代替可能ですが、メソッドよりも簡便なので積極的に利用することをおススメします。
訂正
表示/訂正
表示
ジャンプ ※パラメータリストを指定する場合には[ジャンプ 行番号]コマンド
フォーカス移動 → 任意のオブジェクトの [フォーカス設定] メソッド
検索_条件名 ※パラメータリストを指定する場合には[検索 条件名] コマンド
検索_比較式 ※パラメータリストを指定する場合には[会話検索 比較式]コマンド
検索_値 ※パラメータリストを指定する場合には[会話検索 値] コマンド
次を検索 ※パラメータリストを指定する場合には[検索 条件名] コマンド
前を検索 ※パラメータリストを指定する場合には[検索 条件名] コマンド
次を検索_比較式 ※パラメータリストを指定する場合には[検索 比較式] コマンド
前を検索_比較式 ※パラメータリストを指定する場合には[検索 比較式] コマンド
項目置換 ※パラメータリストを指定する場合には[置換] コマンド
置換_条件名 ※パラメータリストを指定する場合には[置換 条件名] コマンド
元に戻す
削除
すべて選択
■クリップボード(3)
{コピー,切り取り,貼り付け}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
コピー
切り取り
貼り付け
■表示(6)
{表編集へ,スラッシュメニュー}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
ズームイン → フォームオブジェクトの[表示倍率の設定]メソッド
ズームアウト → フォームオブジェクトの[表示倍率の設定]メソッド
表編集へ
フォームの選択 ※パラメータリストを指定する場合にはフォームオブジェクトの[フォーム選択]メソッド
削除行 →[削除行]コマンド
スラッシュメニュー
■行操作(29)
すべての機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンドで代替できます。
行挿入
行追加
行削除_{指定行,全行}
行復活_{指定行,全行}
レコードロック_{指定行,現在行},ロック解除_全行
絞り込み_{条件名,比較式,値,指定行,単一化,重複行,行数,同一値}
補集合
並べ替え_{条件名,昇順,降順}
絞り込み_解除
解除
グループ{指定,検索,値訂正,追加,再抽出,解除}
■入力(3)
{直前値,直前行,値複写}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
直前値
直前行
値複写
■ウィンドウ(2)
{多重化_表編集,多重化_フォーム編集}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
多重化_表編集
多重化_フォーム編集
■手続き実行(1)
{手続き実行}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
注意:コマンドボタンを押してプロシージャを呼び出す場合には、[マウス左クリック]イベントを使う必要はありません。
[マウス左クリック]イベントを使うケースは、クリックにモード(Ctrl+マウス左クリック/Shift+マウス左クリック/通常マウス左クリック)がある場合です。
手続き実行
■その他(9)
{状況依存ヘルプ,ファイル名入力,編集制御,実行条件}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
※機能名の[ファイル名入力]は、レガシーな古典一括処理の[ファイル名入力]コマンドよりも多機能です。
※機能名の[編集制御]には、メソッドで代替可能なものがありますが、メソッドよりも簡便なので積極的に利用することをおススメします。
再生 → [サウンド 再生]コマンド
状況依存ヘルプ
モーダルフォーム ※パラメータリストを指定する場合には[フォーム呼び出し]コマンド
ファイル名入力 ※レガシーな古典一括処理の[ファイル名入力]コマンドは機能が低いのでおススメしません
編集制御 ※機能名の[編集制御]には、メソッドで代替可能なものがありますが、メソッドよりも簡便なので積極的に利用することをおススメします
シェル実行 → [シェル実行]コマンド
実行条件
一括処理へ戻る ※一括処理専用です。[フォーム+イベント処理]では使えません
桐の終了 → [終了 桐]コマンド
■なし(1)
{なし}の機能名は、[機能名:手続き実行]で呼び出した一般プロシージャ内のコマンド・メソッドで代替できません。
なし
12.3 コマンドボタンを実行する
コマンドボタンはマウス左クリックで実行することが多いのですが、それ以外の方法でもコマンドボタンを実行できます。
以下にコマンドボタンが実行されるタイミングを示します。
a.マウスでコマンドボタンを左クリックした時
b.コマンドボタンへフォーカスを移動して、キーボードの[スペース]または[Enter]キーを押した時
c.コマンドボタンのアクセスキーを押した時(例えば[Alt]+[X])
d.プロシージャ内でコマンドボタンの[実行]メソッドを実行した時
なお、コマンドボタンをマウスで操作した時、{マウス左ダウン,マウス左アップ,マウス左クリック}の各イベントでそれぞれのイベントプロシージャを呼び出せますが、
マウス左クリックした場合には、コマンドボタンも実行されます。注12
[マウス左ダウン]イベント マウスの左ボタンが押されたときに一度だけ発生する
↓
[マウス左アップ]イベント マウスの左ボタンが放された直後に一度だけ発生する
↓
[マウス左クリック]イベント マウスの左ボタンをクリックしたときに発生する 注12
↓
[コマンドボタンの実行] 機能1から機能4までを順次実行する
従って、[マウス左クリック]イベントでイベントプロシージャを呼び出すのではなく、
[コマンドボタン]の[機能名:手続き実行]で一般プロシージャを呼び出すのが定番の方法になります。
なお、[マウス左クリック]イベントは絶対に使わないというのではなく、
・Shift + マウス左クリックした時
・Ctrl + マウス左クリックした時
・普通に マウス左クリックした時
これらのモードが必要な場合には、Shift や Ctrl のフラグを検出するために [マウス左クリック]イベントを使用する必要があります。
しかし、Shift や Ctrl を併用するユーザインターフェースは決して特殊ではありませんが、あまり一般的ではないと思います。
従って、次の原則に従うことをおススメします。
コマンドボタンの原則
× [マウス左クリック]イベントでイベントプロシージャを呼び出す
○ [コマンドボタン]の[機能名:手続き実行]で一般プロシージャを呼び出す
注12:[マウス左クリック]のイベントプロシージャで参照引数の &処理中止にイチ(1)を代入するとコマンドボタンは実行されません。
12.4 コマンドボタンの機能の実行
コマンドボタンには、最大4個の機能を割り当てることができます。そして、機能1から機能4までを順次実行します。
例えば、次のコマンドボタン: cmdなし を実行した場合には、
┌───────────────────────┐
│オブジェクト名: cmdなし │
│標題 :なし │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 なし │
│3 なし │
│4 なし #代入( &実行リターン, 99 )│
└───────────────────────┘
1 機能名:なし → 2 機能名:なし → 3 機能名:なし → 4 機能名:なし の順で実行します。
なお、4 機能名:なし では、機能パラメータリストに式( #代入( &実行リターン, 99 ) )が設定してありますので、
組み込み変数:&実行リターン に 99 が代入されます。
■実行条件
if 文に相当するのは[機能名:実行条件] です。[機能パラメータリスト]には条件式を指定します。※else 文相当はありません。
┌───────────────────────┐
│オブジェクト名: cmdなし │
│標題 :なし │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 実行条件 ( &実行リターン = 0 ) │
│3 なし │
│4 なし #代入( &実行リターン, 99 )│
└───────────────────────┘
┌─ 条件式が真ならば 3 機能名:なし → 4 機能名:なし の順で実行します。
1 機能名:なし → 2 機能名:実行条件 ─┤
└─ 条件式が偽ならば 残りの3. 4. の機能を実行しない
■ファイル名入力
[機能名:ファイル名入力]は、レガシーな古典一括処理の[ファイル名入力]コマンドよりも機能が豊富なので断然おススメします。
なお、機能の説明には呆れるほど簡素な構文しかありません。
<1.ファイル名>,<2.表題>,<3.ファイル拡張子>,<4.ファイルフィルタ>,<5.初期フォルダ名>,<6.ボタンの名前> ※著者( ONnoji )が数字を付加して角括弧は省略しました
さすがに↑これでは具体的な書き方がサッパリ分かりませんので、桐ヘルプの[入力支援ボタン リストの種別:ファイル名選択]を参照します。
【存在するファイル名を入力する例】<6.ボタンの名前>を指定しなかった場合にはボタン名は[開く(O)]になります
┌──────────────────────────────────────────────────────────┐
│オブジェクト名: cmdファイルを開く │
│標題 :開く │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 ファイル名入力 &STR,"ファイルを開く","tbx","表(*.tbx)|*.tbx|フォーム(*.wfx)|*.wfx|すべて(*.tbx
*.wfx)|*.tbx;*.wfx" │
│3 なし │
│4 なし #代入( &実行リターン, 99 ) │
└──────────────────────────────────────────────────────────┘
※<1.ファイル名>, <2.表題>, <3.ファイル拡張子>, <4.ファイルフィルタ> ※著者( ONnoji )が数字を付加しました
※ファイルフィルタはパイプ記号( | )で区切ります
【存在しないファイル名を入力する例】<6.ボタンの名前>を「保存(&S)」「書き出し(&W)」「Save(&S)」「Write(&W)」のいずれかにします。
┌─────────────────────────────────────────────┐
│オブジェクト名: cmdテキストファイルを保存する │
│標題 :テキストファイルを保存 │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 ファイル名入力 &STR, "テキストの保存", "txt","テキスト(*.txt)|*.txt", "", "保存(&S)" │
│3 なし │
│4 なし #代入( &実行リターン, 99 ) │
└─────────────────────────────────────────────┘
※<1.ファイル名>, <2.表題>, <3.ファイル拡張子>, <4.ファイルフィルタ>,
<5.初期フォルダ名>, <6.ボタンの名前> ※著者( ONnoji )が数字を付加しました
※ファイルフィルタはパイプ記号( | )で区切ります
なお、[入力支援ボタン]の[リストの種別:ファイル名選択]では、パラメータリストに[ファイル名を受け取る変数名]がありませんが、
それ以外のパラメータは同じ並び順なので、桐ヘルプの[入力支援ボタン]の[リストの種別:ファイル名選択]の項を参照してください。
必ず参考になるはずです。
−パラメータリストの対照表−
【機能名 :ファイル名入力】<1.ファイル名>, <2.表題>, <3.ファイル拡張子>,
<4.ファイルフィルタ>, <5.初期フォルダ名>, <6.ボタンの名前>
【入力支援ボタン:ファイル名選択】 <1.タイトル>, <2.拡張子>, <3.種類>,
<4.ファイルの場所>, <5.ボタン名>
【引用】桐10s ヘルプ ― 入力支援ボタン リストの種別:ファイル名選択
<5.ボタン名> [OK]ボタンに相当するボタンの名前を指定します。
ボタン名にアクセスキーを含める場合は、アクセスキーにする英数字の前に & をつけます。アクセスキーおよび & は、半角で指定します。
このパラメータが未定義の場合は、ボタン名が[選択(&S)]になります(アクセス キー=S)。
存在しないファイル名を入力する場合は、ボタン名を「保存(&S)」、「書き出し(&W)」、「Save(&S)」、「Write(&W)」のいずれかにします。
これらの名前の先頭が同じであれば、存在しないファイル名も入力できるようになります(「&Save」では認識できません)。
■キャンセルによる機能の順次実行の中断
例えば、[機能名:ファイル名入力]で表示したファイル名入力のダイアログボックスで、
[キャンセル][×][Esc]キーを押した場合には、機能の順次実行が中断します。
┌─────────────────────────────────────────────┐
│オブジェクト名: cmdテキストファイルを保存する │
│標題 :テキストファイルを保存 │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 ファイル名入力 &STR, "テキストの保存", "txt","テキスト(*.txt)|*.txt", "", "保存(&S)" │
│3 なし │
│4 なし #代入( &実行リターン, 99 ) │
└─────────────────────────────────────────────┘
┌─[保存]を押すと 3 機能名:なし → 4 機能名:なし の順で実行します。
1 機能名:なし → 2 機能名:ファイル名入力 ─┤
└─[キャンセル][×][Esc]でキャンセルすると残りの3. 4. の機能を実行しない
同様なものとしては[機能名:モーダルフォーム]等がありますが、詳しくは以下の引用を参照してください。
著者( ONnoji )注:[機能名:フォーカス移動]もフォーカスが移動出来ない場合には、機能の順次実行が中断されます。
【引用】桐10s ヘルプ ― [コマンドボタン]オブジェクト(フォーム)
つぎの機能を実行した場合は、以降の機能が実行されません。※著者( ONnoji )注:「以降の機能」とは、機能の順次実行のこと
・開く(一括処理ファイルを開いた場合のみ)
・閉じる
・表編集へ
・フォームの選択
・一括処理へ戻る
・桐の終了
・モーダルフォーム(「破棄終了」または[Esc]キーで閉じた場合)
・実行条件([機能パラメータ]の条件式の結果が偽のとき)
・ファイル名入力([Esc]キーまたは[キャンセル]ボタンで閉じた場合)
・ダイアログボックスが出る機能([Esc]キーまたは[キャンセル]ボタンで閉じた場合)
↑
注意:パラメータリストを指定しない場合に、ダイアログボックスが現れる機能名がありますが、
このヘルプに書かれているように機能の順次実行が中断されないものもあります
12.5 コマンドボタンの機能グループ・機能名・機能パラメータ・説明・起動条件など
凡例
【機能名】 【機能パラメータ】 【説明】
< と > で囲まれた内容はパラメータである <パラメータ> ::= 右辺 は定義である
[ と ] で囲まれた内容はオプションである { }で囲まれた内容の | は選択を表す
, は連結を表す
| は選択を表す
(例)
書き出し_表 <書き出し条件名>[,<ファイル名>[,<書き出しモード>]] <書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"追加"|"中止"}
機能グループ |
機能名 |
機能パラメータ |
説明 |
起動条件など |
ファイル |
閉じる |
<終了モード> |
式として評価した結果が{"保存する"|"破棄する"|"確認する"}
のいずれかであること。
省略値は"確認する"。 |
次の機能は実行されない。
以降の機能名2.3.4.を実行しない |
上書き保存 |
|
|
|
開く |
<ファイル名>[,<オプション>...] |
パラメータは文字列式として評価する。
桐のファイル、またはシェルで実行できるファイル名を指定する。
実行プログラム(.EXE)以外のファイル名を相対パスで指定すると、
このフォームのパスを想定する。
URLも指定できる。
起動パラメータが必要な場合にはシェル実行を使用すること。
<オプション>::={"共有する"|"更新しない"|"定義"|"印刷"} |
開けなければ中止する。 |
表整理 |
<圧縮率> |
<圧縮率>::={0|10|20|30|40|50} |
|
結合表の再抽出 |
なし |
編集対象表(結合表)を再抽出して表示する。 |
|
読み込み_表 |
<読み込み条件名1>[,<ファイル名1>[<読み込み条件名2>[,<ファイル名2>]...] |
パラメータは文字列式として評価する。
読み込み条件名、変更するファイル名を式で設定できる。 |
読み込みできないときには中止する。 |
読み込み_テキスト |
<読み込み条件名1>[,<ファイル名1>[<読み込み条件名2>[,<ファイル名2>]...] |
パラメータは文字列式として評価する。
読み込み条件名、変更するファイル名を式で設定できる。 |
読み込みできないときには中止する。 |
読み込み_K3 |
<読み込み条件名1>[,<ファイル名1>[<読み込み条件名2>[,<ファイル名2>]...] |
パラメータは文字列式として評価する。
読み込み条件名、変更するファイル名を式で設定できる。 |
読み込みできないときには中止する。 |
読み込み_CSV |
<読み込み条件名1>[,<ファイル名1>[<読み込み条件名2>[,<ファイル名2>]...] |
パラメータは文字列式として評価する。
読み込み条件名、変更するファイル名を式で設定できる。 |
読み込みできないときには中止する。 |
読み込み_PDF |
<読み込み条件名1>[,<ファイル名1>[<読み込み条件名2>[,<ファイル名2>]...] |
パラメータは文字列式として評価する。
読み込み条件名、変更するファイル名を式で設定できる。 |
読み込みできないときには中止する。 |
書き出し_表 |
<書き出し条件名>[,<ファイル名>[,<書き出しモード>]] |
パラメータは文字列式として評価する。
<書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"追加"|"中止"}
同名ファイルが存在したときの処理を指定する。 |
書き出しできないときでも中止しない。 |
書き出し_テキスト |
<書き出し条件名>[,<ファイル名>[,<書き出しモード>]] |
パラメータは文字列式として評価する。
<書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"追加"|"中止"}
同名ファイルが存在したときの処理を指定する。 |
書き出しできないときでも中止しない。 |
書き出し_K3 |
<書き出し条件名>[,<ファイル名>[,<書き出しモード>]] |
パラメータは文字列式として評価する。
<書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"追加"|"中止"}
同名ファイルが存在したときの処理を指定する。 |
書き出しできないときでも中止しない。 |
書き出し_CSV |
<書き出し条件名>[,<ファイル名>[,<書き出しモード>]] |
パラメータは文字列式として評価する。
<書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"追加"|"中止"}
同名ファイルが存在したときの処理を指定する。 |
書き出しできないときでも中止しない。 |
書き出し_転置 |
<書き出し条件名>[,<ファイル名>[,<書き出しモード>]] |
パラメータは文字列式として評価する。
<書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"中止"}
同名ファイルが存在したときの処理を指定する。 |
書き出しできないときでも中止しない。 |
書き出し_表の枠組み |
<書き出し条件名>[,<ファイル名>[,<書き出しモード>]] |
パラメータは文字列式として評価する。
<書き出し条件名>:=書き出し条件名
<ファイル名>::=変更するファイル名
<書き出しモード>:={"上書き"|"中止"}
同名ファイルが存在したときの処理を指定する。 |
書き出しできないときでも中止しない。 |
書き出し_外部データベース |
<書き出し条件名>[,<外部表名>] |
パラメータは文字列式として評価する。
指定された書き出し条件を実行する。
<外部表名>::=変更する外部表名 |
書き出しできないときでも中止しない。 |
併合 |
<併合条件名> |
パラメータは文字列式として評価する。
指定された併合条件を実行する。 |
併合できないときでも中止しない。 |
一覧表印刷 |
<一覧表印刷条件名>,<プレビュー>[,<HTMLファイル名>] |
パラメータは文字列式として評価する。
指定された一覧表印刷条件を実行する。
<プレビュー>::={"しない"|"する"|"HTML"}
指定がないときには"しない"。
"HTML"を指定した場合には<HTMLファイル名>を指定する。 |
印刷できないときでも中止しないで、以降を実行する。
モーダルフォーム表示中はプレビューはできない。 |
レポート印刷 |
<レポートファイル名>,<プレビュー>,<表示状態の引継ぎ>[,<HTMLファイル名>] |
レポート印刷を実行する。
<レポートファイル名>::=文字列式でレポートファイル名を指定する
<プレビュー>::={"する"|"しない"|"HTML"}
指定がないときには"する"。
<表示状態の引継ぎ>::={"する"|"しない"}
指定がないときには"する"。
"HTML"を指定した場合には<HTMLファイル名>を指定する。 |
印刷できないときでも中止しないで、以降を実行する。
モーダルフォーム表示中はプレビューはできない。 |
編集 |
訂正 |
<オブジェクト名> |
指定されたオブジェクト名の場所にフォーカスを移動して、
訂正状態(表を扱っているときには行訂正状態)にする。
サブフォームを指定するとサブフォームに対する機能となる。 |
訂正状態にならなければ中止する。 |
表示/訂正 |
なし |
表示と訂正(行訂正、行挿入、行追加、グループ操作)モードを切り換える。 |
|
表示 |
<確定モード>[,<オブジェクト名>] |
パラメータは文字列式として評価する。
<確定モード>::={"確定する"|"破棄する"}
<オブジェクト名>が指定されていれば、
指定したオブジェクト名の場所にフォーカスを移動する。 |
表示状態にならなければ中止する。 |
ジャンプ |
<位置指定>|<行番号>|<相対位置>|<明細番号位置> |
式の結果を評価する。
<位置指定>::={"次行"|"前行"|"次画面"|"前画面"|"先頭"|"最終"|"終端"}
<行番号>::=<数値式>
<相対位置>::={+<数値式>|−<数値式>}
<明細番号位置>::=*<数値式> |
数値式やT,Bなどで該当する行がなければエラーになり中止する。
リストで指定できる文字列の場合にはエラーにはならずに続行する。
明細番号位置は、現在の処理対象行を、指定した明細番号位置に移動する機能である。 |
フォーカス移動 |
<オブジェクト名> |
<オブジェクト名>の場所にフォーカスを移動する。 |
移動できなければ中止する。 |
検索_条件名 |
<検索(絞り込み)条件名> |
条件名は式を評価した結果の文字列。
パラメータの指定がなければ、
検索:条件名のダイアログを表示する。 |
検索できないときには中止する。 |
検索_比較式 |
<検索比較式>|<項目名>|_<文字列式> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を比較式とみなす。
項目名を指定した場合には、
その項目を検索項目にした検索:比較式ダイアログを表示する。
パラメータが無いときには、検索:比較式のダイアログを表示する。 |
検索できないときには中止する。 |
検索_値 |
<検索比較式>|<項目名>|_<文字列式> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を比較式とみなす。
項目名を指定した場合には、
その項目を検索項目にした検索:値ダイアログを表示する。
パラメータが無いときには、検索:値のダイアログを表示する。 |
検索できないときには中止する。 |
次を検索 |
<検索(絞り込み)条件名> |
条件名は式を評価した結果の文字列。
パラメータの指定がなければ、
現在の検索状態で前方検索を実行する。 |
検索できないときには中止する。 |
前を検索 |
<検索(絞り込み)条件名> |
条件名は式を評価した結果の文字列。 |
検索できないときには中止する。 |
次を検索_比較式 |
<検索比較式> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を比較式とみなす。
パラメータが無いときには、
検索:比較式のダイアログを表示する。 |
検索できないときには中止する。 |
前を検索_比較式 |
<検索比較式> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を比較式とみなす。
パラメータが無いときには、
検索:比較式のダイアログを表示する。 |
検索できないときには中止する。 |
項目置換 |
<項目置換式>|<項目名> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を置換式とみなす。
項目名のみを指定した場合には、
その項目を置換項目にした置換:項目置換ダイアログを表示する。
パラメータが無いときには、
最後にフォーカスがある項目を置換項目にした
置換:項目置換のダイアログを表示する。
置換式に局所変数を使用することはできない。 |
置換実行できないときは中止する。
ただし、実行自身が中止されたときには継続処理する。 |
置換_条件名 |
<置換条件名> |
パラメータは文字列式として評価する。
指定された置換条件を実行する。 |
置換実行できないときは中止する。
ただし、実行自身が中止されたときには継続処理する。 |
元に戻す |
なし |
|
|
削除 |
なし |
|
|
すべて選択 |
なし |
|
|
クリップボード |
コピー |
[<ソース名>] |
<ソース名>::=コピーした値を設定するソース(項目名または変数)
省略するとクリップボードにのみデータを保存する。 |
|
切り取り |
[<ソース名>] |
<ソース名>::=切り取った値を設定するソース(項目名または変数)
省略するとクリップボードにのみ切り取りデータを保存する。 |
|
貼り付け |
[<ソース名>] |
<ソース名>::=貼り付けの元になるソース(式)
省略すると現在のクリップボードの内容を貼り付ける。 |
|
機能グループ |
機能名 |
機能パラメータ |
説明 |
起動条件など |
表示 |
ズームイン |
なし |
フォームを10%単位で拡大表示する(最大400%)。 |
|
ズームアウト |
なし |
フォームを10%単位で縮小表示する(最小10%)。 |
|
表編集へ |
なし |
現在の対象表を表形式編集画面で表示する。 |
次の機能は実行されない。
以降の機能名2.3.4.を実行しない |
フォームの選択 |
<フォームのファイル名> |
パラメータは文字列式として評価する。 |
次の機能は実行されない。
以降の機能名2.3.4.を実行しない |
削除行 |
<削除行表示モード> |
パラメータは文字列式として評価する。
<表示モード>::={"有効"|"無効"|"有効/無効"}
省略値は"有効/無効"。 |
|
スラッシュメニュー |
なし |
|
|
行操作 |
行挿入 |
<オブジェクト名> |
指定されたオブジェクト名の場所にフォーカスを移動して、
行挿入状態にする。
サブフォームを指定するとサブフォームに対する機能となる。 |
行挿入モードにならなければ中止する。 |
行追加 |
<オブジェクト名> |
指定されたオブジェクト名の場所にフォーカスを移動して、
行追加状態にする。
サブフォームを指定するとサブフォームに対する機能となる。 |
行追加状態にならなければ中止する。 |
行削除_指定行 |
<確認モード> |
パラメータは文字列式として評価する。
<確認モード>::={"確認する"|"確認しない"}
省略値は"確認する"。 |
あらかじめ行が選択されていなければならない。
ただし、セレクターがなければ現在行のみを対象とする。
行削除が行われなければ中止する。 |
行削除_全行 |
<確認モード>[,<圧縮率>] |
パラメータは文字列式として評価する。
<確認モード>::={"確認する"|"確認しない"}
省略値は"確認する"。
<圧縮率>::{0|10|20|30|40|50}
<圧縮率>を省略すると圧縮はしない。 |
行削除ができない状態でも次に進む。
ただし、エラーの場合には中止する。 |
行復活_指定行 |
<確認モード> |
パラメータは文字列式として評価する。
<確認モード>::={"確認する"|"確認しない"}
省略値は"確認する"。 |
あらかじめ行が選択されていなければならない。
ただし、セレクターがなければ現在行のみを対象とする。
行復活が行われなければ中止する。
"確認する"はセレクターが無いときのみ(現在行の復活)有効。 |
行復活_全行 |
<確認モード> |
パラメータは文字列式として評価する。
<確認モード>::={"確認する"|"確認しない"}
省略値は"確認する"。 |
行復活ができない状態でも次に進む。 |
レコードロック_指定行 |
なし |
|
ロックできなければ中止する。 |
レコードロック_現在行 |
なし |
|
ロックできなければ中止する。 |
ロック解除_全行 |
なし |
|
|
絞り込み_条件名 |
<絞りこみ条件名> |
パラメータは文字列式として評価する。 |
絞り込まれなければ中止する。 |
絞り込み_比較式 |
<絞り込み比較式>|<項目名>|_<文字列式> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を比較式とみなす。
<項目名>を指定した場合は、
その項目を検索項目にした絞り込み:比較式ダイアログを表示する。 |
絞り込まれなければ中止する。 |
絞り込み_値 |
<絞り込み比較式>|<項目名>|_<文字列式> |
先頭が'_'(アンダーライン)で始まっていたら、
以降を式評価した結果を比較式とみなす。
<項目名>を指定した場合は、
その項目を検索項目にした絞り込み:値ダイアログを表示する。 |
絞り込まれなければ中止する。 |
絞り込み_指定行 |
なし |
あらかじめマークした行を絞りこむ。 |
絞り込まれなければ中止する。 |
絞り込み_単一化 |
<単一化条件名> |
パラメータは文字列式として評価する。 |
絞り込まれなければ中止する。 |
絞り込み_重複行 |
<重複行条件名> |
パラメータは文字列式として評価する。 |
絞り込まれなければ中止する。 |
絞り込み_行数 |
<指定行>|<行数> |
パラメータは式として評価する。
<指定行>::={"現在行"|"最終行"}
"現在行"は現在行のみ絞り込む。
"最終行"は現在行から最終行までを絞り込む。
<行数>は現在行から指定行数分絞り込む。 |
絞り込まれなければ中止する。 |
絞り込み_同一値 |
<項目名>|<項目番号> |
項目名は[]で囲む。
項目番号は数値式でもよい。 |
絞り込まれなければ中止する。 |
補集合 |
なし |
現在の絞り込み状態での補集合で絞り込む。 |
実行できなければ中止する。 |
並べ替え_条件名 |
<並べ替え条件名> |
パラメータは文字列式として評価する。
指定された並べ替え条件を実行する。 |
並べ替えられなければ中止する。 |
並べ替え_昇順 |
{<項目名>|<項目番号>}... |
項目名は[]で囲む。
項目番号は式でもよい。 |
並べ替えられなければ中止する。 |
並べ替え_降順 |
{<項目名>|<項目番号>}... |
項目名は[]で囲む。
項目番号は式でもよい。 |
並べ替えられなければ中止する。 |
絞り込み_解除 |
'*'(全解除) | [<絞り込み解除数>[,<処理対象行保持>]] |
パラタメータは式として評価する。
索引状態は含まない。
<絞り込み解除数>::=解除する絞り込み数を指定する
省略値は1。
0は全解除。
負数は解除後の選択数を示す。
<処理対象行保持>::={"保持しない"|"保持する"}
解除前の処理対象行を解除後に保持するかどうかを指定する。
省略時は"保持しない"。 |
式がエラーでない限り次に進む。 |
解除 |
'*'(全解除) | [<解除数>[,<処理対象行保持>]] |
パラタメータは式として評価する。
索引状態も含まれる。
<解除数>::=解除する絞り込み(索引)数を指定する省略値は1。
0は全解除。
負数は解除後の選択数を指定する。
<処理対象行保持>::={"保持しない"|"保持する"}
解除前の処理対象行行を解除後に保持するかどうかを指定する。
省略時は"保持しない"。 |
式がエラーでない限り次に進む。 |
グループ指定 |
<位置指定>|<グループ番号>|<相対位置> |
式の結果を評価し、指定されたグループへジャンプする。
<位置指定>::={"次"|"前"|"先頭"|"最終"}
<グループ番号>::=<数値式>
<相対位置>::={+<数値式>|−<数値式>} |
指定グループが存在しない場合でもエラーにはならない。
ただし、指定できないときには中止する。 |
グループ検索 |
なし |
|
グループ検索状態にできないときには中止する。 |
グループ値訂正 |
なし |
|
グループ値訂正できないときには中止する。 |
グループ追加 |
なし |
|
グループ追加できないときには中止する。 |
グループ再抽出 |
なし |
|
|
グループ解除 |
なし |
再度グループ化するときにはグループ再抽出を実行する。 |
解除できないときには中止する。 |
入力 |
直前値 |
なし |
テキストボックスが編集状態のときに直前値を貼り込む。 |
|
直前行 |
なし |
テキストボックスが編集状態のときに直前行と同じ値にする。 |
|
値複写 |
なし |
値複写を実行する。 |
キャンセルしても以降の機能を実行する。 |
ウィンドウ |
多重化_表編集 |
なし |
現在の対象表を多重化して
表形式編集画面を表示する。 |
|
多重化_フォーム編集 |
<フォームのファイル名> |
現在の対象表を多重化して、
指定したフォーム編集画面を表示する。 |
|
Webビュー
※桐s |
戻る |
<オブジェクト名> |
オブジェクト名は文字列式で指定する。
<オブジェクト名>::=操作するWebビューオブジェクト名
指定したオブジェクトの表示履歴から1つ戻る。 |
|
進む |
<オブジェクト名> |
オブジェクト名は文字列式で指定する。
<オブジェクト名>::=操作するWebビューオブジェクト名
指定したオブジェクトの表示履歴から1つ進む。 |
|
更新 |
<オブジェクト名> |
オブジェクト名は文字列式で指定する。
<オブジェクト名>::=操作するWebビューオブジェクト名
指定したオブジェクトの表示を更新する。 |
|
ホーム |
<オブジェクト名> |
オブジェクト名は文字列式で指定する。
<オブジェクト名>::=操作するWebビューオブジェクト名
指定したオブジェクトのホームページに移動する |
|
URL取得 |
<オブジェクト名>,<格納先変数> |
オブジェクト名は文字列式で指定する。
<オブジェクト名>::=操作するWebビューオブジェクト名
<格納先変数>::=URLを格納する変数
指定したオブジェクトが現在表示している URL を変数に格納する。 |
|
機能グループ |
機能名 |
機能パラメータ |
説明 |
起動条件など |
手続き実行 |
手続き実行 |
<手続き名>,<引数の並び> |
<手続き名>::=イベントファイルに定義されている手続き名を記述する
<引数の並び>::=手続きに渡す引数
データ型は一致していなければならない。 |
|
その他 |
再生 |
<WAVファイル名> |
パラメータは文字列式として評価する。
サウンドファイル(WAV)を鳴らす。 |
|
状況依存ヘルプ |
なし |
|
|
モーダルフォーム |
<フォームのファイル名> |
どのようなフォームでもポップアップモーダルで起動する。 |
キャンセル(ESCキーなどによる破棄終了)時には中止する。 |
ファイル名入力 |
<ファイル名>[,<表題>[,<ファイル拡張子>[,<ファイルフィルタ>[,<初期フォルダ名>[,<ボタンの名前>]]]]]
<ファイルフィルタ>については以下を参照してください
桐 - ヘルプ > フォーム > 詳細プロパティ > オブジェクトの属性 > 入力支援ボタン > [リストの種別]、[選択値リスト]
> ファイル名選択 > <3.種類> |
<ファイル名>には文字列変数または項目名を指定する。
その他は文字列式を指定する。
<初期フォルダ名>に変数または項目名を指定したときには、
ファイル名にはフォルダ名を省いたものが設定され、
初期フォルダ名にそのフォルダ名が設定される。
存在しないファイル名を入力する場合には、<ボタンの名前>を「保存(&S)」「書き出し(&W)」「Save(&S)」「Write(&W)」のいずれかにします。
<ボタンの名前>を指定しなかった場合にはボタン名は[開く(O)]になります。
|
実行前に表示状態にする。
表示状態にならなければ中止する。
ファイル名入力ダイアログで「キャンセル」すると実行を中止する。 |
編集制御 |
<編集制御パラメータ1>[,<編集制御パラメータ2>...<編集制御パラメータ32>] |
テキストボックスが編集状態のときのキャレット位置などの制御を行う。
<編集制御パラメータn>::=結果が整数となる式を記述
1:→(右へ) 2:↓(下へ) 3:←(左へ) 4:↑(上へ)
5:行頭へ 6:行末へ 7:文頭へ 8:文末へ 9:文頭/文末
10:BackSpace 11:Del 12:カーソル以降削除 13:強制改行文字
14:全角→半角 15:半角→全角
16:かな→カナ 17:カナ→かな 18:全角<->半角 19:カナ<->かな
20:空白文字表示の切り換え 21::→(右へ)+範囲選択
22::↓(下へ)+範囲選択 23::←(左へ)+範囲選択 24::↑(上へ)+範囲選択
268:ひらがな/カタカナ/英数モード 270:辞書登録
512:記号一覧 513:文字コード一覧 |
|
シェル実行 |
<ファイル名>[,<パラメータ>[,<作業フォルダー名>[,<実行時の大きさ>]]] |
パラメータは全て文字列式として評価する。
<ファイル名>::=プログラムまたはドキュメントのファイル名
<実行時の大きさ>::={"通常のウィンドウ"|"最小化"|"最大化"} |
|
実行条件 |
<実行条件式>[,<チェック条件式>] |
以降の機能を実行するかどうかを実行条件式で指定する。
<チェック条件式>が真のとき凹んだ状態になる。
<チェック条件式>が真でもフラット・フラット(縁有り)のコマンドボタンは凹みません |
実行条件式を指定しない場合には真とみなす。 |
一括処理へ戻る |
なし |
一括起動時には次の一括コマンドから実行する。 |
|
桐の終了 |
なし |
桐を終了させる。 |
|
なし |
なし |
<式>[,<式>...] |
パラメータを式として評価する。 |
|
12.6 コマンドボタンでよくある勘違い
コマンドボタンでよくある勘違いは、以下のような例です。
┌─────────────────────────────────────────────┐
│オブジェクト名: cmdフォームを開いて行追加する │
│標題 :フォームを開いて行追加 │
│ │
│ 機能名 機能パラメータリスト │
│1 開く フォームファイル名 │
│2 行追加 <オブジェクト名> ※←自分自身のフォームが対象です │
│3 なし │
│4 なし │
└─────────────────────────────────────────────┘
これは[機能名:開く]で開いたフォームウィンドウに対して、[機能名:行追加]で行を追加する目論見なのですが、
実際には、[機能名:行追加]の対象は開いたフォームウィンドウではなく、自分自身のフォームの編集対象表です。
つまり、[機能名:開く]や[機能名:モーダルフォーム]で他のフォームウィンドウを開くことは出来ますが、
それ以外の[機能名]は自分自身のフォームウィンドウを対象にするものなのです。
この勘違いは、桐のコマンドに慣れてくるとついついやってしまいがちなので、初級者は特にご注意ください。
13 コマンドボタンでプロシージャを実行する
コマンドボタンでプロシージャを実行する時には、[機能名:手続き実行]の[機能パラメータリスト]にプロシージャ名を指定します。
┌─────────────────────────────────────────────┐
│オブジェクト名: cmdプロシージャを実行する │
│標題 :プロシージャを実行する │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 手続き実行 プロシージャ名,引数1,引数2,… ,引数n │
│3 なし │
│4 なし │
└─────────────────────────────────────────────┘
この時にプロシージャ名の丸括弧" ( ) "は記述しません。また、引数リストがある場合にはコンマ( , )で区切って指定します。
■表示モードに遷移してからプロシージャを実行する
プロシージャ内で実行するコマンド・メソッドは、表示モードでしか実行できないものが多いです。
そのために、呼び出したプロシージャ内で、[更新モード設定]メソッドで表示モードにすることも出来ますが、
次のように[機能名:表示]を加えることで、簡単に表示モードに遷移出来ます。
┌─────────────────────────────────────────────┐
│オブジェクト名: cmdプロシージャを実行する │
│標題 :プロシージャを実行する │
│ │
│ 機能名 機能パラメータリスト │
│1 表示 │
│2 手続き実行 プロシージャ名,引数1,引数2,… ,引数n │
│3 なし │
│4 なし │
└─────────────────────────────────────────────┘
■訂正モードに遷移してからプロシージャを実行する
訂正モードでしか実行できないコマンド・メソッドの場合には、
呼び出したプロシージャ内で、[更新モード設定]メソッドで訂正モードにすることも出来ますが、
次のように[機能名:訂正]を加えることで、簡単に訂正モードに遷移出来ます。
┌─────────────────────────────────────────────┐
│オブジェクト名: cmdプロシージャを実行する │
│標題 :プロシージャを実行する │
│ │
│ 機能名 機能パラメータリスト │
│1 訂正 │
│2 手続き実行 プロシージャ名,引数1,引数2,… ,引数n │
│3 なし │
│4 なし │
└─────────────────────────────────────────────┘
14 オブジェクトとメソッド
オブジェクトという名称から、Win桐がJava等のOOP(object-oriented programming)であると早合点しないでください。
フォームのオブジェクトは、{フォーム,操作バー,セクション,ワークスペース,ファミリ}と[領域]です。
従って、フォームのオブジェクトとは、単に対象物のことであったり、コントロール部品やUI部品のことだったりします。
また、メソッドは、Java等のOOP(object-oriented programming)で使用される用語ですが、Win桐は純粋なOOPではありません。
従って、桐の場合にはフォームおよびセクションに配置したオブジェクトに予め組み込まれているプロシージャと理解するのが適当です。
【まとめ】
Win桐のフォームの場合
・[オブジェクト] … 単に対象物のことであったり、コントロール部品やUI部品のこと
・[オブジェクト]のプロパティ(属性) … オブジェクトの{ 始点X 始点Y 幅 高さ etc. }の情報
・[オブジェクト]のメソッド … オブジェクトに予め組み込まれているプロシージャ(手続き)
[オブジェクト指向プログラミング]は[クラス][インスタンス]といった概念を用いたプログラミング技法です。
Win桐のフォームの場合には、マウスでクリック出来たりするGUIのことをオブジェクトと呼んでいます。
つまり、両者はまったく意味が違うものです。
しかし、「オブジェクト」という言葉だけが同じなので、なんとなくオブジェクト指向と思っちゃう人が後を絶ちません。
このような誤解を[なんちゃってオブジェクト指向]とでも呼びましょうか。(ーー;)
WindowsのようなGUIになると、マルチウィンドウになって、ウィンドウには操作ボタンがあって、
たまたまWin桐では[GUI部品のボタンを“コントロール”と呼ばずに“オブジェクト”]と呼んでいます。
ただそれだけのことを以って誰も[オブジェクト指向]とは言いません。
そもそも、[オブジェクト指向チョメチョメ]が正しい言い方で、[オブジェクト指向]と漠然とした表現自体が誤りです。
14.1 オブジェクトは何種類ある?
フォームのオブジェクトは27種類あります(標準オブジェクトを除く)。
■フォーム・セクション・操作バー・ファミリ
フォーム
フォーム操作バー
グループ操作バー
フォームヘッダ部
フォーム明細部
フォームフッタ部
ワークスペース
ファミリ
■領域 ※並び順は領域種別番号順
ラベル
テキスト
グループ項目
グループボックス
コマンドボタン
トグルボタン
内部トグルボタン
コンボボックス
リストボックス
入力支援ボタン
ピクチャ
直線
楕円
扇形
角丸め矩形
サブフォーム
グラフ
バーコード
行セレクタ
14.2 メソッドは何種類ある?
ちなみにメソッドの種類っていくつあるか知ってる?
33種類。
※かっこ内の数字はメソッドの数
■フォーム(12)
アクティブ設定
キー変換
更新モード取得
更新モード設定
描画禁止
描画更新
表示倍率の設定
フォーカスオブジェクト取得
フォーム選択
変数変更
明細番号取得
明細番号設定
■フォーム|フォームフッタ部|フォームヘッダ部|フォーム明細部|ワークスペース(2)
オブジェクト検査
オブジェクト取得
■フォーム|フォームフッタ部|フォームヘッダ部|フォーム明細部|ワークスペース|テキスト|グループ項目(1)
オブジェクト数
■フォームフッタ部|フォームヘッダ部|フォーム明細部(1)
セクション種別
■テキスト|グループ項目|コマンドボタン|サブフォーム|トグルボタン|リストボックス|行セレクタ(2)
フォーカス設定
フォーカス設定検査
■テキスト|グループボックス|コンボボックス(1)
ソース値取得
■グループ項目(1)
グループソース値取得
■テキスト|グループ項目(7)
値復活
編集選択位置取得
編集選択位置設定
編集選択文字列置換
編集文字列取得
編集文字列設定
編集文字列長
■コマンドボタン(1)
実行
■すべて(5)
オブジェクト種別
親オブジェクト取得
再描画
プロパティ属性
領域種別
― Windows桐のイベント処理によるプログラミングは、オブジェクト指向プログラミングではありません 2017年12月 6日 ― かっこうBBS(三代目)より
今まで再三言ってきたので、この掲示板を見ている人は誤解しないと思いますが、
Windows桐のフォーム+イベント処理によるプログラミングは、オブジェクト指向プログラミングではありません。
フォームにオブジェクトがあるでしょ?と疑問に思う人がいるかもしれません。
確かに、テキストボックスもコマンドボタンもオブジェクトです。
これらのGUI部品はメソッドとプロパティを持ったオブジェクトで間違えありません。
しかし、これらのGUI部品はフォーム定義画面というRAD(以下参照)環境のオブジェクトです。
オブジェクト指向プログラミングとは、RADが提供するGUI部品を操作することではありません。
オブジェクト指向プログラミングとは、プロシージャとデータのセットをクラスとして定義して、クラスをオブジェクトとしてプログラミングすることを指します。
現行のWindows桐では、プロシージャとデータのセットをクラスとして定義できません。
すなわち、Windows桐のイベント処理によるプログラミングは、オブジェクト指向プログラミングではありません。
【引用】Rapid Application Development 出典: フリー百科事典『ウィキペディア(Wikipedia)』
Rapid Application Development(ラピッド・アプリケーション・デベロップメント、RAD)とは、ソフトウェアの開発を容易にする仕組みの1つである。ユーザーを含む少人数のチームで開発を進め、プロトタイプを作って
それを評価するというサイクルを繰り返すことで、完成品に近づけていく。
■特徴
統合開発環境(IDE)のような高機能な開発環境によるプログラミングの半自動化や、視覚的なユーザーインターフェイス(操作画面)の設計、モジュール開発などの機能を備える。
GUIを持つ一般的なソフトウェアの開発を例に取ると、RADではない開発ツールを用いて開発した場合、
ウィンドウを一つ表示させるだけでもかなりの量のソースコードが必要になるが、
RADツール、例えばVisual BasicやInterface Builderなどを用いた場合、
プログラマがソースコードを書かなくても、GUI部品を視覚的に配置するだけでウィンドウを作れる。
また、ウィンドウにボタンやテキストボックスなどのGUI部品を配置して、ユーザー操作に対する処理を関連付けようとすれば、
ハンドルの取得から属性の設定、ウィンドウメッセージの処理までプログラマがソースを書く必要があるが、
前述のようなソフトウェアではそのような処理は開発ツールが自動的に行ってくれる。
つまり大雑把にいうならば、多くのソフトウェアに共通している処理を担うソースを書かなくても自動的に実装してくれるのがRADツールであり、
プログラマーは個々のソフトウェアに必要な固有の機能を担うソースだけを書けばすむのである。
これによって結果的に開発が容易になる。
RADツールを用いた開発の一般的なデメリットとしては、開発されたソフトウェアの動作速度が遅くなる、実行ファイルのサイズが大きくなる、などがよく挙げられる。
しかし、このような傾向は、あくまで開発ソフトウェアによるので、RADを用いたからといって、必ずしもそのようなことが起こるわけではない。
またGUIの設計以外の作業が多いソフトウェアを開発する場合、RADの持つ長所を十分に発揮できない。
15 コマンド
桐のコマンドにも、Win桐がコンプレックス( 英:complex 複合の )であることが大きく影響しています。
すなわち、DOS桐と互換の[古典一括処理]と、ウィンドウハンドル番号を用いた[拡張一括処理]と、
そしてWindowsらしい[フォーム+イベント]で使えるコマンドが重層的に積み重なっています。
おそらく、桐の初級者、および桐で初めてアプリケーションを開発するソフトウェア技術者においては、
このようなコンプレックス( 英:complex 複合の )な状況は想定外であるかと思われます。
そこで、非常に多く用意されている桐のコマンドを整理分類して示すことが重要ではないかと考えます。
本書では、次のように分類する。
・レガシー(古典一括処理・拡張一括処理)なコマンド
・[フォーム+イベント]で利用できるコマンド
■レガシー(古典一括処理・拡張一括処理)なコマンド
コマンド名 │分類│イベントでの使用
───────────┼──┼────────────────────────────
値集合入力 │古典│△編集対象表が表示状態のときのみ操作可能
一括処理実行 │古典│×不可
ウィンドウ会話 │拡張│×不可
ウィンドウ更新 │拡張│△自身のフォームは、表示状態のときのみ実行可能
ウィンドウ作成 │拡張│△フォームの編集対象表のウィンドウを作成することは不可
ウィンドウ終了 │拡張│△自身のフォームに対しては、つねに不可
会話処理実行 │拡張│×不可
確認 │古典│○可能 ←[メッセージボックス]コマンドで代替可
簡易メニュー │拡張│△編集対象表が表示状態のときのみ操作可能
外部DB接続 │拡張│×不可
画面消去 │古典│×不可
画面表示 │古典│×不可
キー入力 │古典│○可能 ←テキストボックス、またはモーダルフォームで代替可
機能キー入力 │古典│×不可
行削除 会話, 指定行│古典│×不可
行削除 表, 範囲 │古典│×不可
行挿入 会話 │古典│×不可
行追加 会話 │古典│×不可
行訂正 会話 │古典│×不可
行表示 │古典│×不可
行復活 会話, 指定行│古典│×不可
行復活 表, 範囲 │古典│×不可
グループ検索 会話 │古典│×不可
グループ値訂正 会話 │古典│×不可
グループ追加 会話 │古典│×不可
システム <番号> │古典│×不可
システム <プログラム> │古典│×不可
絞り込み 会話,指定行│古典│×不可
絞り込み 表, 範囲 │古典│×不可
終了 │古典│×不可
処理行指定 │古典│×不可
使用フォーム │古典│×不可
使用フォーム <フォーム名>│古典│×不可
実行終了 │拡張│×不可
実行制御 │拡張│○可能
図形表示 │古典│×不可 ←フォームの[ピクチャー]オブジェクトで代用可能
整列解除 │古典│△編集対象表が表示状態のときのみ操作可能
属性自動設定 │古典│△フォームの編集対象表は不可
遅延 │古典│×不可
置換 会話 │古典│×不可
中止 │古典│×不可
手続き終了 │古典│△イベント定義の[メイン]処理では不可。
道具箱 削除 │拡張│△編集対象表が表示状態のときのみ操作可能
道具箱 削除,* │拡張│△編集対象表が表示状態のときのみ操作可能
道具箱 追加 │拡張│△編集対象表が表示状態のときのみ操作可能
トレース │古典│○可能
トレース 確認 │古典│○可能
名札 <名札名> │古典│○可能
<名札名>: │拡張│○可能
表 │古典│△編集対象表が表示状態のときのみ操作可能
表形式編集 │古典│×不可
表示位置 取得 │拡張│△表示状態のときのみ実行可能
表示位置 設定 │拡張│△表示状態のときのみ実行可能
表示位置 同期 │拡張│△表示状態のときのみ実行可能
表示制御 │古典│×不可
表示属性 │古典│×不可
表表示 │古典│×不可
ファイル管理 │古典│○可能
ファイル名入力 │古典│○可能 ←コマンドボタンの[機能名:ファイル名入力]で代替可
フォーム形式編集 │古典│×不可
フォーム表示 │古典│×不可
ブザー │古典│×不可
分岐 │古典│○可能
変数管理 │古典│△イベント定義の[メイン]処理では不可
変数削除 │古典│△イベント定義の[メイン]処理でのみ可能
メニュー │古典│×不可
メニュー2 │古典│○可能 ←コマンドボタン、またはモーダルフォームで代替可
メニュー3 │古典│○可能 ←コマンドボタン、またはモーダルフォームで代替可
文字入力 │古典│×不可
ロック 会話 │拡張│×不可
■[フォーム+イベント]で利用できるコマンド その1
if ( <条件式> ) … end │絞り込み 単一化,条件名
一覧表印刷 (印刷) │絞り込み 重複行
一覧表印刷 (HTML) │絞り込み 重複行,条件名
一覧表印刷 (PDFファイル) │絞り込み 比較式
一覧表印刷 (ファイル出力) │絞り込み 補集合
一括書き出し │絞り込み解除
一括読み込み │終了 表
印字 │ジャンプ 行番号
印字開始 │ジャンプ 行マーク
印字終了 │条件
ウィンドウ位置 最大化|最小化… │条件印字
ウィンドウ位置 取得 │図形パス名(画像パス名)
ウィンドウ位置 設定 │多重化
│代入
ウィンドウ情報取得 │置換
ウィンドウリスト取得 │置換 条件名
エクセル │中止 表
エクセル書き出し │注釈
エラー処理 │定義書き出し 外部DB
オブジェクト操作 取得 │定義書き出し 結合
オブジェクト操作 設定 │定義書き出し フォーム
カーソル移動方向 │定義書き出し レポート
解除 │定数宣言
会話検索 値,<時間型項目> │手続き実行 イベントハンドラ
会話検索 値,<数値型項目> │手続き実行 <手続き名>
会話検索 値,<日時型項目> │手続き実行 <名札名>
会話検索 値,未定義|定義 │手続き定義開始
会話検索 値,<文字列型項目> │手続き定義開始 イベントハンドラ
会話検索 比較式 │手続き定義終了
会話絞り込み 値,<時間型項目> │転置集計
会話絞り込み 値,<数値型項目> │転置集計 条件名
会話絞り込み 値,<日時型項目> │データ行
会話絞り込み 値,未定義|定義 │データパス名
会話絞り込み 値,<文字列型項目> │トランザクション
会話絞り込み 比較式 │
書き出し CSV │
書き出し K3 │トレース出力
書き出し 条件名 │並べ替え
書き出し 定義 │並べ替え 索引名
書き出し テキスト │並べ替え 条件名
書き出し 転置 │表 <表ファイル名>
書き出し 表 │表検査
書き出し 枠組み │表作成
外部DB 会話 │表修復
外部DB 接続 │表示条件書き出し
外部DB 切断 │表示条件読み込み
画像パス名 │表示幅
局所変数代入 │表整理
行削除 │ファイル移動
行削除 * │ファイル更新
行集計 │ファイル削除
行集計 (再実行) │ファイル属性
行集計 条件名 │ファイル入力
行集計解除 │ファイル入力開始
行挿入 │ファイル入力終了
行退避 │ファイル複写
行追加 │ファイル変換 CSV
行訂正 │ファイル変換 ODBC
行番号 │ファイル変換 固定長
行復活 │ファイル名変更
行復活 * │フォーム呼び出し
行復旧 │フォルダ削除
行マーク解除 │フォルダ作成
行マーク定義 │フォルダ名入力
空白文字 │プリンタ
繰り返し … 繰り返し終了 │プロセス終了
繰り返し ( <条件式> ) … 繰り返し終了 │併合
繰り返し 回数 … 繰り返し終了 │併合 条件名
繰り返し継続 │編集表
繰り返し中止 │変数書き出し
クリップボード 取得 │変数宣言
クリップボード 設定 │変数読み込み
グラフ条件実行 印刷 │保存表名
グラフ条件実行 表示 │メール解析 情報取得
グラフ条件実行 保存 │メール解析 添付ファイル取得
グループ検索 │メール受信
グループ指定 │メール設定
グループ選択 │メール切断
グループ選択解除 │メール送信
グループ値代入 │メッセージボックス
グループ値訂正 │読み込み CSV
グループ追加 │読み込み K3
ケース開始 … ケース終了 │読み込み PDF
ケース中止 │読み込み 条件名
結合 │読み込み テキスト
検索 条件名 │読み込み 表
検索 比較式 │ライブラリ
項目集計 │利用者コード 会話
項目属性変更 │利用者コード <文字列>
項目属性変更2 │レポート印刷 (印刷)
項目値代入 │レポート印刷 (HTML)
項目名変更 │レポート印刷 (PDFファイル)
コマンド │レポート印刷 (PDFフォーム)
再抽出 │レポート印刷 (ファイル出力)
サウンド 再生 │ロック
サウンド 停止 │ロック *
削除行 │ロック解除
シェル実行 │ロック解除 *
絞り込み 行数 │* <注釈>
絞り込み 条件名 │/* <注釈> */
絞り込み 単一化 │
■[フォーム+イベント]で利用できるコマンド その2 (条件を作成削除するコマンド)
一覧表印刷条件 行グループ │検索条件削除
一覧表印刷条件 行属性 │検索条件登録
一覧表印刷条件 項目名属性 │索引削除
一覧表印刷条件 データ属性 │索引定義
一覧表印刷条件 表属性 │索引名変更
一覧表印刷条件 表題 │絞り込み条件削除 単一化
一覧表印刷条件 ファイルフッタ │絞り込み条件削除 重複行
一覧表印刷条件 ファイルヘッダ │絞り込み条件登録 単一化
一覧表印刷条件 ページフッタ │絞り込み条件登録 重複行
一覧表印刷条件 ページヘッダ │条件名変更
一覧表印刷条件 列属性 │置換条件削除
一覧表印刷条件開始 │置換条件登録
一覧表印刷条件終了 │転置集計条件削除
一覧表削除 │転置集計条件登録
書き出し条件削除 │並べ替え条件削除
書き出し条件登録 CSV │並べ替え条件登録
書き出し条件登録 K3 │並べ替え条件登録 索引名
書き出し条件登録 外部DB │表示条件 列属性
書き出し条件登録 テキスト │表示条件開始
書き出し条件登録 転置 │表示条件削除
書き出し条件登録 表 │表示条件終了
書き出し条件登録 枠組み │併合条件削除
行集計条件削除 │併合条件登録
行集計条件削除 条件名 │読み込み条件削除
行集計条件削除 条件名 = * │読み込み条件登録 CSV
行集計条件登録 │読み込み条件登録 K3
行集計条件登録 条件名 │読み込み条件登録 PDF
グラフ条件開始 │読み込み条件登録 テキスト
グラフ条件 X軸 │読み込み条件登録 表
グラフ条件 Y軸 │
グラフ条件 キャプション1 │
グラフ条件 キャプション2 │
グラフ条件 項目 │
グラフ条件 仕上げ │
グラフ条件 凡例 │
グラフ条件 表題 │
グラフ条件 副Y軸 │
グラフ条件 副仕上げ │
グラフ条件削除 │
グラフ条件終了 │
16 イベント
イベントとは、コンピュータを操作する人が行なった操作、またはその操作によって発生した一連の出来事のことをいいます。[3]
16.1 イベントは何種類ある?
イベントは45種類あります。[名札 メイン]もイベントにカウントします。
※かっこ内の数字はイベントの数
■(なし)
名札 メイン
■フォーム(27)
キーアップ
キーダウン
キー入力
行削除開始
行削除終了
行挿入エラー
行挿入開始
行挿入終了
行挿入終了前
行訂正エラー
行訂正開始
行訂正終了
行訂正終了前
グループ移動
グループ検索開始
グループ検索終了
グループ値訂正開始
グループ値訂正終了
グループ追加開始
グループ追加終了
システムキーアップ
システムキーダウン
タイマー1
タイマー2
フォーム開始
フォーム終了
レコード移動
■テキスト|グループ項目|コンボボックス(テキスト+リストボックス)|グループボックス|トグルボタン|ファミリ(1)
ソース値更新
■テキスト|グループ項目|コマンドボタン|ラベル|ピクチャ|ファミリ(1)
マウスインアウト
■テキスト|グループ項目(3)
入力前
編集文字列変更
入力後
■テキスト|グループ項目|ファミリ(1)
編集開始
■リストボックス(1)
選択値変更
■テキスト|グループ項目|コマンドボタン|トグルボタン|リストボックス|行セレクタ|サブフォーム|ファミリ(2)
フォーカス取得
フォーカス喪失
■入力支援ボタン(2)
入力支援オープン
入力支援クローズ
■フォーム|フォームフッタ部|フォームヘッダ部|フォーム明細部
扇形|角丸め矩形|行セレクタ|グラフ|グループ項目|グループボックス
コマンドボタン|コンボボックス|楕円|テキスト|トグルボタン|バーコード|ピクチャ|ラベル|ファミリ(5)
マウス移動
マウス左アップ
マウス左ダウン
マウス右アップ
マウス右ダウン
■扇形|角丸め矩形|行セレクタ|グラフ|グループ項目|グループボックス
コマンドボタン|コンボボックス|楕円|テキスト|トグルボタン|バーコード|ピクチャ|ラベル|ファミリ(1)
マウス左クリック
16.2 イベント過多症候群
「そこに山があるから山に登る」が如く、単純にイベントが用意されているからという理由でイベントを使うべきではありません。
まず、コマンドボタンの機能や一般プロシージャなどを検討しましょう。
次に、コマンドボタンの機能や一般プロシージャなどを試してみましょう。
それでも、問題解決が出来ない場合にイベントを使うことを考えましょう。
ちなみに、著者( ONnoji )は、今まで以下のイベントを使ったことがありません。※これは 2019/04/28 の時点において
これはこれらのイベントが不要だという意味ではなく、今までこれらのイベントを使う必要がなかったというだけです。
キー入力
行削除開始
行削除終了
行挿入エラー
行挿入開始
行挿入終了
行挿入終了前 ← 2022-09-01 に初めて使用しました (^^ゞ
行訂正エラー
行訂正開始
行訂正終了
行訂正終了前
グループ移動
グループ検索開始
グループ検索終了
グループ値訂正開始
グループ値訂正終了
グループ追加開始
グループ追加終了
― イベント初心者講座 その1 ONnoji 2002年01月25日 12時04分 ― 桐のイベント道場より
初級者の場合には、イベントを駆使することが凄いプログラム!というふうに誤解されている人が多いのではないかと心配しています。
上級者は必要がなければイベントは使用しないものです。
それではどういうときにイベントが必要になるのだろうか?という疑問がわくと思いますが…
その答え:フォームを使う人にとって親切なフォームを作る場合です。
別のいい方をすれば優れたユーザーインターフェースを構築する場合にイベントを使うのです。
プログラム作りでは、あくまでも使う人の気持ちを中心に考えることが大切です。
ですから、使う人が必要としていない機能を作って自慢したりしてはいけないのです。
桐に組み込まれている機能は優れているので、大抵の場合にはイベントを作る必要はないことも覚えてください。
しかし、桐に元々ある機能だけではやりたい機能が実現できない場合に初めてイベントを検討するというわけです。
― コマンドボタンの機能だけでも結構使える 2006/4/1(土) ― ブログ版 桐のイベント道場より
桐のフォームのコマンドボタンオブジェクトには豊富な機能があります。
コマンドボタンの機能で一般手続きを呼び出さなくても結構なものが作れるはずです。
そこで、
まずコマンドボタンの機能を試してみるべきです。
それでも目的に対して不十分な場合に、初めて機能名:手続き実行で一般手続きを呼び出すと良いです。
コマンドボタンで手続きを呼び出す場合には、
コマンドボタン自身の[マウス左クリック]イベントを利用する必要はありません。
― イベント過多症候群( Too much is as bad as too little ) 2006/4/11(火) ― ブログ版 桐のイベント道場より
コマンドボタンから呼び出す「一般手続き」はプログラムの作者が作り出すものです。
一方、イベントに対応した「イベントハンドラ」は、イベントのプロパティ(属性)をオンにするだけで気軽に作れます。
しかし、本当にこのイベント(とイベントハンドラ)が必要なのかは、試してみなければ判らないことが実に多いのです。
まず、試してみよ。
次に、取捨選択するべきです。
時折、イベントがテンコ盛のプログラムを見ることがあります。
この場合には、プログラムの作者はいろいろ試して、そうしたのだと考えます。
しかし、本当にこのイベント必要なの〜?
と、思わされるプログラムに出会うことも多々あります。
イベントをたくさん使用すると、多重発生する可能性が高くなります。
もしも、多重発生した場合には、その発生順序を把握しておく必要があります。
ですから、発生順序を把握していない場合には、何が起きるかサッパリ見当が付きません。
だから、イベントは、ほどほどに使うことがコツです。
過ぎたるは及ばざるがごとし( Too much is as bad as too little )
16.3 テキストボックスのイベント
テキストボックスの[ソース]属性に編集対象表の項目名、または変数名がセットされている場合、
表示モードから訂正等の更新モードに遷移するとテキストボックスの中にキャレット(文字カーソル)が現れます。
桐のヘルプではこの事を[エディタ]に入ったと表現していますが、しかし[エディタ]と聞いてもチンプンカンプンな人も居ます。
はたして、[エディタ]とは何なのでしょうか?
テキストボックスの[ソース]属性が編集対象表の項目と変数のどちらの場合でも、値を入力する時にはテキストボックスはテキストエディタとして動作します。
つまり、テキストボックスにキャレットが表示された時には、すなわちテキストエディタ=[エディタ]に入っているわけです。
┌────────【エディタ内】─────────────┐
│ │
[入力前]イベント │[編集開始]イベント [入力後]イベント │[ソース値更新]イベント
┌─────────────┐│┌────────┐ ┌─────────────┐│┌───────────┐
│オブジェクト名:: │││オブジェクト名::│ │オブジェクト名:: │││オブジェクト名:: │
│入力前( │││編集開始() │ │入力後( │││ソース値更新() │
│参照 文字列 &編集文字列) │ │ │ │参照 文字列 &編集文字列,│ │ │
│ ├→┤ ├→┬→┤ 長整数 &モード, ├→┤ │
│ │ │ │ │ │参照 長整数 &入力継続) │ │ │
│ │││ │ │ │ │││ │
└─────────────┘│└────────┘ │ └─────────────┘│└───────────┘
│ │ │
│ [編集文字列変更]│ │
│ イベント │ │
│ ┌───┴────┐ │
│ │オブジェクト名::│ │
│ │編集文字列変更()│ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └────────┘ │
└────────【エディタ内】─────────────┘
エディタの関連のイベントは↑上の図のように5種類あります。
[入力前]イベント→{[編集開始]イベント→[編集文字列変更]イベント→[入力後]イベント}→[ソース値更新]イベント
括弧({})で示した範囲は、エディタ内のイベントです。
―[入力前]イベント
エディタにへ入る前に発生するイベントです。
編集文字列を変更できます。
具体的には、引数:&編集文字列 に任意の文字列を代入します。
―[編集開始]イベント
エディタに入った直後に発生するイベントです。編集文字列を範囲選択できます。
(例)
**編集文字列をすべて範囲選択します
メソッド呼び出し 戻り値= &文字数,&this.編集選択位置設定( 1 ,-1 )
(例)
**文字カーソル位置を末尾に移動します ※2つのメソッドを一対(ペア)にして実行します
メソッド呼び出し &this.編集選択位置設定( 1 ,-1 )
メソッド呼び出し &this.編集選択位置設定( 0 ,0 )
―[編集文字列変更]イベント
エディタの編集文字列が変更されたときに発生するイベントです。
―[入力後]イベント
エディタから脱出する直前に発生するイベントです。
このイベントではまだエディタから脱出していません。
・引数:&編集文字列
編集した文字列を最適化する場合には、引数:&編集文字列 の値を変更します
・引数:&モード
確定([Enter]キーや[F4]キー)か破棄( [Esc]キーによるキャンセル)を判定する
・引数:&入力継続
イチ(1)を代入するとエディタから脱出しないで、再び編集エディタに戻る
↑
※著者( ONnoji )注:安易にこれを使用すると、ユーザが混乱する恐れがあります。
使用に当たっては、メッセージボックスを表示してユーザの意思を確認することが望ましいです。
なお、入力値に誤りがある場合には、再び編集エディタに戻らず、テキストボックスの文字色を赤にする等も効果的です。
―[ソース値更新]イベント
エディタを[Enter]キー/[F4]キー/[tab]キー/[Shift]+[tab]キー/他による確定で脱出した時に発生します。
重要:タイトルバーの[×]ボタンなどでフォームを閉じるときにも発生します。
エディタを[Esc]キーによるキャンセルで脱出した場合には発生しません。
【引用】キャレットとは何? Weblio辞書
キャレット 【英】caret
カーソルとしてのキャレットは、文字間で識別しやすい縦棒の形状をしており、たいていの場合は点滅で表示されている。
キャレットはいわゆるカーソルと同じ意味であるが、特にマウスカーソルなどと区別したい場合に用いられることがある。
16.4 [ソース値更新]イベントの注意点
[ソース値更新]イベントは、{テキスト|グループ項目|コンボボックス(テキスト+リストボックス)|グループボックス|トグルボタン|ファミリ}オブジェクトで利用できます。
ただし、{テキスト|グループ項目}と{グループボックス|トグルボタン}では発生の仕方が異なります。
{テキスト|グループ項目} ― 単にエディタを確定で脱出した場合に発生する※必ずしも[ソース]属性の項目または変数の値を変更する必要はない
{グループボックス|トグルボタン} ― [ソース]属性の値を変更した場合に発生する
※トグルボタンの[ボタンの種類]は、オプションボタン/チェックボックス/プッシュボタンの3通り
なお、コンボボックス(テキスト+リストボックス)では、コンボボックスの テキストボックスのエディタに入っている時にはテキストボックスとして、
※コンボボックス内のテキストボックスは[マウスイベント]属性をオフにするとフォーカス出来なくなりエディタに入らなくなります。
コンボボックスのリストボックスを操作した場合にはグループボックスと同じになります。
このようにイベントの発生が仕方が異なるにもかかわらず、両者に同じイベント名が使われているので注意してください。
おそらく、本来の[ソース値更新]イベントは{グループボックス|トグルボタン}の方で、エディタが関係する{テキスト|グループ項目}の方は後から援用したものかもしれません。
{テキスト|グループ項目}の[ソース値更新]イベントは単にエディタを確定で脱出した場合に発生するのですが、
困ったことにタイトルバーの[×]ボタンなどでフォームを閉じるときにも発生します。
そのために、{テキスト|グループ項目}の[ソース値更新]イベントのイベントプロシージャで時間がかかる処理をしている場合や、
イベントプロシージャでメッセージボックスやモーダルフォームを表示している場合には、フォームを閉じる際に余計な時間や手間が発生します。
以上の理由から、著者( ONnoji )は、{テキスト|グループ項目}の[ソース値更新]イベントはおススメしません。
― ソース値更新イベントの代用 VK_library 第1.0版 仕様ノート 2005-10-02 ― 桐のイベント道場より
キーダウンイベントの使い道はたくさんあることに気が付きます。
例えば、あるテキストボックスの編集が終了した場合、
引き続きソース値更新イベントで、何かを行うことがあります。
しかし、ソース値更新イベントはあまりにも強力なので、
フォームのタイトルバーの[×](閉じる)ボタンをクリックした場合にも発生してしまいます。
ソース値更新イベントでモーダルフォームを開いていたり、
あるいは時間のかかる処理を行っている場合には、かなりトホホな状態になります。
これはソース値更新イベントを利用する以上避けようがありません。
だからといって、そのためだけに、
フォームのタイトルバーの[×](閉じる)ボタンを表示しないのは、
本末転倒のような気がします。
結局のところ、
・「ソース値更新イベントは便利なので利用したい」
・「タイトルバーの[×](閉じる)ボタンも利用したい」
というのが普通の人情でしょう。
しかし、このジレンマは永久に解消されそうにありません。
テキストボックスのこのジレンマを解消すべく思案の末に辿り着いた結論は…
「いっそのこと、テキストボックスのソース値更新イベントなんかやめてしまえ〜!」ということでした。
※チェックボックスやオプションボタンのソース値更新イベントは問題ありません。
その代替の方法とは、
入力前イベントでキーダウンイベントをONにして、
テキスト編集中にキーの値が Enterキーと評価された場合に、
・任意の一般手続きを実行する
または
・任意のコマンドボタンの[実行( )]メソッドを呼び出す
というものです。
「まあ〜!、面倒なこと!」と思われた人も多いと思いますが、
VK_library を利用すると、簡単な設定と簡単なコマンドで実現できます。
著者( ONnoji )注:VK_library は、VK_Framework に名称を変更しました。
さらに VK_Framework は、INF_Framework 第3.2版 の IPS_Framework に統合される予定です。
16.5 マウス左ダウン/マウス移動/マウス左アップで[ドラッグ&ドロップ]
マウス左ダウン/マウス移動/マウス左アップは、著者( ONnoji )が知る限りこれらのイベントを使うことは稀です。
これらのイベントは[ドラッグ&ドロップ]を実現するために使用します。
[ドラッグ&ドロップ]では[イベント]属性の動的セットが必須です。
ちなみに、拙作:INF_Framework の項目幅の変更機能は、[ドラッグ&ドロップ]の応用例です。
■[ドラッグ&ドロップ]の概要
┌──┐
│ ↓
│ ドラッグするオブジェクトの初期値:{ マウスインアウト = 1, マウス左ダウン = 0, マウス移動 = 0, マウス左アップ = 0 }
│ ↓
│ 操作:ドラッグするオブジェクトの上にマウスカーソル移動する
│ ↓
│ [マウスインアウト]イベント発生 ―{ マウスインアウト = 0, マウス左ダウン = 1, マウス移動 = 0, マウス左アップ = 0 }
│ ↓
│ 操作:マウス左ボタンを押し下げる
│ ↓
│ [マウス左ダウン]イベント発生 ―{ マウスインアウト = 0, マウス左ダウン = 0, マウス移動 = 1, マウス左アップ = 1 }
│ ↓
│ 操作:マウス左ボタンを押し下げたままマウスカーソルを移動させる
│ ↓
│ [マウス移動]イベント発生 ― セクションを再描画
│ ↓
│ 操作:マウス左ボタンを離す
│ ↓
│ [マウス左アップ]イベント発生 ―{ マウスインアウト = 1, マウス左ダウン = 0, マウス移動 = 0, マウス左アップ = 0 }
│ ↓
└──┘
― コラム5 項目の表示幅を自由に変更する ez_width 2002-01-17 ― 桐のイベント道場より
<項目幅を変更する仕組み>
(1) 操 作 :マウスポインタの形が左右矢印(←→)になる ※特記事項を参照
(2) 操 作 :マウス左ボタンを押し下げる
(3) イベント:マウス左ダウン が実行される
┌
│・マーカーを表示する
│・マウス移動、マウス左アップ、キーダウンを on にする
│・マウス左ダウン が終了する
└
(4) 操 作 :ドラッグする
(5) イベント:マウス移動 が実行される
┌
│・マウスポインタの動きに合わせてマーカーを表示する
└
┌(6-A) 操 作 :マウス左ボタンを離す
│(7-A) イベント:マウス左アップ が実行される
│┌
││・マウス移動、マウス左アップ、キーダウンを off にする
││・マーカーを非表示にする
││・項目と見出しの幅を変更する
││・ハンドル(透明)の位置を変更する
││・右側の項目と見出しとハンドル(透明)の位置を変更する
││・マウス左アップ が終了する ※特記事項を参照
│└
│
├(6-B) 操 作 :ESCキーを押す
│(7-B) イベント:キーダウン が実行される
│┌
││・マウス移動、マウス左アップ、キーダウンを off にする
││・マーカーを非表示にする
││・キーダウン が終了する ※特記事項を参照
│└
└
特記事項
・ハンドルは透明にしてあるので見えない。
・ハンドルの[マウスポインタの種類]は "左右方向カーソル" に設定してある。
・マーカーは[画面表示]属性の設定で表示したり消したりする。
・ドラッグ中に[Alt]キーを押すとマウス左アップは発生しなくなる。
・ドラッグ中に[Alt]キーを押してしまった場合には、
[ESC]キーを押してマウス移動、マウス左アップ、キーダウンの各イベントを停止する必要があります。
※著者( ONnoji )注:オリジナルの「セパレータ」を「ハンドル」に書き換えました。
16.6 [マウス左クリック]イベントの注意点
[マウス左クリック]イベントが使えるオブジェクトは多い。
しかし、[マウス左クリック]イベントを使うシーンはそれほど多くはありません。
いくつかの注意すべき点があるので気をつけてください。
【フォーカス出来ないオブジェクト】
ラベル(リンクしていないラベル)
扇形
角丸め矩形
グラフ
楕円
バーコード
ピクチャ
【フォーカス出来る一般的なオブジェクト】
グループボックス(および、リンクしているラベル)
コンボボックス (ただし、リンクしているラベル)
行セレクタ
【フォーカス出来るが注意が必要なオブジェクト】
テキスト エディタに入らないように工夫する
グループ項目 エディタに入らないように工夫する
コマンドボタン 原則として機能名:手続き実行で一般プロシージャを呼び出す
トグルボタン [ソース値更新]イベントの方が有用
■テキストの場合の注意
例えば、[ソース]に項目をセットしたテキストの場合、表示モードから、フォーカス済みのテキストをマウス左クリックするとエディタに入ります。
このエディタに入った状態から、同じテキストをクリックしても[マウス左クリック]イベントは発生しません。
つまり、エディタを脱出せずに同じテキストをクリックしても[マウス左クリック]イベントは発生しないということです。
このようにある場合に限りクリックしても[マウス左クリック]イベントは発生しないというのは都合が悪いことです。
特にテキストボックスをダブルクリックの対象にする場合には大いに困ります。
これを改善する方法は次のものです。
<手順1>
[フォーム]の[オブジェクトの属性]の[編集対象表]タブの[許可作業]で、[行挿入]と[行訂正]のチェックをオフにする。
または、
&objectName = "フォーム"
オブジェクト操作 &objectName{ 行挿入 = 0, 行訂正 = 0 }
重要:[許可作業]をオフにしてもユーザの操作が禁止されるだけであり、コマンドボタンやメソッドで更新モードを変更できます。
<手順2>
表示モード以外に遷移する必要がある場合には、コマンドボタンの機能名、またはフォームの[更新モード設定]メソッドを実行する
(例)訂正モードと表示モードを切り替える
┌────────────────────┐
│オブジェクト名: cmd表示訂正 │
│標題 :表示⇔訂正 │
│ │
│ 機能名 機能パラメータリスト│
│1 表示/訂正 │
│2 なし │
│3 なし │
│4 なし │
└────────────────────┘
(例)[キーダウン]イベントで更新モードを変更する
この例は、スペースキーが押されたら、項目訂正モードに遷移する。
説明を簡略にするために、拙作:VK_Framework を使用した例を示します。
※著者( ONnoji )注:VK_Framework は、INF_Framework 第3.2版 の IPS_Framework
に統合される予定です。
手続き定義開始 txtObjectName::フォーカス取得(文字列 &喪失オブジェクト名)
手続き実行 VKprcEventKeyDownON( )
手続き実行 VKprcKeyON( )
手続き実行 VKprcKeySet( "スペース", 1, "0", "メソッド呼び出し @フォーム.更新モード設定( 8 )" )
手続き定義終了
手続き定義開始 txtObjectName::フォーカス喪失(文字列 &取得オブジェクト名)
手続き実行 VKprcEventKeyDownOFF( )
手続き定義終了
■コマンドボタンの場合の注意
これまで再三にわたり述べてきたように、コマンドボタンの場合には[機能名:手続き実行]を使うので、原則として[マウス左クリック]イベントは利用しません。
しかし、[マウス左クリック]イベントは絶対に使わないというのではなく、
・Shift + マウス左クリックした時 … イベントプロシージャ:if ( &フラグ >= 4 .and &フラグ < 8 )→ 一般プロシージャShift用
・Ctrl + マウス左クリックした時 … イベントプロシージャ:if ( &フラグ >= 8 )
→ 一般プロシージャCtrl用
・普通に マウス左クリックした時 … コマンドボタンの[機能名:手続き実行] → 一般プロシージャ普通用
これらのモードが必要な場合には、Shift や Ctrl のフラグを検出するために [マウス左クリック]イベントを使用します。
なお、Shift や Ctrl を併用するユーザインターフェースは決して特殊ではありませんが、あまり一般的ではないと思います。
(例)[マウス左クリック]イベントで Shift や Ctrl のフラグを検出する
手続き定義開始 cmd以前開いたファイル::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
変数宣言 自動,文字列{ &icon, &title = "cmd以前開いたファイル::マウス左クリック( )", &msg }
** &処理中止 = 1 でコマンドボタン:cmd以前開いたファイルの機能名を実行しない
** [shift] = 4
if ( &フラグ >= 4 .and &フラグ < 8 )
&msg = "&フラグ = " + #str( &フラグ )
**手続き実行 INFprcMsgPause( &icon, &title, &msg )
手続き実行 cmd以前開いたファイルShiftClick( )
&処理中止 = 1
end
** [Ctrl] = 8 / [Ctrl] + [Shift] = 12
if ( &フラグ >= 8 )
&msg = "&フラグ = " + #str( &フラグ )
**手続き実行 INFprcMsgPause( &icon, &title, &msg )
手続き実行 cmdFileHistoryDimクリアClick( )
&処理中止 = 1
end
手続き定義終了
┌───────────────────────┐
│オブジェクト名: cmd以前開いたファイル │
│標題 :以前開いたファイル │
│ │
│ 機能名 機能パラメータリスト │
│1 なし │
│2 表示 │
│3 手続き実行 cmd以前開いたファイルClick│
│4 なし │
└───────────────────────┘
■トグルボタン場合の注意
トグルボタンの[ボタンの種類]は、オプションボタン/チェックボックス/プッシュボタンの3通りあります。
トグルボタンでは、[マウス左クリック]イベントよりも[ソース値更新]イベントの方が有用です。
16.7 ダブルクリック
Win桐では[ダブルクリック]のイベントは用意されていませんが、[マウス左クリック]イベントを応用すれば同じことが出来ます。
ダブルクリックの条件は次の通りです。
ダブルクリックの条件:直前にクリックしたものと同じオブジェクトが、任意の時間内に再びクリックされること。
なお、一覧表形式(または伝票形式)フォームの明細部のように、格子(マトリクス)状に同じテキストオブジェクトが縦方向に繰り返し表示されている場合には、
直前にクリックしたものと同じレコードのオブジェクトがクリックされたのか判定できません。
その場合には、ユニークな値を返すカウンタ型の項目も合わせて判定します。
なお、ユニークな値を返す項目ならば何でも良いのでカウンタ型にコダワル必要はありませんが、カウンタ型の項目が手っ取り早いです。
そして、この場合には「どんぐりコロコロ」の童謡のように、テキストオブジェクトのエディタにハマってしまわないように、
前述(16.6[マウス左クリック]イベントの注意点)の【テキストの場合の注意】を参照してエディタにハマらないようにしてください。
<参考例>
この例は非常に省略しています。
拙作:INF_DatePicker で1〜31の数字を表示するラベルオブジェクト(lblDay_1〜lblDay_105)をマウス左クリックした場合、
ダブルクリックか否か評価して、ダブルクリックと判定した場合に変数:¯o で指定した一般プロシージャを実行するものです。
※当初から拙作:INF_Framework ではダブルクリック機能(INFprcDoubleClickEval)を用意しています。
※ダブルクリック機能(INFprcDoubleClickEval)は、明細部の[繰り返し表示のオブジェクト]には非対応でしたが、Rev.235
以降では対応しています。
手続き定義開始 famDay::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
:
&objectName = &this
:
&mDayObjectExit = &objectName
:
¯o = "手続き実行 HDLVARprcFormExit( &mDayObjectExit )"
手続き実行 INFprcDoubleClickEval( &mDayObjectExit, ¯o )
:
:
手続き定義終了
16.8 [キーダウン]イベントと[システムキーダウン]イベント
[キーダウン]イベントは、キーボード上のキーが押されているときに発生するイベントです。
[システムキーダウン]イベントは、[Alt]キーまたは[F10]キーが押されているときに発生するイベントです。
このイベントはいろいろな目的で使うことが出来ますが、
一覧表形式(または伝票形式)のフォームの明細部の項目を疑似的にスクロールする目的に使用するのは止めた方がよいです。
これは押されたキーを判定して、テキストの[ソース]を書き換えることで疑似的にスクロールしようという目論見なのですが、
実際には、ロジックが非常に面倒であり、スクロールする項目数を変更するのも大変であることからおススメしません。
ちなみに、拙作:INF_Framework でもスクロールが出来ますが、
拙作では[フォーカス取得]イベントを利用してスクロールしていて[キーダウン]イベントは一切使っていません。
とにかくキーが押されると発生するイベントなので、こいつは便利だと思う人が非常に多いイベントなのですが、
際限なく利用すると、[キーダウン]イベントのイベントプロシージャに条件判断を非常に多く記述することになります。
すなわち、押されたキーを判定するために[if ... else ... end]や[ケース開始 ... ケース終了]がテンコ盛りになります。
[キーダウン]イベントのイベントプロシージャを夢中なって作っているその時には覚えているので良いのですが、
後日メンテナンスのためにイベントプロシージャの中身を見た時には、何がどうなっているのかサッパリ分からない状況になります。
また、複雑な論理を記述するのは大変であるし、
そもそもすべての操作に対応して[if ... else ... end]や[ケース開始 ... ケース終了]で記述出来るわけでもありません。
そういう理由から、[キーダウン]イベントを使うのならば、なるべくほどほどに使うのが望ましいです。
ガッツリ[キーダウン]イベントを使って後で保守に苦しむのはつまらないことです。
ガッツリ[キーダウン]イベントを使って後で保守に苦しむ理由は、
[キーダウン]イベントのイベントプロシージャに何もかも全てを記述しようとしたからです。
これはイベントプロシージャから一般プロシージャをサブルーチン化して呼び出すようにしても変わりません。
この問題を解決する唯一の方法は[キーダウン]イベントの設定を動的に行うことしかありません。
すなわち、任意に[キーダウン]イベントで実行する内容をセットして、また任意にその設定をクリアすることです。
そこで、そのために用意したものが拙作:VK_Framework です。
拙作:VK_Framework は、ガッツリ[キーダウン]イベントを使うためのブレイクスルーです。
著者( ONnoji )注:VK_Framework は、INF_Framework 第3.2版 の IPS_Framework
に統合される予定です。
【引用】ブレイクスルー 出典: フリー百科事典『ウィキペディア(Wikipedia)』
ブレイクスルー、ブレークスルー(英語: breakthrough)とは、進歩、前進、また一般にそれまで障壁となっていた事象の突破を意味する英単語。
■ VK_Frameworkによる参考例 ― 直前値( F2 )が押されたら、キャレットを末尾へ移動
名札 メイン
変数宣言 局所,文字列{ &mTxt伝票日付 = "txtField_3" }
:
*
┌手続き定義開始 txtField_3::入力前(参照 文字列 &編集文字列)
│
│ 手続き実行 VKprcEventKeyDownON( )
│ 手続き実行 VKprcKeyON( )
│ 手続き実行 VKprcKeySet( "F2", 0, "訂正,行挿入,行追加,項目訂正", "手続き実行 prcOnKeyF2直前値( &mTxt伝票日付, &VKmKeyString, &VKmRepeat )" )
│
└手続き定義終了
著者( ONnoji )注:VKprcKeySet( ) の第2引数は 0(ゼロ) とすること。もしも、1(イチ)にするとキー操作が無効になり、直前値がコピーされない。
○ 手続き実行 VKprcKeySet( "F2", 0, "訂正,行挿入,行追加,項目訂正", "手続き実行 prcOnKeyF2直前値( &mTxt伝票日付, &VKmKeyString, &VKmRepeat )" )
× 手続き実行 VKprcKeySet( "F2", 1, "訂正,行挿入,行追加,項目訂正", "手続き実行 prcOnKeyF2直前値( &mTxt伝票日付, &VKmKeyString, &VKmRepeat )" )
┌手続き定義開始 txtField_3::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
│ 変数宣言 自動,文字列{ &icon, &title = "txtField_3::入力後( )", &msg }
│
│ 手続き実行 VKprcEventKeyDownOFF( )
│ 手続き実行 VKprcKeyOFF( )
│ 手続き実行 VKprcKeyClear( "F2", "訂正,行挿入,行追加,項目訂正" )
│
└手続き定義終了
┌手続き定義開始 prcOnKeyF2直前値( 文字列 &objectName, 文字列 &keyString, 整数 &keyRepeat )
│ 変数宣言 自動,文字列{ &icon, &title = "prcOnKeyF2直前値( )", &msg }
│ 変数宣言 自動,文字列{ &string }
│ 変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
│
│ &string = "手続き実行 prcキャレットを末尾へ移動( " + &WQ + &objectName + &WQ + ")"
│
│ **手続き実行 INFprcMacro( &string )
│ &INFmMacro = &string
│ 手続き実行 INFprcTimerSecondaryON( "&INFmOnMacro", 10 )
│
└手続き定義終了
┌手続き定義開始 prcキャレットを末尾へ移動( 文字列 &objectName )
│ 変数宣言 自動,文字列{ &icon, &title = "prcキャレットを末尾へ移動( )", &msg }
│ 変数宣言 自動,数値 { &return }
│
│ ** 文字カーソル位置を末尾に移動します 注意:このメソッドは2個1セットで実行すること
│ メソッド呼び出し 戻り値 = &return,&objectName.編集選択位置設定( 1 ,-1 )
│ メソッド呼び出し 戻り値 = &return,&objectName.編集選択位置設定( 0 ,0 )
│ **戻り値 意味
│ **1 設定できた。
│ **0 選択できなかった。
│ **-1 入力モードではなかった。
│
│ &msg = "&objectName = " + &objectName
│ &msg = &msg + "\n\n&return = " + #str( &return )
│ &icon = "i"
│ **手続き実行 INFprcMsgPause( &icon, &title, &msg )
│
└手続き定義終了
― たかが[キーダウン]イベント、されど[キーダウン]イベント 2015/4/14(火) ― ブログ版 桐のイベント道場より
[キーダウン]イベントのこと。
今は昔、かっこうBBS(2代め)でハンドル名「しぼうかん」さんと[キーダウン]イベントに関してやり取りしたことが懐かしい。
メイン&サブフォームで押された矢印キーに対応したイベント=つまり[キーダウン]イベント。
フォームの製作が進むうちに、[キーダウン]イベントハンドラに if ... else ... end が増えていく。
場合場合に対応するif 、更新モードに対応するif、そしてキーに対応するif。
増え続ける if を見て、直感的に気が付いた。
この if は増え続けて際限が無いし、if のネストが複雑になって判り易さが失われている。
製作中に動作を確認している時にはデバッグはなんとかなるかもしれないが、後でメンテナンスするのは非常に大変だ。
さらに重要な問題に気が付いた。
それは、スタティックな動作は簡単に記述できるが、ダイナミックな動作は複雑すぎて記述不可能だろうということ。
つまり、ハンドル名「しぼうかん」さんとのやり取りによって、泥沼のコードを書いた結果、
[キーダウン]イベントの問題点に気が付いたという次第。
そこで、ハンドル名「しぼうかん」さんのフォームは放置して、拙作:VK_library の開発に取り組んだというワケ。
底なしの泥沼のような if のネスト、それは経験したことの無い者には絶対にワカラナイ世界。
プログラムの書き方は自由だ。
だから、拙作:VK_library を強要するつもりはない。
しかし、肥大化した[キーダウン]イベントハンドラの if 文が意味するものは、メンテナンス困難という実態である。
このことを判っていただければと思い投稿した次第。
たかが[キーダウン]イベント、されど[キーダウン]イベント。
17. 名札メインと局所変数
イベント処理ファイルの[名札 メイン]の範囲は、
イベント処理ファイルの先頭から始まって、最初に出現した[手続き定義開始]コマンドの直前までです。
従って、イベント処理ファイルにプロシージャがひとつも記述されていない場合には、すべての行が[名札 メイン]です。
[名札 メイン]に自動的に付いてくるアスタリスク記号(*)は単なるマークなので、消してしまっても差し支えありません。
さらに、"名札 メイン"という記述さえ消してしまっても差し支えありません(イベント処理ファイルの行数がゼロでもあってもエラーになりません)。
しかし、それではプログラムとして読みにくいので、自動的に先頭行に"名札 メイン"がセットされて、
アスタリスク記号(*)が[名札 メイン]終わりを示す目安としてセットされます。
[名札 メイン]が実行される前には、対象フォームの全オブジェクトが読み込まれ、フォーム定義画面で宣言した局所変数が宣言されています。
しかし、[名札 メイン]ではフォームは描画されていませんし、その次に実行される[フォーム開始]イベントでもフォームは描画されていません。
描画されていないという意味は、画面上にフォームの姿が現れていないということです。
【[名札 メイン]でしか変更できない属性】
編集対象表
開始条件種別1 〜 2
開始条件名1 〜 2
[フォーム開始]イベントのON/OFF
グループキャッシュ
グループソース
グループソート
局所変数(サブフォームオブジェクト)
ジャンプバー
グループ操作バー
ボタンの大きさ
ボタンの種類1 〜 20
17.1 局所変数を宣言する
局所変数を宣言する方法は2通りあります。
・フォーム定義画面で[変数管理]を開いて局所変数を宣言する
・[名札 メイン]で[変数宣言]コマンドで変数を宣言する
フォーム定義画面で宣言済みの局所変数と同名の変数を、[名札 メイン]で宣言すると上書きされます。
そのために、[名札 メイン]で同名の局所変数を宣言する場合には、データ型と配列の要素数が一致している必要があります。
なお、[名札 メイン]で局所変数が宣言できるので、フォーム定義画面で変数を宣言する必要はなさそうに思えますが、
実際には、テキストボックスの[ソース]属性などに局所変数を使う場合には、
フォーム定義画面で変数を宣言しておく方が[整合性チェック]に引っ掛からなくて済むので良いのです。
[フォーム+イベント処理]によるアプリケーション開発ではフォームの局所変数とプロシージャの自動変数を使います。
従って、レガシーな共通変数や固有変数は宣言しません。
しかし、どうしてもスコープが広い変数が必要な場合や、項目の値を変数で置換する場合には組み込み変数を使います。
置換する時に局所変数と自動変数を使わない理由は、表ファイルが局所変数と自動変数に対応していないからです。
原則 フォームの局所変数とプロシージャの自動変数を使う
■フォームの局所変数と桐の組み込み変数のスコープ(有効範囲)
┌─────────────────────────────────────────────────┐
│ │
│ アプリケーションA アプリケーションB アプリケーションC │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 局所変数 │ │ 局所変数 │ │ 局所変数 │ │
│ ├──────┬──────┤ ├──────┬──────┤ ├──────┬──────┤ │
│ │フォームA │イベントA │ │フォームB │イベントB │ │フォームC │イベントC │ │
│ │ │ 処理 │ │ │ 処理 │ │ │ 処理 │ │
│ │( wfm/wfx ) │( kev/kex ) │ │( wfm/wfx ) │( kev/kex ) │ │( wfm/wfx )
│( kev/kex ) │ │
│ │ │ │ │ │ │ │ │ │ │
│ └──┬───┴──────┘ └──┬───┴──────┘ └──────┴──────┘ │
│ │ │ │
│ 編集対象表 編集対象表 │
│ │ │ │
│ ┌──┴───┐ ┌──┴───┐ │
│ │ │ │ │ │
│ │ 表A │ │ 表B │ │
│ │ │ │ │ │
│ │( tbl/tbx ) │ │( tbl/tbx ) │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ └──────┘ └──────┘ │
│ │
│ │
│ 組み込み変数 │
│ │
│ &元号年,&年,&月,&日,&年月日,&時,&分,&秒,&時刻 │
│ &件数,&有効件数,&削除件数,&最大値,&最小値,&平均値,&合計値,&標準偏差 │
│ &STR,&比較式,&置換式,&昭和年,&選択件数,&選択ファイル名,&実行リターン │
└─────────────────────────────────────────────────┘
・組み込み変数のスコープ(有効範囲)は桐の範囲内で、アプリケーションA〜Cのどれからでも参照出来る。
・局所変数のスコープ(有効範囲)は、個々のアプリケーションの範囲内である。
・表ファイルは局所変数と自動変数に対応していない。
■フォームの局所変数とプロシージャの自動変数のスコープ(有効範囲)
┌─────────────────────────────────────────────────┐
│ │
│ フォームの局所変数 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │仮引数リスト │ │仮引数リスト │ │仮引数リスト │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ プロシージャA │ │ プロシージャB │ │ プロシージャC │ │
│ │ │ │ │ │ │ │
│ │ 自動変数 │ │ 自動変数 │ │ 自動変数 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────┘
・フォームの局所変数のスコープ(有効範囲)は、フォームの範囲内である。
・フォームの局所変数は、引数を経由しなくてもプロシージャで参照出来る。
・プロシージャの自動変数のスコープ(有効範囲)は、プロシージャの範囲内である。
・プロシージャの自動変数の値を、別のプロシージャの自動変数へ渡す場合には[手続き実行]コマンドの実引数リストで渡す。
【引用】スコープ 出典: フリー百科事典『ウィキペディア(Wikipedia)』
プログラミングにおけるスコープ(英: scope, 可視範囲)とは、ある変数や関数などの名前(識別子)を参照できる範囲のこと。
通常、変数や関数が定義されたスコープの外側からは、それらの名前を用いるだけでは参照できない。
このときこれらの変数や関数は「スコープ外」である、あるいは「見えない」といわれる。
― 局所変数と自動変数を使う 2006/4/19(水) ― ブログ版 桐のイベント道場より
・グローバル変数を利用する方法
組み込み変数、共通変数、固有変数は簡単に参照できますので、
複数のフォームでこれらの変数を利用する人が多いと思います。
しかし、この場合には、あるフォームがこれらのグローバルな変数値を変更したために、
別のフォームのプログラムが正しく動作しなくなる可能性が常に存在します。
・局所変数を利用する方法
一方、フォームの局所変数を利用する方法もあります。
フォームの局所変数は、それぞれのフォームごとに独立して存在します。
従って、あるフォームの局所変数の値を変更しても、
別のフォームの局所変数の値が変更されることはありません。
・局所変数を利用する方法が良い
プログラムではスコープ(有効範囲)が狭い変数を利用するほうが良いので、
フォームアプリケーションでは、局所変数を主に利用するのがベストです。
そして、グローバルな変数は補助的に利用します。
・手続きの中では引数や自動変数を利用するのが良い
プログラムではスコープ(有効範囲)が狭い変数を利用するほうが良いので、
手続きの範囲だけで処理できる変数を利用するのがベストです。
参照渡しの引数ならば引数の値を変更できます。
― 変数の種別とスコープ 2006/4/19(水) ― ブログ版 桐のイベント道場より
各種別で同じ名前の変数を宣言した場合、次の順番で検索され、最初に見つかった変数の値が参照されます。
自動
局所
固有
共通
※組み込み変数と同名の変数は宣言できません。
スコープの異なる同名の変数の有効範囲は以下のようになる。├──┤有効範囲を広さを表す。
├─自動─┤ この変数は宣言した手続き内でのみ有効です。手続きから抜けると自動的に削除されます。
├─局所──┤ この変数は、フォームウィンドウ固有ものです。フォームウィンドウが閉じると自動的に削除されます。
├─固有───┤ この変数は、表またはフォームのウィンドウが開いているあいだだけ有効です。
├─共通────┤この変数は、桐で作業している間はつねに有効です。
<置換式の特殊性>
置換式に指定した変数は[組み込み変数]または[共通変数]または[固有変数]でなければならない!
表( .tbl )が項目計算式などで参照できる変数が、組み込み変数や共通変数や固有変数だけということが原因だと思います。
著者注:置換式がアンダーバー( _ )で指定する式の場合には式に用いる変数は局所変数や自動変数でもよい。
ただし、式の中で局所変数や自動変数を表現するとエラーになります。
18 フォームの自動処理
フォームは、編集開始時に表の状態を整えたり、編集を開始する前に指定した処理を自動実行する機能を備えています。
また、フォームを閉じたときに自動実行させる処理を指定することもできます。[4]
18.1 [名札 メイン]/[フォーム開始]/[実行コマンド:開始時]/[実行コマンド:終了時]/[フォーム終了]
フォームのイベント処理で最初に自動的に実行されるのは、[名札 メイン]です。
もしも、[フォーム開始]イベントや[フォーム終了]イベントをセットしていれば、イベントプロシージャが自動的に実行されます。
しかし、それだけではありません。
[実行コマンド:開始時]と[実行コマンド:終了時]と[実行コマンド:ESCキー]に指定したコマンドボタンも自動的に実行することが出来ます。
[実行コマンド:終了時]は次の点に注意が必要です。
―コマンドボタンの[機能名:閉じる]を実行
× … [終了時実行コマンド]ボタンは実行されない
○ … [フォーム終了]イベントハンドラは実行される
―タイトルバーの[×]ボタンを実行
○ … [終了時実行コマンド]ボタンは実行される
○ … [フォーム終了]イベントハンドラは実行される
なお、コマンドボタンの[機能名:閉じる]を実行した時に、[終了時実行コマンド]ボタンは実行されないのですが、
この問題を解決するのは簡単で、[機能名:閉じる]をセットしたコマンドボタン自身を[実行コマンド:終了時]に指定すればよいのです。
Fig.13 実行コマンド オブジェクトの属性
Fig.14 実行コマンド オブジェクトのリスト
18.2 フォームが開かれてから、フォームが閉じられるまで
[名札 メイン]ではフォームは描画されていませんし、その次に実行される[フォーム開始]イベントでもフォームは描画されていません。
描画されていないという意味は、画面上にフォームの姿が現れていないということです。
そもそも画面上にフォームの姿が現れていないのですから、
例えば[フォーム開始]イベントで訂正モードに遷移することは(可能か否かは別問題として)常識的に考えてオカシイ(変な)のです。
従って、もしもフォームが描画された直後に訂正モードに遷移するのであれば、[実行コマンド:開始時]のタイミングで行うべきです。
原則 フォームの更新モードの変更は[実行コマンド:開始時]で行う
(例)[実行コマンド:開始時]に指定するコマンドボタン
┌───────────────────────┐
│オブジェクト名: cmdStartup │
│標題 :cmdStartup │
│ │
│ 機能名 機能パラメータリスト │
│1 表示 │
│2 手続き実行 cmdStartupClick │
│3 訂正 │
│4 なし │
└───────────────────────┘
もしも、プロシージャ:cmdStartupClick を実行しないのであれば、
1. と 2. を[機能名:なし]にします。
(例)[実行コマンド:終了時]に指定するコマンドボタン
┌───────────────────────┐
│オブジェクト名: cmd閉じる │
│標題 :閉じる │
│ │
│ 機能名 機能パラメータリスト │
│1 表示 │
│2 手続き実行 cmd閉じるClick │
│3 閉じる │
│4 なし │
└───────────────────────┘
もしも、プロシージャ:cmd閉じるClick を実行しないのであれば、
1. と 2. を[機能名:なし]にします。
■フォームが描画される前とフォームが描画された後
┌─────────────────────┐ ┌─────────────────────────────────┐
│ 【フォームは描画されていない】 │ │ 【フォームは描画されている】 │
│ │ │ タイトルバーの[×]ボタン │
│ │ │ または │
│ ※注意参照 │ │ ※注意参照 コマンドボタン: cmd閉じる │
│ ┌───────┐ ┌───────┐ │ │┌───────┐ ┌───────┐ ┌───────┐│
│ │ │→│ │ │→││ │ │ │→│ ││
│ │名札 メイン ├┬┤フォーム開始 │ ├─┤│開始時実行 │├─┬─┤│終了時実行 ├─┤フォーム終了 ││
│ │ │││イベント │ │ ││コマンドボタン│ │ │コマンドボタン│ │イベント ││
│ │1 と 2を実行 │││ │ │ ││ │ │ │ │ │ ││
│ └───────┘│└───────┘ │ │└───────┘ │ └───────┘ └───────┘│
│ │ │ │ │ │
│ フォーム開始イベントが発生する前に │ │ │ │
│ つぎの処理が終了しています。 │ │ ┌───┴───┐ ┌───────┐ │
│ │ │ │ │ │ │ │
│1 フォーム定義画面で定義した局所変数の宣言│ │ │ESCキー実行│ │コマンドボタン│ │
│2 メイン処理 │ │ │コマンドボタン│ │ │ │
│3 サブフォームのメイン処理 │ │ │ │ │手続き実行 │ │
│4 編集対象表のオープン │ │ └───────┘ └───┬───┘ │
│5 [開始条件種別1]の[開始条件名1] │ │ │ │
│6 グループ化 │ │ ↓│ │
│7 [開始条件種別2]の[開始条件名2] │ │ ┌───────┐ ┌───┴───┐ │
│8 メインフォームの開始 │ │ │ │ → │ │ │
│ │ │ │イベント発生 ├─────┤プロシージャ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ └───────┘ └───────┘ │
└─────────────────────┘ └─────────────────────────────────┘
※注意:[フォーム開始]イベントにおいて、フォームを描画する必要があるコマンドを実行すると、
フォームが描画されて[開始時実行コマンドボタン]が実行されることがあります。
例えば[垂直位置の調整]と[水平位置の調整]のどちらか、または両方が "自動" で[ウィンドウ位置 設定]コマンドを実行する場合。
【引用】桐10s ヘルプ ― [フォーム]オブジェクト(フォーム)
―[実行コマンド:開始時]
フォームを開いた直後に実行するコマンドボタンのオブジェクト名を指定します。
ここで指定したコマンドボタンは、[フォーム開始]イベントの後で実行されます。
―[実行コマンド:終了時]
フォームを閉じるときに実行するコマンドボタンのオブジェクト名を指定します。
ここで指定したコマンドボタンは、[フォーム終了]イベントの前に実行されます。
―[実行コマンド:ESCキー]
[Esc]キーが押されたときに実行するコマンドボタンのオブジェクト名を指定します。
ノート
フォームを一括処理で使用した場合、実行コマンドボタンの扱いはつぎのように変わります。
[開始時実行コマンドボタン]に設定したコマンドボタンの機能は、[フォーム呼び出し]コマンドで開いたときのみ実行されます。
[終了時実行コマンドボタン]と[ESCキー実行コマンド]に設定したコマンドボタンの機能は、[ウィンドウ会話]コマンドなどの会話処理を終了する直前に実行されます。
[ウィンドウ終了]コマンドなどでフォームウィンドウを閉じた場合は、実行されません。
【引用】桐10s ヘルプ ― 【イベント処理】はじめに
フォームの自動処理
フォームは、編集開始時に表の状態を整えたり、編集を開始する前に指定した処理を自動実行する機能を備えています。
また、フォームを閉じたときに自動実行させる処理を指定することもできます。
ノート
一括処理でフォームを使用した場合は、つぎの場面でフォームの自動処理が行なわれます。
・フォーム属性の[表の操作]で設定した[開始条件種別1]と[開始条件種別2]は、そのフォームのウィンドウが開いたときに実行されます。
・[開始時実行コマンドボタン]に設定したコマンドボタンの機能は、[フォーム呼び出し]コマンドで開いたときのみ実行されます。
・[終了時実行コマンドボタン]と[ESCキー実行コマンド]に設定したコマンドボタンの機能は、[ウィンドウ会話]コマンドなどの会話処理を終了する直前に実行されます。
[ウィンドウ終了]コマンドなどでフォームウィンドウを閉じた場合は、実行されません。
― 桐のイベント「魔の11分」 2015年10月 5日(月) ― かっこうBBS(三代目)より
航空機事故でよく耳にする言葉に「魔の11分」というのがある。
これは、離陸後の3分間と着陸前の8分間を指している。
長年にわたり、フォームアプリケーションを作っていると、
[フォーム開始]/[フォーム終了]イベントが一番トラブルを起こしやすいと感じるようになる。
これは経験による教訓だっ。
桐のイベント「魔の11分」。
特に[フォーム開始]が終わるまでが要注意です。
[フォーム開始]は、フォームが描画される以前に実行される処理なので、できれば何もしないのがベストですが、
もしも、[フォーム開始]で何かするとしたら、[開始時]実行コマンドボタンで代用できるか検討するべきです。
[開始時]実行コマンドボタンは、フォームが描画された後で実行されるので安全でデバッグもしやすいですよ。
<追記>
>[フォーム開始]は、フォームが描画される以前に実行される処理なので、
>できれば何もしないのがベストですが
変数に値を代入するとか、オブジェクトの属性を変更するとかは問題ありません。
※変更出来ないオブジェクトの属性もあります。
気をつけなければならないのは、編集モードを変えるとか、コマンドボタンを実行するといった、
フォームに作用する操作です。
これは、まだ描画されていないフォームに対して、作用を行ってもよいか否か考えてみればすぐに分かります。
【引用】出典: フリー百科事典『ウィキペディア(Wikipedia)』】
航空事故のおよそ8割は、機が離陸・上昇を行う際と進入・着陸を行う際の短い時間帯に起こっている。
このなかでも離陸後の3分間と着陸前の8分間の「クリティカル・イレブン・ミニッツ (魔の11分)」と呼ばれる時間帯に事故は集中している。
― 開始時実行コマンドボタン 2006/4/23(日) ― ブログ版 桐のイベント道場より
フォームが開かれた時に、自動的に実行されるコマンドボタンです。
通常では、[フォーム開始]イベントが終了した後に実行されます。
つまり、フォームがバッチリ表示された後に実行されるコマンドボタンです。
ちなみに「通常では」と断り書きを入れたのは、
[フォーム開始]イベント内で実行される場合もあるんですね。
もっとも、こういう事になるのは非常に稀なことなのですが…
<参考>過去の桐井戸端BBS( http://www.habata.net/kiri/kbbs/kakov9/23486.htm )
【INF_Tools】
INF_Toolsでは、[開始時実行コマンドボタン]が設定されている場合には、
[フォーム開始]イベント内で実行されないようにするために、
フォームが描画(ドロー)された後に、
[タイマー2]イベントでコマンドボタンを実行するようになっています。
これはINF_Toolsの仕様です。
著者注:当時の INF_Tools は 現在 INF_Framework に改名されています。
著者の追記:
2019.04.23に再調査したところ、過去の桐井戸端BBS( http://www.habata.net/kiri/kbbs/kakov9/23486.htm
)の件は
[フォーム開始]イベントにおいて、フォームを描画する必要があるコマンド:[ウィンドウ位置 設定]を実行していたことが原因でした。
このように本来フォームが姿を見せていない状態にも関わらず、フォームの姿を見せなければならない作用を持つコマンドの使用は控えたほうが無難です。
とにかく[フォーム開始]イベントでは、無茶なことはせずに、[実行コマンド:開始時]でプロシージャを呼び出すのが安全です。
著者( ONnoji )追記:2019.04.29
INF_Framework では[開始時実行コマンドボタン]が[フォーム開始]イベント内で実行されるのを防ぐために[タイマー2]イベントで実行するようになっています。
18.3 タイトルバーの[×]ボタンは、コマンドボタンを超越した機能
フォームを閉じる時、「フォームを閉じてよろしいですか?[はい][いいえ]」とか、したくなるのは誰しもの人情でしょう。
例えば、次のようなコマンドボタンを考えてみよう。※注意:このテーマは失敗するので、実際に操作して確かめる必要はありません。
┌───────────────────────┐
│オブジェクト名: cmd閉じる │
│標題 :閉じる │
│ │
│ 機能名 機能パラメータリスト │
│1 表示 │
│2 手続き実行 cmd閉じるClick, &実行リターン│
│3 実行条件 ( &実行リターン = 1 ) │
│4 閉じる │
└───────────────────────┘
┌手続き定義開始 cmd閉じるClick( 参照 整数 &exit )
│ 変数宣言 自動,文字列{ &title = "cmd閉じるClick( )", &msg }
│ 変数宣言 自動,整数 { &ans }
│
│ &msg = "フォームを閉じてよろしいですか?"
│ メッセージボックス &title, &msg, アイコン = ?, ボタン指定 = 5, &ans
│
│ &exit = 0
│┌if ( &ans = 6 ) /* 6 [はい] 7 [いいえ] */
││
││ &exit = 1
│└end
│
└手続き定義終了
↑このコマンドボタンを実行して、「フォームを閉じてよろしいですか?」で[いいえ]を選択すれば、
機能名3.[実行条件]の条件が偽になるので、機能名4.[閉じる]は実行されません。
しかし、タイトルバーの[×]ボタンを押した時には、フォームは閉じられてしまいます。
そこで、[実行コマンド:終了時]に、↑上のコマンドボタン:cmd閉じる をセットしたらどうでしょうか?
先に答えを言うと、やはりフォームは閉じられてしまいます。
確かに、終了時実行コマンドボタンとして、コマンドボタン:cmd閉じる は実行されており、
「フォームを閉じてよろしいですか?[はい][いいえ]」のメッセージボックスが表示されます。
しかし、[いいえ]を選択してもフォームは閉じられてしまいます。
実は、3 の[機能名:実行条件]によって、4 の[機能名:閉じる]は実行されていないのです。
しかし、コマンドボタン:cmd閉じる の実行が終了した後で、フォームが閉じられてしまうのです。
このことから、タイトルバーの[×]ボタンは、コマンドボタンを超越した機能だと理解できます。
それならばと、タイトルバーの[×]ボタンを表示しなければ良いのかというと、それは悪いです。
すでに、【4.3 タイトルバー】で説明したように、桐ではタイトルバーを非表示にしたフォームを作ることも可能です。
しかしながら、このような行為はウィンドウ操作を共通の操作で扱えなくするので、「不親切なルール変更」と言わざるをえません。
従って、[フォーム+イベント処理]のアプリケーションの場合には、タイトルバーを非表示にするのは厳禁なのです。
さて、なぜタイトルバーの[×]ボタンがコマンドボタンを超越しているのか考えてみましょう。
そのヒントは、表ウィンドウにあります。
表( tbl/tbx )に[バックアップをとる]がオンの場合で、
データが変更されているならば、表ウィンドウを閉じる際に、
! d:\path\○○○.TBX
は更新されています.保存しますか?
[はい][いいえ][キャンセル]
のメッセージボックスが表示されます。
この時に、[キャンセル]を選択すれば、表ウィンドウが閉じられないことは誰でも知っていることでしょう。
Fig.15 更新されています.保存しますか 表ウィンドウ
Fig.16 バックアップをとる
実は、編集対象表がセットされているフォームの場合でも、
編集対象表になる表( tbl/tbx )が[バックアップをとる]がオンならば、同じメッセージボックスが現れます。
ただし、編集対象表のデータが変更されていなかったり、[バックアップをとる]がオフだったり、
NULLフォームではこのメッセージボックスは表示されません。
このことから導き出される結論は、フォームウィンドウは表ウィンドウに[フォームというラップ]を包んだものということです。
つまり、表ウィンドウとフォームウィンドウは外見は異なりますが、基本的に同じものだということです。
Fig.17 更新されています.保存しますか フォームウィンドウ
― フォームを閉じる・開くのキャンセル ONnoji -2016/09/20(Tue) ― 桐質問掲示板 過去ログ65より
> 桐では、フォームを閉じたり開いたり時のイベントにキャンセル機能がありませんので…
> Q1)
> 今日分のデータを入力して、普通にフォームを閉じようとした時に、
> 「入力漏れがないかチェックして、漏れがあれば、その旨のメッセージを出して、フォームを閉じさせない」
> 皆さんは如何されていますか?
VB.NETでは、 [FormClosing]イベントハンドラで、e.Cancel = True でフォームを閉じなく出来る。
でも、これはあくまでもVB.NETの場合ですね。
桐の場合には、タイトルバーの[×]をクリックしたら、絶対にフォームは閉じてしまいます。
だから、タイトルバーの[×]をクリックしたら[フォーム終了]イベントが発現して、イベントハンドラが呼び出されます。
ちなみに、[フォーム終了]イベントは結構BUGを拾いやすいイベントなので、なるべく何もしない方が得策ですよ。
だから、[フォーム終了]イベントハンドラでメッセージなんか出しても手遅れで、本当に無駄です。
お前はすでに、終了している状態です。アチョー。
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
男らしく、タイトルバーの[×]がクリックされた時にはあきらめましょう。
クドクド考えても時間の無駄です。
ちなみに、タイトルバーを非表示にしちゃえとか、[×]を強引に無効化しちゃえと考える人もいるが、
それでは、Windows らしくなくなって不自然きわまりないフォームになってしまいますね。
些細なことより、大局を大事にしましょう。
19 ウィンドウのハンドル番号
[フォーム+イベント処理]では、[オブジェクト操作]コマンドや[メソッド]でハンドルを記述することは稀です。
なぜならば、自分自身のフォームのオブジェクトを対象に[オブジェクト操作]コマンドや[メソッド]を実行する場合にはハンドル指定が不要だからです。
19.1 ハンドル番号と &hwindow
フォームウィンドウのハンドル番号は、[フォーム+イベント処理]で自動的に作られる整数型の局所変数:&hwindow に代入されています。
局所変数:&hwindow は桐システムが自動的に用意するもので、ユーザが値を勝手に書き換えることは出来ません。
なお、[イベント処理をセットしない単独のフォーム]の場合には、桐システムは &hwindow も &this も作成しません。
[フォーム+イベント処理]のフォームを開いた時、[名札 メイン]の時点では変数:&hwindow の値は定まっていません(不定)。
[フォーム開始]イベントの時点で、変数:&hwindow の値が決まります。
多くの人は気が付いていませんが、この変数:&hwindow の値は、[フォーム開始]イベントの仮引数:&表番号 の値と同じです。
つまり、&hwindow の値は、編集対象表があるフォームでは編集対象表の表番号とも同じ値です。
┌手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
│
│
└手続き定義終了
桐システムは、編集対象表があるフォームウィンドウでは1から昇順に、NULLフォームウィンドウでは40から降順にハンドル番号を割り当てます。
フォームを閉じたために空きになったハンドル番号は、次にフォームが開かれる時に再び使用されます。
19.2 ウィンドウリスト取得 ウィンドウ情報取得
複数のフォームウィンドウが開かれている時、それらのハンドル番号を取得するためには[ウィンドウリスト取得]コマンドを実行します。
なお、ヘルプには記載がありませんが、[ウィンドウリスト取得]コマンドは、編集対象表が表示状態のときのみ操作可能です。
(例)
変数宣言 自動,整数 { &hdlDim[40] }
ウィンドウリスト取得 &hdlDim
【引用】桐10s ヘルプ ― ウィンドウリスト取得
■説明
・一番手前のウィンドウのハンドルを、<変数名>に代入します。
・<変数名>には、数値型、通貨型、整数型、長整数型、実数型の変数名を指定します。
・配列変数を指定した場合は、要素数分のハンドルを代入します。配列変数の要素数は、いくつでもかまいません。
・配列変数に代入するときの順番は、現在の表示順(ウィンドウの重なり順)です。n 番目のウィンドウが開いていない場合は、n 番目の要素が未定義になります。
・イベント定義のメイン処理で実行したときに取得できるハンドルリストは、フォームが開く前のものです。メイン処理を呼び出したフォームのウィンドウハンドルは含まれません。
・[フォーム開始]イベントのハンドラ内で実行すると、実行結果が不定になります。このハンドラ内では使用しないでください。
[ウィンドウリスト取得]コマンドで配列変数に代入したウィンドウリストを元して、[ウィンドウ情報取得]コマンドで表名とフォーム名が取得できます。
なお、ヘルプには記載がありませんが、[ウィンドウ情報取得]コマンドも、編集対象表が表示状態のときのみ操作可能です。
(例)
変数宣言 自動,文字列{ &tblName, &wfmName }
変数宣言 自動,整数 { &hdl, &hdlDim[40] }
変数宣言 自動,整数 { &i, &loop, &step = 1 }
ウィンドウリスト取得 &hdlDim
&loop = 40
繰り返し &i = 1, &loop, &step
&hdl = &hdlDim[ &i ]
&tblName = #u
&wfmName = #u
if ( &hdl )
ウィンドウ情報取得 &hdl, 表名 = &tblName, フォーム名 = &wfmName
トレース出力 _&hdl, " ", _&tblName, " ", _&wfmName
end
繰り返し終了
【引用】桐10s ヘルプ ― ウィンドウ情報取得
■説明
・<ハンドル>で指定したウィンドウの表名とフォーム名を取得して、変数に代入します。
・「表名=」と「フォーム名=」のどちらかひとつだけでもかまいません。
・該当する情報がない場合は、未定義値が代入されます。
19.3 ウォーリーをさがせ!
任意のフォームウィンドウ(例では Wally.wfx)を探索して、見つかった( &found )ならばアクティブにする例を以下に示します。
(例)
変数宣言 自動,文字列{ &targetWindowName }
変数宣言 自動,文字列{ &tblName, &wfmName }
変数宣言 自動,整数 { &hdl, &hdlDim[40] }
変数宣言 自動,整数 { &i, &loop, &step = 1 }
変数宣言 自動,整数 { &found, &return }
&found = 0
&targetWindowName = #一括パス名 + "Wally.wfx"
ウィンドウリスト取得 &hdlDim
&loop = 40
繰り返し &i = 1, &loop, &step
&hdl = &hdlDim[ &i ]
&tblName = #u
&wfmName = #u
if ( &hdl )
ウィンドウ情報取得 &hdl, 表名 = &tblName, フォーム名 = &wfmName
トレース出力 _&hdl, " ", _&tblName, " ", _&wfmName
if ( #lc2( &wfmName ) = #lc2( &targetWindowName ) )
&found = &hdl
繰り返し中止
end
end
繰り返し終了
if ( &found )
&hdl = &found
メソッド呼び出し ハンドル = &hdl,戻り値 = &return,@フォーム.アクティブ設定()
end
<重要>
Wally.wfx が桐9-2012/桐9s のファイルを桐コンバータで変換したフォームの場合には、[アクティブ設定]メソッドのオブジェクト名は半角のフォームにします。
もしも、 Wally.wfx に拙作:INF_Fremework を導入している場合には、
#局所変数( &hdl, "INFmKnjForm" ) の返す値が未定義値(偽)ならば半角のフォームで、
#局所変数( &hdl, "INFmKnjForm" ) の返す値が1=イチ(真)ならば全角のフォームと判定できます。
【引用】ウォーリーをさがせ! 出典: フリー百科事典『ウィキペディア(Wikipedia)』
『ウォーリーをさがせ!』(Where's Wally?, 北米版タイトルは Where's Waldo?)は、1987年にイギリス人イラストレーター、マーティン・ハンドフォードによってイギリスで出版された絵本である。
同じ年に日本でも発売され、有名になった。
日本版の版元はフレーベル館。シリーズ名は『ウォーリーのえほん』。
人が入り乱れた絵の中からウォーリーや仲間たち、巻物などを見つけ出す。
19.4 ハンドルを指定するメソッド・関数・コマンド
ハンドルを指定するメソッド・関数・コマンドを使用するケースは少ないです。
以下に例を示します。
■メソッド
ハンドルを指定する[フォーム]オブジェクトのメソッドは、前述(19.3 ウォーリーをさがせ!)の[アクティブ設定]です。
そのほかのメソッドも実行できますが、自分自身のフォームではない他のフォームで実行するメソッドとしては適当ではありません。
― フォーム.アクティブ設定() … method
(例)
メソッド呼び出し ハンドル = &hdl,戻り値 = &return,@フォーム.アクティブ設定()
参考:フォームのメソッド(12種類)は次の通りです。
{アクティブ設定,キー変換,更新モード取得,更新モード設定,描画禁止,描画更新,
表示倍率の設定,フォーカスオブジェクト取得,フォーム選択,変数変更,明細番号取得,明細番号設定}
■関数とコマンド
ハンドルを指定するコマンドと関数は次のものです。
― #ウィンドウハンドル( &hdl ) … function
― #ウィンドウ状態( &hdl ) … function
― ウィンドウ位置 復元,&hdl … command
(例)
┌if ( #ウィンドウハンドル( &hdl ) ) /* ウィンドウが開かれていれば真(1) 開かれていなければ偽(0)*/
│
│┌if ( #ウィンドウ状態( &hdl ) = 2 ) /* 0:通常の表示状態 1:最大化 2:最小化 3:非表示 */
││
││ ウィンドウ位置 復元,&hdl /* 最大化|最小化|復元 */
│└end
│
│ メソッド呼び出し ハンドル = &hdl,戻り値 = &return,@フォーム.アクティブ設定()
└end
※Syntax:#ウィンドウハンドル( <ハンドル> )
※Syntax:#ウィンドウ状態( <ハンドル> )
※Syntax:ウィンドウ位置 最大化|最小化|復元, <ハンドル>
― 局所変数代入 &hdl, &mVariableName = 式 … command
(例) 局所変数代入 &hdl, &mVariableName = #u /* コマンドなので関数と異なり戻り値がありません
*/
※Syntax:局所変数代入 <ハンドル>,<変数名> = <計算式>|<配列変数名>[ <要素番号> ] = <計算式>|<配列変数名> = { <計算式>,… }
― #局所変数代入( &hdl, &mVariableName, 式 ) … function
※この関数は#代入 のハンドル付きバージョンです
(例) &setString = #局所変数代入( &hdl, &mVariableName, &string ) /* &setString は 関数の戻り値を受け取る */
※Syntax:#局所変数代入( <ハンドル>, 【 var | var[ index ] 】, val )
― #局所変数( &hdl, "変数名" ) … function
※この関数は#変数 のハンドル付きバージョンです
(例)
┌if ( #局所変数( &hdl, "INFmKnjForm" ) ) /* 局所変数の値を取り出す 変数が宣言されていなければ未定義値
*/
│
└end
※Syntax:#局所変数( <ハンドル>, str 【 | , n2 】 )
― オブジェクト操作 設定 … command
※これはハンドルを指定したフラグ参照のタイマーの例です
(例)
&setInt = #局所変数代入( &hdl, &mFlag, 1 ) /*
&setInt は 関数の戻り値を受け取る */
&setString = #局所変数代入( &hdl, &mVariableName, &string ) /* &setString は 関数の戻り値を受け取る */
&formObjectName = #半角( "フォーム" )
条件 ( #局所変数( &hdl, "INFmKnjForm" ) ) &formObjectName = #全角( &formObjectName )
オブジェクト操作 ハンドル = &hdl, &formObjectName{ タイマー値2 = 10 }
オブジェクト操作 ハンドル = &hdl, &formObjectName{ タイマー2 = 1
}
19.5 それぞれのフォームアプリケーションは独立しているので直接的な干渉をしない
ハンドルを指定すれば、自分自身以外のフォームウィンドウに対して、オブジェクト操作やメソッドが実行できます。
しかし、それぞれのフォームアプリケーションは独立しているのですから、それらへの直接的な干渉は止めるべきです。
直接的な干渉をするとプログラムが分かりにくくなります。
しかし、それ以上に問題なのは、直接的な干渉をするとそれぞれのフォームアプリケーションの結びつき(結合度)が高くなります。
結びつき(結合度)が高いということは、どちらか一方を変更した際に、他方も影響を受け易くなります。
これは、一般的なモジュールの結合度と同じ考え方です。
それぞれのフォームアプリケーションをそれぞれモジュールだと考える場合、結合度は低いほうが良いです。
もちろん、主ウィンドウとモーダルウィンドウの関係は結合度が高い関係ですが、これは例外です。
しかし、それ以外の場合には結合度を低くするのがベストです。
フォームアプリケーションの結合度を低くしたままフォームアプリケーション間の連携を図る方法は、
前述(19.4 ハンドルを指定するメソッド・関数・コマンド)の[ハンドルを指定したフラグ渡しのタイマー]です。
<再掲載>
― オブジェクト操作 設定 … command
※これはハンドルを指定したフラグ参照のタイマーの例です
(例)
&setInt = #局所変数代入( &hdl, &mFlag, 1 ) /*
&setInt は 関数の戻り値を受け取る */
&setString = #局所変数代入( &hdl, &mVariableName, &string
) /* &setString は 関数の戻り値を受け取る */
&formObjectName = #半角( "フォーム" )
条件 ( #局所変数( &hdl, "INFmKnjForm" ) ) &formObjectName = #全角( &formObjectName )
オブジェクト操作 ハンドル = &hdl, &formObjectName{ タイマー値2 = 10 }
オブジェクト操作 ハンドル = &hdl, &formObjectName{ タイマー2 = 1
}
つまり、ダイレクトに他のフォームウィンドウのコマンドボタンを実行したりしないで、
ターゲットのフォームウィンドウの局所変数のフラグを立てて、局所変数に実行すべき内容(パラメータ)を渡します。
その後、時限装置式のタイマーイベントをセットします。
自分自身のフォームウィンドウのプロシージャの実行が終了すると、
ターゲットのフォームウィンドウでは時限装置式のタイマーイベントが発生します。
時限装置式のタイマーイベントですから、タイマーイベントの属性をオフに設定して、
立っているフラグに応じた処理を行ってフラグを降ろします。
この具体例としては、拙作のパレット型のランチャー utx_list3_launcher の[閉]ボタンを実行した際に、
関連するフォームウィンドウが次々に閉じられる例が挙げられます。
utx_list3_launcher は、関連するフォームウィンドウのハンドルを調べて、
[ハンドルを指定したフラグ渡しのタイマー]をセットしています。
関連するそれぞれのフォームウィンドウは、自分自身のフォームの時限装置式のタイマーイベントとして、
メソッド呼び出し @cmd閉じる.実行( )
を実行しています。
― シーカーとセンダーについて 2016/11/17(木) ― ブログ版 桐のイベント道場より
シーカーとセンダーについて
シーカーの
手続き実行 HDLLNCprcHdlSeek( &targetFileName, &found, &status &multi, &mode )
を実行して、フォームのウィンドウハンドルを探索する。
フォームウィンドウが見つかったならば、
センダーの
&sendMacro = "メソッド呼び出し @cmd閉じる.実行( )"
手続き実行 HDLCOMprcMacroSend( &hdl, &sendMacro, &done )
を実行してコマンド(またはメソッド)の実行を予約する。
コマンド(またはメソッド)の実行が予約出来るのは、INF が組み込まれたフォームだけです。
もしも、予約できない場合にはフレームワークからメッセージが表示されます。
<例>
手続き定義開始 cmdHdlSeekClick( )
変数宣言 自動,文字列{ &icon, &title = "cmdHdlSeekClick( )", &msg }
変数宣言 自動,文字列{ &targetFileName }
変数宣言 自動,整数 { &found, &status &multi, &mode }
変数宣言 自動,文字列{ &sendMacro }
変数宣言 自動,整数 { &hdl, &done }
&targetFileName = #一括パス名 + "test_form.wfm"
手続き実行 HDLLNCprcHdlSeek( &targetFileName, &found, &status &multi, &mode )
if ( &found .and &status )
&hdl = &found
&sendMacro = "メソッド呼び出し @cmd閉じる.実行( )"
手続き実行 HDLCOMprcMacroSend( &hdl, &sendMacro, &done )
end
&msg = "引数:文字列 &targetFileName = " + #文字置換( &targetFileName, "\", "\\" )
&msg = &msg + "\n\n引数:参照 整数 &found = " + #str( &found ) + " ※戻り値:ハンドルの値を返す"
&msg = &msg + "\n\n引数:参照 整数 &status= " + #str(
&status )+ " ※戻り値:フォームならばハンドルの値、表編集ならば未定義値"
&msg = &msg + "\n\n引数:参照 整数 &multi = " + #str( &multi ) + " ※戻り値:表が多重化されているならば2番目の表番号を返す"
&msg = &msg + "\n\n引数:参照 整数 &mode = " + #str(
&mode ) + " ※戻り値:[更新モード取得]メソッドに準拠した整数"
&msg = &msg + "\n\n&sendMacro = " + &sendMacro
&msg = &msg + "\n\n&done =
" + #str( &done )
&icon = "i"
手続き実行 INFprcMsgPause( &icon, &title, &msg )
手続き定義終了
20 ポイントと トゥイップス( twips )
通常では、フォームの属性の[表示の単位系]には"ポイント"が設定されています。
Fig.18 表示の単位系 オブジェクトのリスト
そのために、[オブジェクトのリスト]から[オブジェクト操作]コマンドの雛形を取得する際の単位はポイントになります。
(例)
取得 ― オブジェクト操作 &文字列型変数 = @フォーム.フォームの幅
設定 ― オブジェクト操作 @フォーム.フォームの幅 = "444.5 pt"
この例のような[オブジェクト操作]コマンドの雛形を見ているので、
多くの人がこのような場合には属性の値を文字列型変数で指定するものだと思っていることでしょう。
しかし、{フォームの幅,セクションの高さ,始点X,始点Y,幅,高さ,終点X,終点Y}属性の値には、
数値型の変数を使うことが出来るのです。
(例)
数値型変数:&formWidth
数値型変数:&twips = 20
取得 ― オブジェクト操作 @フォーム{ &formWidth = フォームの幅 }
設定 ― オブジェクト操作 @フォーム{ フォームの幅 = 444.5 * &twips }
属性値を数値型変数で取得する場合には、ポイントの値を20倍した値が数値型変数に代入されます。
属性値を設定する場合には、ポイントの値を20倍にした値を指定します。
実は、属性値をポイントで指定しても、Win桐の内部ではトゥイップス( twips )に変換して動作しています。
トゥイップス( twips )とは、1/20ポイントです。
従って、1ポイントは20トゥイップス( twips )です。
Win桐の内部では、トゥイップス( twips )に変換して動作していますので、
トゥイップス( twips )で指定する方がポイントで指定するよりも誤差がありません。
【引用】桐10s ヘルプ ― APPENDIX 単位
桐で使用する単位と、各単位の精度はつぎのとおりです。
単位(読み) 指定 精度 補足
cm(センチメートル) cm 1/1000cm −
mm(ミリメートル) mm 1/100mm 約 0.0393700inch
inch(インチ) in 1/100inch 2.54cm(72point)
point(ポイント) pt 1/10point 1/72inch(20twips)
twips(トウィップス) tw 1twips 1/20point
pixcel(ピクセル) − 1/10pixcel 画素数
dot(ドット) − 1dot 点の数
・twips は、各オブジェクトの単位つきの属性値を、数値型で設定または取得するときに使用します。
厳密には、数値の後ろに pt、in、mm、cm が表示される属性値を数値で操作する場合は、twips として扱います。
たとえば[オブジェクト操作] コマンドで、オブジェクトの高さを数値の 280 にすると、14 points になります(280 twips = 14 points × 20)。
【引用】Twip 出典: フリー百科事典『ウィキペディア(Wikipedia)』
Twip(s)(トゥイップ)とは、主にマイクロソフト社の製品・技術で利用されている長さの単位。
Microsoft Visual Basic、Microsoft Visual C++、リッチテキストフォーマット等において、ウインドウやレポートのサイズとして用いられる。
1Twipは1/20ポイントであり、1/1440インチに相当する。「Twentieth of an Inch Point」から、Twipと名づけられた。
Microsoft Windowsの標準のシステム解像度である96dpiの環境下では15Twipsで1ピクセル、120dpiの環境下では12Twipsで1ピクセルの長さと等しい。
Visual Basic 1.0から6.0まで使われていたが、後継のVisual Basic .NET 2002以降ではピクセル単位での指定しかできなくなっている。
平成最後の4月 2019/04/28 フォームアプリケーション教書 第1部 完
[1]ベン シュナイダーマン 1995. ユーザーインタフェースの設計 第2版
[2]桐10s ヘルプ ― ウィンドウの形式とメニューバー(フォーム)
[3]桐10s ヘルプ ― 【イベント処理】はじめに
[4]桐10s ヘルプ ― 【イベント処理】はじめに
トップページに戻る
桐の釣魚大全のトップ > フォームアプリケーション教書 第1部