2012年07月14日

ツリー(ツリービュー) その1

ツリービューは、プロデルでは「ツリー」と呼ばれます。もちろん、フォルダのツリービューなどでおなじみの、あの「ツリービュー」です。もちろん、動作や操作も同じです。

■準備

ツリーを動作させるためには、部品の中で使われるアイコンの画像ファイルが必要になります。ツリービューを操作して、フォルダを開いたり閉じたりした時に、「ドキュメント プラス」「example マイナス」というようにガイドされますが、この プラス・マイナス は、ここで使われる画像を読んでいます。したがって、この画像を使わないと、画面上でも、音声でも、フォルダの開閉を確認することが出来ません。
画像ファイルは、プロデルのインストールフォルダの中にあります。普通にインストールしていれば、次のパスの例になります。

"C:\Program Files\Produire\サンプル\image"

ツリーを使うプロデルのファイルと同じ場所に、「image」というフォルダを作成し、上記のフォルダの中から、ツリーの表示と動作に必要な画像ファイルをコピーしておきます。
※面倒くさかったら、「image」のフォルダごとコピーしてもOKです。

●必要なファイル
document.ico … ファイルに使用されるアイコン
folder_close.ico … フォルダが閉じた時のアイコン( + )
folder_open.ico … フォルダが開いた時のアイコン( - )

■プログラムの例

今回は、特定のフォルダの中のフォルダの一覧を、ツリーに追加するプログラムを紹介します。そして、次回は、より実用的な、フォルダの中のファイルも一緒に追加するプログラムを紹介することにします。
※ここでは、例として[マイドキュメント]の中のフォルダを表示させています。たぶん、ここはフォルダの数が多いため、表示に時間がかかると思います。F5キーでプログラムを実行してから、少し時間をおいて下さい。
※ドライブ(C:\ など)や、「C:\Program Files」「C:\Windows」などのフォルダは追加することが出来ないようです。

──────────────────────────────
「Produire.WinControl.dll」を利用する
ウィンドウ1を表示する
待機する

ウィンドウ1とは
ウィンドウを継承する

はじめの手順
初期化する
ツリー1を更新開始する
ツリー1に「[マイドキュメント]」をフォルダ追加する
ツリー1を更新終了する
終わり

初期化する手順
ーーこの手順は自動生成されたものです。編集しないでください
この内部領域大きさを{245、364}に変える
この内容を「ウィンドウ1」に変える

ラベル1というラベルを作る
その内容を「フォルダ」に変える
その位置と大きさを{13、13、40、12}に変える

ツリー1というツリーを作る
その項目高さを14に変える
その位置と大きさを{13、29、219、278}に変える

ボタン1というボタンを作る
その内容を「閉じる」に変える
その位置と大きさを{157、326、75、23}に変える

終わり

ーーツリーにフォルダを追加する
[ノード]に、[パス]を、フォルダ追加する手順
【フォルダ名たち】
フォルダ名たちは、パスのフォルダの一覧
【フォルダ名】
【子ノード】
フォルダ名たちをフォルダ名にそれぞれ繰り返す
子ノードは、ノード:フォルダ名を「image\folder_close.ico」で追加したもの
子ノードに、パス&「\」&フォルダ名をフォルダ追加する
繰り返し終わり
終わり

ツリー1が折りたたみ後時の手順
イベントの対象のアイコンを「image\folder_close.ico」に変える
終わり

ツリー1が展開後時の手順
イベントの対象のアイコンを「image\folder_open.ico」に変える
終わり

ボタン1がクリックされた時の手順
自分を閉じる
終わり

終わり
──────────────────────────────

■プログラムの説明

──────────────────────────────
「Produire.WinControl.dll」を利用する
ウィンドウ1を表示する
待機する

ウィンドウ1とは
ウィンドウを継承する

はじめの手順
初期化する
ツリー1を更新開始する
ーーツリーのように、表示に比較的 時間のかかる部品の場合は、
ーーこの「更新開始」を使います。一時的に部品の中の表示を抑制します。

ツリー1に「[マイドキュメント]」をフォルダ追加する
ーーマイドキュメントの中のフォルダを追加します。
ーー他のフォルダを、パスで指定する時は、末尾の「\」は不要です。
ーー(例) ツリー1に「D:\example」をフォルダ追加する

ツリー1を更新終了する
ーー二つ 上の行で開始した、表示の更新=抑制を解除します。

終わり

