MAGIC V10解析(8)
ノードIDが危ない?
いきなり変なタイトルですみません。m(__)m
実は、XML連携時に自動的に作成されるノードIDの値がちょっと問題になっていまして・・・。(個人的にですが・・・w)
というのは、いつぞやの回で、「ノードIDはXML上の記述順を保証する」と思い、ついつい、そう書いてしまったんですが、これがそうでもないようなのです。
これが崩れると非常に困るわけで・・・。
私が確認したのは、データリポジトリのカラム表示順の取得に関する現象だったのですが、つい最近、前回作成したプログラム一覧のプログラム番号の取得でも同じような現象が起きてしまいました。
実はデータリポジトリの解析の件は、ここでの新しいネタにしようと思っていたのですが、そういうわけでしばし保留にさせて下さい。
こうして前回までのプログラムを見直してみると、結構キケンな場所が幾つかあるようです。
その1:プログラム番号の取得
プログラム番号の取得は、XML連携で生成されるノードIDを信じて作っていましたが、これはちょっとキケンです。やはり、「'%Source%\Progs.xml'」を取り込んで、
Val(XMLGet (1,1,'/Application/ProgramsRepositoryOutLine
/Programs/Program['&Trim(Str(D,'5'))&']','id'),'5')
で、順にIDを取得すべきかと考えます。
その2:タスク構造の取得
前回作ったプログラムは、タスクIDの1番が必ずあるという想定ですが、これは思いっきり外しています。
加えて言うなら、タスクIDを中心に親子の関連を形成してしまうと、タスクツリーが表示順にならないんですよねぇ・・・。(^^;
これらは、改造が必要です。タスク番号もプログラム番号の取得と同じように、順に0(ルートタスク)からの連番で割り当てたほうが良いようです。
タスクIDはツリー表示を行う上では属性値として扱いましょう。
ということで、完成しました。(何時の間に・・・!)
プロジェクトフォルダの取得について
作ったプログラム一覧のプログラムを、現在開発している任意のアプリケーションに組み込んで実行させることを考えて見ます。
つまり、開発しているアプリケーションには殆ど何のプログラムを追加すること無しに作成したプログラム一覧のプログラムを実行させるわけですが、その場合は、キャビネットとしてアプリケーションを出力し、コール公開で呼び出せばOKです。
任意のホストアプリ → キャビネット出力したECF公開プログラム
公開プログラム側の手順
- ラッパープログラムの作成
仮に「開発中のプログラム一覧」という名前のバッチタスクのプログラムを作成します。
このプログラムで、下記の値から現在起動しているホストアプリケーションのプロジェクトのパスを取得することが可能です。Translate('%WorkingDir%')取得したプロジェクトのパス名を論理名にセットします。
当アプリケーションでは、XML形式のデータリポジトリに使用している「%Source%」をセットすることになります。
更に、プログラム番号の取得用に使用しているメモリテーブル「Progs.ProgNo」を「DbDel」し、「プログラム一覧」のプログラムをコールします。
公開名に適当な名称(「ListProgs」など)を付けます。 - 「プログラム一覧」プログラム
プログラム一覧は、プログラム番号の取得用に使用しているメモリテーブル「Progs.ProgNo」が空であれば、自動的に再取得するような仕組みになっています。 - タスク一覧プログラム
タスクのツリーを表示するプログラムでは、ビットマップファイルを使用していますが、その「イメージ一覧ファイル名」の式欄に下記のようにセットします。ProjectDir()&'TREE.BMP'
- キャビネット出力
ファイルプルダウンメニューからキャビネットファイル(「V10HACKS.ecf」等)を出力します。
任意の開発中のアプリケーション側の手順
- メインプログラムの修正
メインプログラムを開き、ロジックにイベントを追加します。(「Ctrl+H」→「E」→「S」→「Tab」→「Ctrl+F7」→「Enter」等)
行を追加(「F4」キー)し、コール、「N=公開名」、「公開プログラム名」に式で'ListProgs'、「キャビネットファイル」に、出力したキャビネットファイルのファイル名を入力します。 - プログラムの実行
任意のプログラムを実行している最中などに、登録したホットキー(上の例では、「Ctrl+F7」キー)を押します。
実行中のアプリケーションのプログラム一覧が表示され、任意のプログラムでF5キー押下によりタスクツリーが表示されればOKです。

プロジェクトフォルダの取得方法には2種類存在する!
この例で述べたように、ホストアプリケーションで実行した場合は、ProjectDir()関数も、%WorkingDir%論理名もプロジェクトフォルダと同じフォルダのパス名を返しますが、コンポーネント等のアプリケーションで実行した場合は、ProjectDir()関数が、コンポーネントのフォルダを、%WorkingDir%論理名はホストアプリのフォルダをそれぞれ返すような仕様になっているようです。
今回のプログラムソース
今回もソース公開しておきます。
いろいろと良いアイデアがありましたら、教えて下さい。
MAGIC V10解析(1)
Size
8339
-
File type
text/html
MAGIC V10解析(2)
Size
8904
-
File type
text/html
MAGIC V10解析(3)
Size
9714
-
File type
text/html
MAGIC V10解析(4)
Size
9882
-
File type
text/html
MAGIC V10解析(5)
Size
10443
-
File type
text/html
MAGIC V10解析(6)
Size
9739
-
File type
text/html
MAGIC V10解析(7)
Size
12563
-
File type
text/html
V10HACKS_20070306.lzh
Size
60.3 kB
-
File type
application/x-lzh
- Category(s)
- dbMAGIC
