Launcher(ランチャー)

   
INF_Framework は ONnoji さん作成のフリーのライブラリです。
フォームに便利な機能を追加してくれます。
ここでは INF_Framework が適用されたフォーム の便利機能を、
簡単に利用できるように解説していきたいと思っています。
最新のライブラリ は次の通りです。
※ INF_Framework_第3.3版_改訂版(MkII) 基本セット for 桐9-2012 / 桐9s / 桐10 / 桐10s / 桐sSL
※ INF_Framework_第3.3版_改訂版(MkII) サンプル集 for 桐9-2012 / 桐9s / 桐10 / 桐10s / 桐sSL
ライブラリは 所定のサイト からダウンロードしてください。
※ 桐10 / 桐10s / 桐sSL で使用するには、ファイルのコンバートが必要です。 
更新日:2022年10月10日

Launcher(ランチャー)は、すべてのINF_Framework 共通の機能です。 (注)
 
(注)モダンINF_Framework、クラシックINF_Framework、NULL INF_Framework
※ MkII を含みます。
ランチャーを使ってフォームを起動するには、次の プロシージャ を実行します、終わり。
 
手続き実行 HDLLNCprcWindowAppear( &wfm, &tbl, &hdl, &openStatus )
ははは 不親切な説明ですね。しかしそれほど簡単です。

 

例)
 手続き定義開始 cmdLauncherClick ()
  変数宣言 自動,文字列{ &wfm , &tbl }
  変数宣言 自動,整数 { &hdl, &openStatus } /* この変数は宣言するだけです */
  &wfm = #一括パス名 + "郵便番号簿.wfx"
  &tbl    = #一括パス名 + "郵便番号簿.tbx"
  手続き実行 HDLLNCprcWindowAppear( &wfm, &tbl, &hdl, &openStatus  )
 手続き定義終了

 

&wfm には フォーム名を代入します。フルパスで指定してください。
※同じフォルダにあるフォームや表を指定する場合には、#一括パス名 を利用すると便利です。
&tbl には テーブル名を代入します。フルパスで指定してください。 
※表(テーブル)はフォームと同一のフォルダに入れておくことをお勧めしますが
 フォームと同じフォルダの必要はありません。年度、部門 等で専用のフォルダに分類することが合理的なケースもあるかと。
&hdl, &openStatus は 宣言するだけで値は代入しません。 (注)
(注)NF_Framework が使用します。
 &hdl には成功時にハンドル番号が、失敗時にはゼロ(0)が代入されます
 &openStatus には、新規にウィンドウを開いた時にイチ(1)、それ以外にはゼロ(0)が代入されます
INF_Framework の Launcher は 編集状態でも機能します。
フォームのみを指定する、表のみを指定する、フォーム と 編集対象表 の両方を指定する。
INF_Framework の Launcher は どの場合でも機能します。

 


<< 設定例 (サンプル集) >>

1.
コマンドボタンから HDLLNCprcWindowAppear を呼び出す手続きを実行する。コマンドボタンの設定は次の通りです。
1‐1.
コマンドボタンを押した際に、強制的に表示モードに切り替えた後 手続き実行 する場合のサンプルです。
 
■で囲まれたコマンドボタン [郵便番号簿] で開くフォームは、編集対象表を持った通常のフォームです。



1‐2.
コマンドボタンを押した際、編集・表示のモードはそのまま変更せずに ランチャーを使用する場合のサンプルです。
 


1‐3.
対応するイベントは次のようになります。パスを含めたファイル名を 変数に代入して、ランチャーのプロシージャを実行します。
 





2.
NULLフォームを呼び出す場合の プロシージャ
2‐1.
定義画面です。
 
■で囲まれたコマンドボタン [MainMenu] で開くフォームは、編集対象表を持たない NULLフォーム です。



2‐2.
対応するイベントは次の通りです。
 
MainMnue.WFX は NULLフォームなので 変数 "&TBL" には何も代入しません(なのにランチャーが使える (^^♪ )



 
※ここで呼び出す MainMnue.WFX は 、例えば次のようなフォームです。






3.
コマンドボタンの機能パラメータリストに ファイル名を引数としてセットする場合のサンプル
3‐1.
通常のフォームの場合 ( TBLがセットされている)
3‐1-1.
定義画面です。
 


3‐1-2.
対応するイベントは次の通りです。
 
ここでは ファイルのパスを追加したのちに ランチャーのプロシージャ  HDLLNCprcWindowAppear を呼び出しています。
※ここでのパスは ♯一括パス名 を利用しています。



3‐2.
NULLフォームを引数にセットする場合(NULLフォームなので 編集対象表はありません)
3‐2-1.
定義画面です。
 


3‐2-2.
対応するイベントは次の通りです。フォームMainMenu は NULLフォームなので 変数 &tbl の値は未定義値にします。
 


3‐3.
ファイルとパスを 名札メイン であらかじめ変数に代入しておく場合。
3‐3-1.
名札メイン であらかじめ パスを含めたファイル名を変数に代入しておきます。
 

3‐3-2.
対応するコマンドボタンの属性は次の通りです。
 
〇 コマンドボタン:MainMenu



〇 コマンドボタン:住所録


3‐3-3.
コマンドボタンに対応するプロシージャは次の通りです。
 





4.
HDLLNCprcWindowAppear を呼び出すプロシージャは1つだけで済ませることもできます。
 
※ランチャー以外の処理がある場合も、ここの1ヶ所での記載ですみます(できるだけ単純になるように心がけましょう)

4-1.


4-2.
対応するコマンドボタンの属性は次の通りです。
 
〇 コマンドボタン:住所録



〇 コマンドボタン:郵便番号簿





5.
サンプル4 のイベントを流用して、コマンドボタンを次のように設定すると表だけを開くことができます(フォームは開かない)。
 
〇 コマンドボタン:住所録 でフォームは開かず、表(tbx) だけを開く



〇 コマンドボタン:郵便番号簿 でフォームは開かず、表(tbx) だけを開く


ここでの記載方法:パス+ファイル名を変数に代入して、引数で渡す。
サンプル4 と全く同じルールに沿っている。

コマンドボタンの属性でファイル名を渡す引数の部分の記載を少し変更するだけで、
イベントはサンプル4をそのまま流用して 表(tbx) のみを開くようにすることができました。引数って便利ですね (^_-)
 
コマンドボタンを押すと、次のような感じで表を開くことができます。

 


 

桐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 のランチャーに関するメモ 1st_Spec_Memo_HDLLNC.txt INF_Framework 第3.3版 改訂版(MkII) より転載

 ■引数について

 ランチャーの基本形は次の通り。

 手続き実行 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 表のウィンドウが存在する場合】
  表がすでに開いています
    :
  オーバーラップ形式のフォームなので
  表編集ウィンドウをフォーカスできません

 以上