初期化する手順
ーーこの手順は自動生成されたものです。編集しないでください
この内部領域大きさを{245、364}に変える
この内容を「ウィンドウ1」に変える

ラベル1というラベルを作る
その内容を「フォルダ」に変える
その位置と大きさを{13、13、40、12}に変える

ツリー1というツリーを作る
その項目高さを14に変える
ーー表示する項目(フォルダ)の高さを指定しています。
ーー既定値は、14(ピクセル)になっています。

その位置と大きさを{13、29、219、278}に変える

ボタン1というボタンを作る
その内容を「閉じる」に変える
その位置と大きさを{157、326、75、23}に変える

終わり

ーーツリーにフォルダを追加する
[ノード]に、[パス]を、フォルダ追加する手順
ーー「ノード」とは、ここでは「ツリーの要素」というような意味です。
ーー「パス」は、追加するフォルダ名を代入する変数です。
ーーここでは、[マイドキュメント]が代入されています。
ーーまとめると、[パス]の中のフォルダの一覧を、
ーーツリーの要素に追加する手順をここから下に書きますよ、
ーーという意味になります(…たぶん)。

【フォルダ名たち】
フォルダ名たちは、パスのフォルダの一覧
【フォルダ名】
【子ノード】
ーーここは、おそらく「局所変数」を宣言しているのではないかと
ーー私は推測しているのですが、私の推測はあてにならないので、
ーー鵜呑みにしないよう注意。
ーー実際にプログラムを書く時は、そのままコピペして下さい。

フォルダ名たちをフォルダ名にそれぞれ繰り返す
ーー「フォルダ名たち」は配列で、「フォルダ名」は、その要素です。
ーー要素の数だけ、下ノ命令文を繰り返せ、という意味になります。

子ノードは、ノード:フォルダ名を「image\folder_close.ico」で追加したもの
ーー指定したフォルダ(このプログラムでは[マイドキュメント])の、
ーー直下にあるフォルダを、まずツリーに追加します。

子ノードに、パス&「\」&フォルダ名をフォルダ追加する
ーー追加したフォルダ内のサブフォルダを、そのフォルダの中に追加します。
ーーこの段階では、直下のフォルダは閉じた状態なので、
ーーサブフォルダは見えません(表示されていません)。

繰り返し終わり
終わり

ツリー1が折りたたみ後時の手順
イベントの対象のアイコンを「image\folder_close.ico」に変える
ーーユーザーがツリーを操作して、フォルダを折りたたんだ時に、
ーーフォルダのアイコンの画像を「+」に変えろ、という命令です。

終わり

ツリー1が展開後時の手順
イベントの対象のアイコンを「image\folder_open.ico」に変える
ーーユーザーがツリーを操作して、フォルダを開いた時に、
ーーフォルダのアイコンの画像を「-」に変えろ、という命令です。
ーー同時に、自動的に、サブフォルダが展開されます。

終わり

ボタン1がクリックされた時の手順
自分を閉じる
終わり

終わり
──────────────────────────────

■参考

リファレンス > ウィンドウ部品集 > ツリー
http://rdr.utopiat.net/docs/reference/wincontrol/treeview.htm

リファレンス > コントロール部品 > ツリー項目
http://rdr.utopiat.net/docs/reference/wincontrol/treenode.htm

※インターネットの「お気に入り」をツリーに読み込むプログラムの例が、サンプルの中にあります。こちらもどうぞ。
"C:\Program Files\Produire\サンプル\ウィンドウ部品\お気に入りツリー.rdr"
posted by yanikun at 16:36| Comment(0) | TrackBack(0) | produire

2012年07月15日

ツリー(ツリービュー) その2

━━━━━━━━━━━━━━━━━━━━━━━━━
※2012年7月17日 修正:
先日アップロードしたプログラムには欠陥があり、
正しく動作しない場合があることがわかりましたので、
修正したものをアップし直します。
━━━━━━━━━━━━━━━━━━━━━━━━━

今回は、前回で書いたとおり、フォルダだけでなく、ファイルの一覧も追加して、選択したファイルを開くプログラムを紹介します。なお、プログラムの説明は次回にします。

■プログラムの例

──────────────────────────────
「Produire.WinControl.dll」を利用する

ウィンドウ1を表示する
待機する

ウィンドウ1とは
ウィンドウを継承する

はじめの手順
初期化する
終わり

初期化する手順
ーーこの手順は自動生成されたものです。編集しないでください
この内部領域大きさを{245、364}に変える
この内容を「ウィンドウ1」に変える

