INF_Framework は ONnoji さん作成のフリーのライブラリです。
フォームに便利な機能を追加してくれます。
ここでは INF_Framework が適用されたフォームの便利機能を、
できるだけ簡単に利用できるように解説していきたいと思っています(?、頑張ります)。
※ INF_Framework 第3.2版 ファイナル ( INF_Framework 第3.2版 Rev.227 ) for 桐10 /
桐10s を使用しています。
☆ INF_Framework 第3.2版 の公開は終了しました。
ここで使用する ライブラリ は所定のサイト
からダウンロードしてください。
Launcher(ランチャー)
すべてのINF_Framework 共通 (注)
(注)モダンINF_Framework、クラシックINF_Framework、NULL INF_Framework
ランチャーをつかってフォームを起動するには、次の プロシージャ を実行します、終わり。
手続き実行 HDLLNCprcWindowAppear(
&wfm, &tbl, &hdl, &openStatus )
ははは 不親切な説明ですね。しかしそれほど簡単です。
-----------------------------
例) |
手続き定義開始 cmdLauncherClick () |
変数宣言 自動,文字列{ &wfm , &tbl } |
変数宣言 自動,整数 { &hdl, &openStatus } /* この変数は宣言するだけです */ |
|
&wfm = #一括パス名 + "郵便番号簿.wfx" |
&tbl = #一括パス名
+ "郵便番号簿.tbx" |
|
手続き実行 HDLLNCprcWindowAppear( &wfm, &tbl, &hdl,
&openStatus ) |
手続き定義終了 |
|
・ &wfm には フォーム名を代入します。フルパスで指定してください。
*同じフォルダにあるフォームや表を指定する場合には、#一括パス名 を利用すると便利です。
・ &tbl には テーブル名を代入します。フルパスで指定してください。
*表(テーブル)はフォームと同一のフォルダに入れておくことをお勧めしますが
フォームと同じフォルダの必要はありません。年度、部門 等で専用のフォルダに分類することが合理的なケースもあるかと。
・ &hdl, &openStatus は 宣言するだけで値は代入しません。 (注)
(注):INF_Framework が使用します。
&hdl には成功時にハンドル番号が、失敗時にはゼロ(0)が代入されます
&openStatus には、新規にウィンドウを開いた時にイチ(1)、それ以外にはゼロ(0)が代入されます
* INF_Framework の Launcher は 編集状態でも機能します。
* フォームのみを指定する、表のみを指定する、フォーム と 編集対象表 の両方を指定する。 INF_Framework の Launcher は
どの場合でも機能します。
-----------------------------
〇 サンプル1:コマンドボタンから HDLLNCprcWindowAppear を呼び出す手続きを実行する。コマンドボタンの設定は次の通りです。
* コマンドボタンを押した際に、強制的に表示モードに切り替えた後 手続き実行 する場合のサンプルです。
* コマンドボタンを押した際、編集・表示のモードはそのまま変更せずに ランチャーを使用する場合のサンプルです。
対応するイベントは次のようになります。パスを含めたファイル名を 変数に代入して、ランチャーのプロシージャを実行します。
〇 サンプル2:コマンドボタンから HDLLNCprcWindowAppear を呼び出す手続きを実行する。NULLフォームの場合。
対応するイベントは次のようになります。MainMnue.WFX は NULLフォームなので 変数 "&TBL" には何も代入しません(なのにランチャーが使える (^^♪ )。
〇 サンプル3:コマンドボタン "郵便番号簿" の機能パラメータリストに ファイル名も引数としてセットします。
対応するイベントは次のようになります。ここでは ファイルのパスを追加したのちに ランチャーのプロシージャを呼び出しています。
〇 サンプル4:フォームMainMenu は NULLフォームなので 編集対象表はセットしません。
対応するイベントは次のようになります。フォームMainMenu は NULLフォームなので 変数 &tbl の値は未定義値にします。
-------------------------------
〇 サンプル5:ファイル名は 名札メイン であらかじめパスを含めて変数に代入しておきます。
対応するコマンドボタンの属性は次の通りです。
〇 サンプル6:HDLLNCprcWindowAppear を呼び出すプロシージャは1つだけで済ませることもできます。
ランチャー以外の処理がある場合も、ここの1ヶ所での記載ですみます(できるだけ単純になるように心がけましょう)。
対応するコマンドボタンの属性は次の通りです。
○ サンプル7:サンプル6のイベントを使って、コマンドボタンを次のように設定すると表だけを開くことができます(フォームは開かない)。
*ここでの記載方法:パス+ファイル名を変数に代入して、引数で渡す。サンプル6 と全く同じルールに沿っている。
コマンドボタンの設定でファイル名を渡す引数の部分の記載を少し変更するだけで、
サンプル6と同じイベントで 表 のみを開くようにすることができました。引数って便利ですね (^_-)
表を開くとこんな感じですね。
* 桐9 から 桐10 の移行期には つぎのようにバージョンに合わせて拡張子を変更する機能( INF_Framework の機能の一つです)
を利用すると便利です。
手続き定義開始 cmdLauncherClick ( 文字列
&wfm , 文字列 &tbl ) |
変数宣言 自動,整数 { &hdl, &openStatus } |
|
if ( #バージョン番号 >= 10 .and #lc2(
#ファイル名( &INFmLibraryName, 4 ) ) = "cmx" ) |
手続き実行 INFCNVprcStringExtensionConv( &wfm ) /* 桐10の場合、拡張子を変更します */ |
手続き実行 INFCNVprcStringExtensionConv( &tbl ) /* 桐10の場合、拡張子を変更します */ |
end |
|
手続き実行 HDLLNCprcWindowAppear(
&wfm, &tbl, &hdl, &openStatus ) |
手続き定義終了 |
【引用】フォームアプリケーション教書 第1部 ランチャー
*WEBサイト 桐の釣魚大全
より。
*ランチャーが試せるツールが公開されています。
WEBサイト 桐の釣魚大全
→ワークショップへ → ダウンロード → テストツール→ INF_Guide_Launcher
■ランチャーに関する雑談 ― ブログ版 桐のイベント道場 2007/3/17 INF_Toolsの話 第29話より
※執筆当時の INF_Tools は INF_Framework に置き換えました。
ランチャーというのは案外と面倒なものです。
INF_Framework のランチャーは次の順で動作します。
まず、すでにそのファイルのウィンドウが在るか否か調べて
↓
次に、ウィンドウでなく編集表と開いている表が在るか否か調べて、
↓
次に、ディスクに目標のファイルが存在するか否か調べて、
↓
最後に、本当にフォームや表を開きます。
なお、すでにファイルのウィンドウがある場合は、そのウィンドウへフォーカスし、
すでにウィンドウでなく編集表として開いている表がある場合は、メッセージボックスで通知します。
また、すでに開いたウィンドウのハンドルを覚えている方式は具合悪いので、ランチャーは以上の作業をその都度行います。
つまり、常に最新のウィンドウハンドルを精査することがランチャーの重要な点です。
いうなれば、常にリアルタイムな情報を収集することがランチャーの基本設計になります。
ランチャーの機能は、ミサイルに例えるのが適当です。ミサイルには、無誘導式・誘導式・打ちっ放し式があります。
○無誘導式 ― コマンドボタンの[機能名:開く]です。
○誘導式 ― すでに開いたウィンドウのハンドルを覚えている方式ですが、ハンドル情報が実際と食い違うトラブルが発生します。
○打ちっ放し式 ― INF_Framework が採用しているリアルタイムな情報を収集する方式です。
実際の打ちっ放し式のミサイルには、シーカー(探知機)があります。
これは、ランチャー機能の
まず、すでにそのファイルのウィンドウが在るか否か調べて
↓
次に、ウィンドウでなく編集表と開いている表が在るか否か調べて、
に相当します。
つまり、目標のウィンドウや、編集表が在るか否か調べる機能です。
そして、もしも、目標のウィンドウや、編集表が無ければ、ディスクに目標のファイルが存在するか調査して、ランチャーはフォームや表を本当に開くというわけです。
INF_Framework のランチャーに関するメモ 2019.09.21 ONnoji
■引数について
ランチャーの基本形は次の通り。
手続き実行 HDLLNCprcWindowAppear( &wfm, &tbl, &hdl, &openStatus )
引数の意味は変数名から容易に想像できると思います。
すなわち、
・&wfm … フォームファイル名 ※フルパスで指定
・&tbl … 表ファイル名 ※フルパスで指定
・&hdl … &hdl には成功時にハンドル番号が、失敗時にはゼロ(0)が代入されます
・&openStatus … &openStatus には、新規にウィンドウを開いた時にイチ(1)、それ以外にはゼロ(0)が代入されます
引数の &hdl, &openStatus は単なる戻り値なので分かりやすいのですが、
&wfm と &tbl の両方を指定した場合はどうなるのだろうか?という疑問が生じることでしょう。
&wfm と &tbl の組み合わせは、以下のように4通りになります。
&wfm &tbl ○:ファイル名あり ×:未定義値
1. ○ ×
2. ○ ○
3. × ○
4. × ×
この組み合わせに対するランチャーの挙動は以下のようになります。
&wfm &tbl 挙動
1. ○ × フォームをローンチ(ランチ)
2. ○ ○ フォームをローンチ(ランチ)
3. × ○ 表をローンチ(ランチ)
4. × × 無効なのでヘルプを表示する
この組み合わせの中で判り難いと思われものは 2.の組み合わせですが、
&wfm &tbl 挙動
2. ○ ○ フォームをローンチ(ランチ)
フォーム:&wfmと、表:&tblの両方を指定した場合には、ランチャーはフォームをローンチ(ランチ)します。
実は、この場合の表:&tblはフォームの編集対象表の指定になります。
■フォームの編集対象表の指定ついて
編集対象表を伴っているフォームをローンチ(ランチ)する場合、
時として編集対象表の表がすでに開いていることがあります。
その場合には、桐からエラーメッセージ[KU0192 ○○.tbl 表 はすでに使用されています]が表示されます。
この時に、表:&tblにフォームの編集対象表を指定しておくと、桐に代ってランチャーが次のどちらかのメッセージを表示します。
【phase1A 表のウィンドウが存在する場合】
ターゲットのフォームの編集対象表とする表がすでに開いています
:
ターゲットのフォームは開かれませんでした
【phase2C 表のウィンドウが存在しない場合】
ターゲットのフォームを開く以前に
編集対象表とする表がイベント処理で使用されています
:
ターゲットのフォームは開かれませんでした
おそらくランチャーのメッセージの方が、[KU0192 ○○.tbl 表 はすでに使用されています]よりも意味が理解しやすいことでしょう。
なお、表のウィンドウが存在する場合には、ランチャーは自動的に表のウィンドウをフォーカスします。
以上の理由から、編集対象表を伴うフォーム:&wfmを指定する場合には、表:&tblにフォームの編集対象表名を指定することを推奨します。
■オプション(検索対象から除外する)
↑前の説明のように、フォーム:&wfmと表:&tblの両方を指定した場合には、フォームの編集対象表名も検索対象になります。
しかし、フォームの編集対象表名を検索対象にしたくない場合もあります。
それは、[フォームの属性]→[許可作業]→[多重化]が ON の場合です。
フォームの編集対象表の多重化が許可されている場合には、※もちろん、表:&tblを未定義値にすればOKなのですが…(^^ゞ
次のようにすれば、表:&tblにファイル名を指定したままで検索対象から除外出来ます。
(例)
名札 メイン
:
変数宣言 局所,整数{ &LNCmExact } /* ON:1 OFF:0 または未定義値 */
:
*
┌手続き定義開始 prcProcedureName( )
│
│ :
│ &LNCmExact = 1 /* 表:&tblを検索対象から除外します */
│ 手続き実行 HDLLNCprcWindowAppear( &wfm, &tbl, &hdl, &openStatus )
│ :
│
└手続き定義終了
■[コマンドボタンの機能名:開く]と[ランチャー]の違い
<NULLフォームを開く場合>
NULLフォームをコマンドボタンで開くと、コマンドボタンを実行する度に新規にフォームが開いていきます。
この時、NULLフォームが複数開かれていてもウィンドウが重なって表示されるために気が付かないことが多いです。
しかし、ランチャーでNULLフォームを開くと、NULLフォームが複数開かれることはありません。
NULLフォームがすでに開いていた場合には、ウィンドウをフォーカスするだけです。
<オーバーラップ形式のフォームの場合>
オーバーラップ形式のフォームでコマンドボタンで表を開くと表ウィンドウが開かれますが、
その表ウィンドウはオーバーラップ形式のフォームに隠されて見えません。
一方、ランチャーで表ウィンドウを開こうとすると、
次のメッセージが表示されて表ウィンドウはローンチ(ランチ)されません。
【phase3B 表のウィンドウが存在しない場合】
オーバーラップ形式のフォームなので表ウィンドウは表示できません。
:
【phase2A 表のウィンドウが存在する場合】
表がすでに開いています
:
オーバーラップ形式のフォームなので
表編集ウィンドウをフォーカスできません
以上
|