ラベル1というラベルを作る
その内容を「フォルダ」に変える
その位置と大きさを{13、13、40、12}に変える

ツリー1というツリーを作る
その項目高さを14に変える
その位置と大きさを{13、29、219、278}に変える

選択ボタンというボタンを作る
その内容を「選択」に変える
その位置と大きさを{13、329、65、23}に変える

開くボタンというボタンを作る
その内容を「開く」に変える
その位置と大きさを{87、329、65、23}に変える

閉じるボタンというボタンを作る
その内容を「閉じる」に変える
その位置と大きさを{163、329、65、23}に変える

終わり

ーーフォルダの選択
選択ボタンがクリックされた時の手順
フォルダ選択画面を表示する
もしフォルダ選択画面のキャンセルなら、手順から抜ける
フォルダ名は、フォルダ選択画面のフォルダ名
ツリー1をクリアする
ツリー1を更新開始する
ツリー1に「[フォルダ名]」をフォルダ追加する
ツリー1を更新終了する
ツリー1にフォーカスする
終わり

ーーツリーにフォルダを追加する
[ノード]に、[パス]を、フォルダ追加する手順
【フォルダ名たち】
フォルダ名たちは、パスのフォルダの一覧
【フォルダ名】
【子ノード】
フォルダ名たちをフォルダ名にそれぞれ繰り返す
子ノードは、ノード:フォルダ名を「image\folder_close.ico」で追加したもの
子ノードに、パス&「\」&フォルダ名をフォルダ追加する
繰り返し終わり

【ファイル名たち】
ファイル名たちは、(パス&「\*.txt;*.doc」)のファイルの一覧
【ファイル名】
ファイル名たちをファイル名にそれぞれ繰り返す
ノード:ファイル名を「image\document.ico」で追加する
繰り返し終わり
終わり

ツリー1が折りたたみ後時の手順
イベントの対象のアイコンを「image\folder_close.ico」に変える
終わり

ツリー1が展開後時の手順
イベントの対象のアイコンを「image\folder_open.ico」に変える
終わり

ーーファイルを開く
開くボタンがクリックされた時の手順
判定は、[正規表現:ツリー1の選択内容から「.*\.txt」を取り出したもの]
もし、判定が「{}」でないなら
一覧は、[フルパスで「[フォルダ名]」のファイルの全一覧]
配列は、一覧から「[ツリー1の選択内容]」を探す
番号は、配列(1)
パス名は、一覧([番号])
ファイル名は、「"[パス名]"」
ファイル名を起動する
もし終わり
終わり

閉じるボタンがクリックされた時の手順
自分を閉じる
終わり

終わり
──────────────────────────────
posted by yanikun at 09:43| Comment(0) | TrackBack(0) | produire

2012年07月17日

ツリー(ツリービュー) その3

■前回のプログラムの説明

前回 紹介したツリーのプログラムの説明です。ウィンドウの作成(初期化)のプログラムの説明は省略しています。

──────────────────────────────

ーー(ウィンドウの初期化と表示 = 省略)

ーーフォルダの選択
選択ボタンがクリックされた時の手順
フォルダ選択画面を表示する
もしフォルダ選択画面のキャンセルなら、手順から抜ける
フォルダ名は、フォルダ選択画面のフォルダ名
ツリー1をクリアする
ーー起動して、最初にフォルダを選択する時には必要有りませんが、
ーー起動したまま、次のフォルダを選択すると、
ーー前のフォルダの一覧がツリーに残ってしまい、
ーー新たに選択した内容と重複して表示されてしまうため、
ーーいったん、前のフォルダの一覧をクリアしておきます。

ツリー1を更新開始する
ツリー1に「[フォルダ名]」をフォルダ追加する
ーーフォルダ選択画面で選択されたフォルダ(のパス)を、ツリーに追加します。

ツリー1を更新終了する
ツリー1にフォーカスする
ーーユーザー(最初は あなた自身ですが)の手間を省くため、
ーーフォルダを追加した後、ツリーにフォーカスを移動させます。
ーー別に無くてもかまいませんが。

終わり

ーーツリーにフォルダを追加する
[ノード]に、[パス]を、フォルダ追加する手順
【フォルダ名たち】
フォルダ名たちは、パスのフォルダの一覧
【フォルダ名】
【子ノード】
フォルダ名たちをフォルダ名にそれぞれ繰り返す
子ノードは、ノード:フォルダ名を「image\folder_close.ico」で追加したもの
子ノードに、パス&「\」&フォルダ名をフォルダ追加する
繰り返し終わり

【ファイル名たち】
ファイル名たちは、(パス&「\*.txt」)のファイルの一覧
ーー【ファイル名たち】は、局所変数(私の根拠なき推測)なので、
ーーこの書き方は、ツリーの手順の中でしか使えません。
ーーここでは、追加するファイルの拡張子を指定(絞り込み)しています。
ーー「\*.txt」は、テキストファイル.txt だけを抽出しろ、という指定です。
ーー他の 複数の拡張子を指定する時は、たとえば次のように書きます。
ーー「\*.txt;*.doc;*.docx;*.xls;*.xlsx」 … テキストファイルと、
ーーOffice文書(Word・Excel)を抽出して表示します。
ーー「\*.*」 … 全ての拡張子のファイルを表示します。

【ファイル名】
ファイル名たちをファイル名にそれぞれ繰り返す
ノード:ファイル名を「image\document.ico」で追加する
ーー上記の拡張子のフィルターで抽出したファイルを、
ーーそれぞれのフォルダの下(中)に追加します。
ーー指定したフォルダの直下のファイルは、ツリーの下の方に、
ーー独立して表示されます。

繰り返し終わり
終わり

ツリー1が折りたたみ後時の手順
イベントの対象のアイコンを「image\folder_close.ico」に変える
終わり

ツリー1が展開後時の手順
イベントの対象のアイコンを「image\folder_open.ico」に変える
終わり

ーーファイルを開く
開くボタンがクリックされた時の手順
判定は、[正規表現:ツリー1の選択内容から「.*\.txt」を取り出したもの]
ーーツリーが選択された時、つまりカーソルが合った時に、
ーーそれがフォルダである時には、ファイルを開かないようにするために、
ーー拡張子を含んだファイル名かどうかを判定します。
ーー正規表現で取り出した結果が、配列の形で取得されます。
ーーそれを「判定」という変数に入れます。
ーー時々、拡張子の付いていないファイルもありますが、ここでは無視します。

もし、判定が「{}」でないなら
ーー拡張子が含まれていない時は、配列の要素が無し、
ーーつまり {} というふうに返されてきますので、
ーーそれ以外の場合だけ、次の手順に進みます。

一覧は、[フルパスで「[フォルダ名]」のファイルの全一覧]
ーー指定したフォルダ内の全てのファイルの一覧を取得します。
ーーサブフォルダ内のファイルも必要なため、「全一覧」と指定します。
ーーファイルを開くのに必要なため、「フルパスで」と指定しています。

配列は、一覧から「[ツリー1の選択内容]」を探す
ーー取得したファイルの全一覧から、ツリーの選択内容、
ーーつまり、選択されているファイル名を探します。
ーー結果は、配列の形で返されます。
ーー例:{3} ファイルの一覧の、3番目に、目的のファイルが
ーー存在することを示しています。

番号は、配列(1)
ーーほとんどの場合、ルートフォルダ内には、
ーー同じ名前のファイルは一つのことが多いので、
ーー上記の手順で取得される配列の個数は1個になります(※注)。
ーーそこで、配列の1番目の数字を[番号]という変数に入れます。

パス名は、一覧([番号])
ーーファイルの一覧(配列)の何番目のファイルなのかを指定して、
ーーそのフルパスを取得します。
ーー上記で挙げた例では3番目なので、全一覧の3番目のファイルの
ーーフルパスを取得することになります。

ファイル名は、「"[パス名]"」
ーーファイルパスに、半角/全角のスペース文字が含まれている場合に備えて、
ーー " " でパス名を括っておきます。
ーーなお、スペースが含まれていないファイル名も、これで問題ありません。

ファイル名を起動する
ーー選択したファイルの拡張子に関連付けされたアプリケーションを起動して、
ーーファイルを開きます。
ーーこのプログラムでは、テキストファイル .txt を指定しているので、
ーーテキストエディタが起動します。

もし終わり
終わり

閉じるボタンがクリックされた時の手順
自分を閉じる
終わり

終わり
──────────────────────────────

※注:ルートフォルダ内の、別のサブフォルダに、同じ名前で内容の異なるファイルが存在する場合は、ちょっと面倒なことになります(例としては少ないかもしれませんが)。
なんとか、ツリーの中の手順で解決しようとしたのですが、なかなかうまくいかず、別のウィンドウを表示して対処する方法を考えました。
そのプログラムの例を、次回掲載したいと思います。
posted by yanikun at 03:28| Comment(0) | TrackBack(0) | produire