VB4での再頒布可能なファイルのリスト
著作権表示に関して
(上記のFAQでの記述より)
VB を使用してアプリケーションを作成された場合には、著作権の表示が必要となります。製品に添付されております使用許諾契約書をご覧ください。
製品の著作権表示は、お客様が配布されるアプリケーションのメディア(フロッピディスク / CD)のラベル、作成されたアプリケーション起動時のタイトル、作成されたアプリケーションのバージョン情報ダイアログのいずれかに、次のいずれかの英文での著作権表示が必要となります。また、著作権表示に示されている西暦は、VB のディスクラベル / CD に記載されている西暦を記載していただくようにお願いします。この西暦は製品ごとに異なっている場合がありますので十分ご注意ください。なお、以下の著作権表示に使用されている西暦はVisual Basic Enterprise Edition 4.0 を使用した場合のものです。
Copyright&Copy; 1991-1996 Microsoft Corporation, all rights reserved.
Copyright&Copy; 1991-1996 Microsoft Corporation.
Portion Copyright&Copy; 1991-1996 Microsoft Corporation.
著作権の表示方法は、製品によって異なりますので VB 以外の製品の場合には製品添付の使用許諾契約書をご覧ください。
「作図の継続」や「測定」の実装
ver.0.1では,「作図ができないじゃないか」ということで,次のステップは「作図の継続」等の実装です。しかし,これが簡単そうに見えて,そんなに簡単じゃない。というのも,プログラミングスタイルがMBとVBで違うからで,点の選択の実装でもかきましたけど,今までであれば,「垂直二等分線の作図」に関しては,こういう流れでこういう作業をしてねというのを,そのままコーディングできたわけです。いわば,
メイン → 入力待機 ------+ 分岐 +-->処理A -> ・・・ -> 処理終了 --> メインへ
+-->処理B -> ・・・
という感じでしょうか。いずれにしても,メインでの分岐に戻るまでは,それぞれの処理の中にいることが確保された中で,どこで入力を得るのかそれをどう使うのか等を記述できるわけです。しかし,VBでは,イベントドリブンであり,私が感じる印象としては,
メイン(イベントを関知可能な状態)
キーボード------>
マウス---------->各イベントプロシージャ
その他---------->
(今までの処理 A 全体に該当していたこと)
処理A1 - ・・・(内部処理のみ) ・・->メイン (入力が必要なときは戻らないといけない)
処理A2 - ・・・(内部処理のみ) ・・->メイン
処理A3 - ・・・(内部処理のみ) ・・->メイン
処理A4 - ・・・(内部処理のみ) ・・->メイン
というように,「入力が必要な場合」によって,今までまとまっていた処理を分断しなければなりません。しかも,今まではプロシージャの中で,ある入力を求める場合は,そのときの状態は,そのプロシージャのテンポラリな内部変数が使えたわけですけど,今回は,処理を「終了させてイベント監視に渡す」必要があるので,今までのテンポラリな変数の中のかなりの部分の可視性を広げなければなりません。つまり,モジュールレベルの変数やグローバルレベルの変数にしなければなりません。
こういう点は,MSコードをVBに移植するにあたっては,結構面倒です。
ただ,そうは言っても,今まででも,コーデングの大変なかなりの部分は,インターフェイス作りの部分なので,それをコンポーネントをそのまま使えばいいという省力化を考えると,楽になる部分も大きいですけど。
また, 今まででの「処理 A 」という流れを,分断したいくつかのプロシージャの流れとして交通整理しなければならないので,「状態」を把握する変数を,かなり緻密に作らないといけないことになります。プログラミング全体としては,ある意味で,わけのわからない長いプロシージャが減り,状態を変数群で把握可能にするというのは,いいことなのかもしれませんが。
幾何的対象の「選択」
イベントは,基本的にはキーボードとマウスから得られますが,例えば,Geometric Constructorの場合の基本的な入力は,「どの直線を選択するの」というようなことです。つまり,オブジェクトの選択です。そういう「オブジェクトの選択」をどう作るかが,ソフトにとっては,結構重要なことじゃないかと思います。Geometric Constructorの場合は,DOS版のときから,
点・直線系・円 : マウス・キーボードによる選択プロシージャを使う
変数 : メニューからの選択
だったので,前者に関しては,そのプロシージャをうまく分割・整理することによって,代替プロシージャを作りました。そして,それが作れると,後はかなりスムーズに,コーディング・デバッグを進めることができました。しかし,たとえば,状況によって,選択可能な対象の種類が変わったりするのだけれど,そういうのを,同一のイベントプロシージャの中で記述する必要があるので,それを制御するための変数をいろいろ工夫することが,結構面倒でした。
なお,変数の方に関しては,今までのメニュープロシージャは使えないので,工夫し直さないといけないので,先送りになりました。そういう意味で,現状では,「変数を選択」するような作図メニューは使えません。
開発環境としてのVBの便利さ(1)
今まではVBはせいぜいテスト的にしか使っていなかったので,本格的に利用したのは今回が初めてと言ってもいいのですが,多少遅い部分はあるものの(5100,32Mのノートパソコンなので),かなり快適であることを感じています。いくつか挙げてみましょう。このことについては,またいつか追加したいだろうから,とりあえず,(1)ということにしましょう。
- 規模が大きくてもインタープリタ環境でデバッグ可能
あまりに当たり前のことではありますが,DOS版のときは,本当に初期のときまでしか,これができませんでした。QBX環境下でコーディングして,コンパイルしてエラーのないことを確認し,次にリンクも含めてmakeして,それを実行して実行時エラーがないかどうかを確認する。おかしな症状が起こったときには,ウォッチしたいのだけど,それはできない相談だから,変数の値を画面に表示するコードを埋め込んでまたコンパイル & リンクする。そういうことの繰り返しです。だから,いかにして,コンパイルやリンクを省略し,自動化するかなんていうことが結構現実的な悩みであり,自分なりのツールを作ったりもしました。しかし,そういう苦労はなんだったんだろうと思うような感じ。Windows時代では当たり前のことに決まっているんだけど,改めてそれを実感しています。
- ウォッチが便利
また,デバッグで便利と思うのは,ウォッチが簡単。何しろ,変数の側にマウスポインタを置くだけで,その数値を表示してくれるんだから。もちろん,QBXでのインスタントウォッチも,それなりに便利ではあったけど,もっとお手軽です。
- オブジェクトブラウザ
また,ときどき使うのが,F2キーのオブジェクトブラウザ。これは結構重宝します。また,構造体のメンバについて,「あれ」って思うときなんかは,多少ゆっくり入力していると,「.」の次に可能な候補一覧を表示してくれるのも,結構便利。
実感としては,一方でプログラムを一生懸命分析し,利用可能なデータベースを構築・修正しながら,必要に応じてそれを参照したり,それを利用して,次に使う可能性のあるものを方向付けしてもらいながらやっていくというところでしょうか。まあ,そういうことをやりながらのコーディングなんで,ちょっと遅い感じがするんでしょうね。
- 画面が狭いよう。
しかしまた,同時に実感しちゃうのが,「画面の狭さ」。昔はVGAでも,あまり狭さは感じなかったんだけど,現在のSVGA(800*600)でも,とっても手狭っていう感じがする。通常はTFT液晶画面だけど,CRTにして,ちっちゃい字を眺める気もしないので,本格的にやるんだったら,21インチが必要っていうのもよく分かる感じ。(でも,そんなの部屋に置きたくないし。)
「数値の選択」
作図の関係で,今までにできていたのは,「いくつかの幾何的対象(点,直線,円)を元にした基本的な作図手続き」です。次の目標は,「数値」も利用する作図手続きの実装です。GC/DOSのときは,メニューを使って入力していました。しかし,GC/Winでは,この自作のメニューモジュールは使えません。そのため,インターフェイスを作り直す必要が出てきたわけです。新しいフォームを作り,今までの変数から選択する場合と新しく変数を作る場合を分け,作図手続きによって,何種類かの初期化ができるようにしました。GC/DOSと比べると,「数式」がまだないのですが,これは,また次の版での課題として残して置く事にしました。まずは,基本的な機能を実装して,ある程度「使えるものにする」ことが目標だからです。
例外的な作図手続き
基本設計に則しているものから,順番に作成したわけですが,「例外的」なものが残って行きました。代表的なものは,
です。冒頭の「新しく点を取る」ことは,これがないと「最初から作図する」ことができないため,焦眉の課題でした。また,「多角形」もできないと結構面倒です。n等分や角のn等分は,上記ほどの必要性はないのですが,特に「中点」はよく使う機能なので,なんとかしたいというものです。
基本設計に合わないので,「例外処理」的な扱いをすることにしました。そういうものを付け加えれば付け加えるほど,コードが複雑になり,扱いにくくなってしまいますが,こういうことは,多くの場合についてまわるものです。(そして,そういう例外処理の積み重ねに限界が目に見えて大きくなってくると,基本設計からやりなおし,メジャーの版の変更ということになります。)
バグ取りの実際
このような例外処理を付け加える作業では,基本設計の実装のときと比較すると,「バグ取り」の時間と複雑さが大きくなります。ある機能を実装するとき,基本的な線のみでコード化する場合,単純なバグは,最初の段階ですぐに分かります。しかし,そのときには起こらなかったような現象が,「例外的な処理」を加えると出てくることが多いのです。最初は,その例外的な処理に関するコードの不適切性かと思い,分析し,可能な場合は対処するのですが,それではうまく直らないことも出てきます。こういうときは,「それまでうまく動いていたコードに潜在してきたバグの顕在化」がほとんどです。Aという変数で書くべきだったのに,Bという変数で書いていたのだが,基本設計の場合には,実質的にどちらも同じ値を取るので問題はなかったのだが,例外処理ではそれが違う値をとるので,うまくいかなくなってくるなど,そういう現象です。
GC/Winの場合,典型的にそういう現象が生じたのは,「対象の選択」でした。マウスとキーボードでの選択を可能にしているのですが,片方でうまく動くことを確認していたら,他方で思わぬ現象が起きてきて,その協調性を探るということが多々ありました。
やはり,このようなところでも,MS-Basicのように,ある処理の中で,「どういう入力があったら,どう処理するか」というのを,別々に書いている場合は,バグの原因等を把握しやすいのに,イベント中心になっているために,複数のプロシージャを眺めないといけないというのは,事情をややこしくしているように思います。
こんなことってあるんだろうか。(1)
さて,いろいろな紆余曲折はあったものの,なんとか,ver.0.2として満足するものができました。ver.0.2.4です。しかしながら,実行ファイルを作ってみて,驚くようなことが起こりました。開発環境の中ではきびきび動いていたGC/Winがとっても遅いのです。常識的には,開発環境の中では,p-codeかなにかで,しかもデバッガが動きながらの動作なのだから,ネイティブコンパイラを使って作った実行ファイルの方が速いのが当たり前です。しかし,実際にはそれが逆になっている。正直言って,目の前が真っ暗になりました。
こんなことってあるんだろうか。
じつは,その前にも,同様のことが一つありました。それは,コモンダイアログで,Cancelをうまく認識してくれないことです。しかし,それはおそらく,コモンダイアログocx自身の問題なので,自分では直せない。あるいは,ocxを入れ換えることで対応すればいいと,諦めました。しかし,今回は事情が全く異なります。正直言って,これでは使い物にならない。呆然とした気持ちになりました。
しかも,確認してみると,ver.0.0では,そういう現象は起こっていないのです。また,統合環境内ではうまく動作するということは,論理的には,問題はないのです。VB自体の問題なんだろうか。....
こんなことってあるんだろうか。(2)
まずは,VBの問題ではないかと,次のような順序で対処してみました。
- コンパイル形態を変えてみる。
- 最適化スイッチを変える
- ネイティブではなく,p-codeにしてみる。
- VBのサービスパック2 をインストールしてみる。
ところが,事情は変わりません。呆然とした気持ちになりました。
ここから先はもう時間的な問題からやらないことにしようかと思っていたのですが,「ちょっとだけ」という気持ちで,次のような仮説を立て,対処してみました。
- まず,ベンチマークのための機能を実装する。(100の変形で何秒かかるかを計測)
- 点の名前の表示で遅いのではないか。
だめ。
- フォームが多いのではないか。
一つのフォーム以外はすべて削除してみました。しかし,だめ。
- 作図で無駄なルーチンはないか。
GC/DOSでのルーチンを移植したので,そういう部分が何カ所が見つかりました。統合環境内では,今までよりも高速化されました。しかし,EXEでは,あまり効果がありません。
- 大幅な削減
メニューに関連するかなりのコードを削減してみました。すると,うまく動作することを発見しました。そのときの喜びと言ったらありません。次は,絞り込みです。
- イベントトラップが多過ぎるのではないか。
メニューが関係しているのではと思いました。つまり,イベントトラップの数が多くなるからです。メニューを削減しましたが,効果はありませんでした。
- ステータスバーへの書き込みの削減
関連する部分を観察して,ステータスバーへの書き込みがかなり多いことに気づきました。状態変数を緻密にする必要があることは,以前にも述べましたが,それが変更するたびに,ステータスバーでの表示を変更していました。これはDOSのときからの伝統です。実は,結果的には,これが問題でした。変形のとき,一つの図を書くごとに,「変形」「計算中」の状態が変わるのですが,それに伴うスタータスバーの変更が大きな足かせになってしまっていたのです。
なぜ,統合環境の中では,うまく動作していたのでしょう。よく分かりません。おそらく,統合環境の中では,「変更できれば変更するが,他の処理に追いつかないのならばやらない」というような処理がなされているのに対して,exeでは,実直に実行するような設計になっているのではないかと思います。「4角中点」の100回変形に関して,ver.0.2.4では27秒程度かかっていましたが,それがこの処理で,5秒から6秒程度に削減されました(5100,32M,ちなみに,5133,48MのFMVでは,2秒以内になった)。
こういうような現象は,いわゆる「バグ」ではありません。しかし,だからこそたちが悪い現象でもあります。VBでのコンパイルはかなり時間がかかるので,そういう意味でも,問題の同定の解消は大変でした。しかしまあ,そういうことが生じるのが,プログラミングの実際であり,そういう現象の同定を自分の「嗅覚」(のようなもの)を頼りに行って行くのが,(大変ではありますが,)ちょっとした推理小説なんかよりも,ずっと面白いプロセスでもあります。
組み込まれるDLL,OCXは削減できないか(ver.0.2.7)
よく観察してみると,実際には,GC/Winで使っていないOCXやDLLが組み込まれていることに気づきました。GC/Winで使うOCXから呼び出しているとか,VBランタイムで必要という可能性もありますが,どう考えてもそうでないものもありそうでした。そこで,まずVB環境の中で,削除可能なコンポーネントを探してみました。いくつかのものは削除できました。「後で使うかもしれないから」と入れておいたので入っていたわけです。セットアップウッザードを使ったら,またそれらも入っていましたが,項目から削除してみました。その結果,やく1MBのDLL/OCXを削除することができました。(それでも全体で圧縮した状態で4MB程度ありますが)
残念ながら,一休み
さて,まだまだ続きを作りたいのですが,他の仕事がたまってきてしまったので,ちょっと一休みです。うまくいけば11月中旬。へたをすると,12月までお預けかもしれません。この一カ月弱の間(集中した時間が取れたのは,週2日程度。その他の日は「ちょっとずつ」です。まあ,大学の教官が開発に取れる時間なんて,その程度ではないでしょうか。),VBでの開発を行ってきましたが,なるほど「RAD」の定番という感触です。次の「格闘」までのお預けは残念ですが,少し面白そうなことでも考えながら,他の仕事をこなすことにしたいと思います。
と思いつつ,ついつい ver.0.2.8 を
なんていうことを書いたら,次の仕事に頭が切り替わると思っていたのですが,だめですねえ。いつもそうなんだけど,プログラミングを本格的に始めると,作業をしていないときも,自然に何か考えているようで,いろいろなことを思いついてしまいます。そして,「もうちょっと,あれをやっておこう」なんていうことが,ついつい続いてしまいます。
それに,今回は,公開講座の方で,「次回(11/8)までには,○○程度のところまでは持って行けるでしょう」なんて言ってしまったものだから,ついつい気になって。
ということで,DOS版での基本的なことはある程度できるようにしたいという感じで,次のことを追加しました。
- 軌跡の「設定」とその他の基本的な設定を一つに集約して実装
- 点の束縛条件の設定は別の機能として実装
- ファイルの入出力での使い勝手の改善
まだ追加すべき機能としては,
- 数式機能
- 複数の点の変形
- 数値の変化
- config.gcのような環境設定ファイルの利用
あたりが,DOS版と同じ程度のレベル(ver.1)に持って行くのに必要です。
しかし,まあ,優先順位としては,上記のものがまず自分で使いたいものとして選択しました。
上記の3つの作業も,簡単というわけではなく,どれもそれなりの工夫やデバックを伴う作業なのですが,大体やるべきことは分かっていることを,実際に「実施する」という感じの仕事でした。編集的な機能の実装というのは,そういうものかもしれません。
セットアップ用のフロッピィディスクの作成
ついでに行ったのが,これ。ネットワーク経由でのインストールには不要ですけど,これも必要に迫られて。というのが,明日からの授業で使おうと思ったときに,Win95マシンでありながら, Win3.1からの格上げマシンで,CD-ROMもないし,ネットワークにも繋がっていない。ということで,頼みの綱はFDのみだからです。これもセットアップウィザードを使う分には,非常に簡単に作れます。
しばらくの間沈黙の秘密?
上記までを書いてから,続きを書くまでの間に,約2週間が経ったでしょうか。「ついつい」なんて書いていましたが,その後「とうとう」作業を再開するまでに,あまり時間はかかりませんでした。上にも書いたように,「公開講座」がやってくるという状況と,その次の公開講座までは2週間しかないというタイムスケジュールと,11/22は最終回だから,それまでには,目標とするところまで到達しておきたい。そのときには,情報処理センターの機器でネットワーク対応の形で利用したい。しかし,センターの機器では,Netscapeなどは,ワークステーション経由(X サーバ)で使うことになっているので,Winアプリとの連動はできない。しかも,セルフメインテナンスシステムになっているので,自分でインストールできないから,もっと早く仕上げないといけない...などの理由で,「仕上げるまでの時間がないぞー」状態になったわけです。
ということで,作業は結構しているんだけど,「ドキュメントまで書けない」という状態でした。また,一つには,VBでのプログラミングにも結構慣れてきたという面で,「最大の読者である自分自身」にとって,それほど刺激的な内容がなく,むしろ,「地道に作業を続ける」という状態であったことも一つの理由でしょう。
しかし,こういうことは,本来はあまりいいことではありません。勢いに任せていろいろと作り上げたときは,その場でいろいろなノウハウを身に付けながら作業していますが,時間とともに,そういう知識は少しずつ忘れて行きます。後で改良したいと思ったときに,「えーっと,どういう事だったっけ」と,また一からやり直し。ときには,改悪することだってありえます。やはり,できることならば,コーディングとドキュメント作りはある程度並行して行うというのが,スジというものでしょう。
さて,じゃあ,どうして今こうして書いているかというと,二つの理由があります。一つは,DOS版の機能の実装および,ネットワーク対応のために,しておきたいと思っていたことを一応実現したということです。ここらで,ちょっとまとめておこうかという気分になったといっていいでしょう。もう一つは,そのネットワーク対応のための工夫に関連して,一つトラブルが生じたことです。
ネットワーク対応にしようと思って起きたトラブル
まず,「ネットワーク対応」というのが,どういう意味かを明らかにしておく必要がありますが,
それは別のところでまとめることにしましょう。
ここでは,どういうことをどうやると,どういうことが起こったかということを中心にまとめます。
まず,Geometric Constructor / Win の中に,簡易ブラウザを組み込みました。これは,VBのアプリケーションウィザードで「インターネット」がどうのこうのという項目を選択すると,自動的に組み込まれるものをそのまま組み込むことにしました。
そして,ソフトができました。その中では, WebBrowser コントロールを使っています。コンポーネントとしては, Microsoft Internet Controls (c:\windows\system\SHDOCVW.DLL)を使っています。
そして,セットアップウィザードを使いました。すると,SHDOCVW.DLLの依存ファイルがないというメッセージが出ました。VBのマニュアルの中では,「依存ファイルは添付するように,強く推奨します」というようなことを言っている割には,自前のDLLでこんなことも起こるわけ?なんて思いつつ,そのまま進みました。
出来上がったものを別のパソコンにインストールしました。しかし,SHDOCVW.DLLの何かがどうのこうのというメッセージが出て,起動できません。
VBのアプリケーションウィザードで生成されるアプリでのブラウザは IE のサブセットのようなものだから, IE があれば動くかなと, Internet Explorer 3.02 をインストールしてみました。すると,Geometric Constructor / Win もうまく動作しました。
何か変だなと思いました。次のようなことを思い出したり,してみたりしました。
VBのマニュアルの記述
VBの「コンポーネントツールガイド」には,いろいろなコントロールに関する記述があります。たとえば,FTPやHTTPの機能を使うためには, inet コントロールをこう使えばいいというような記述があります。しかし,先程の WebBrowser コントロールに関する記述はありません。
redist.txtの記述
そこで,再配布可能なOCX,DLLのリストである redist.txt を見てみました。すると,驚いたことに,ここにもSHDOCVW.DLLはありません。つまり,VBを購入したからと言って「再配布しても構わないDLLではない」のです。
VB環境で出てくるコンポーネントは組み込まれているすべてのもの ?
そこで,思い出してみると,VB環境の中では,VBで標準に添付されてくるコントロールだけが組み込まれるわけではありません。「コントロールとして購入したもの」が組み込まれるのは当然のことですが,それ以外にも,そのパソコンに組み込んであるソフトに関連したコントロールすべてが表示されています。たとえば,私のパソコンでは,「Acrobat Active X コントロール」というようなものも表示されています。
当たり前のことですが,そういうものを無条件で再配布できるはずはありません。
さて,では一体, SHDOCVW.DLLとは何者なのでしょう。そして,どうしてVB環境の中の標準的な機能である「アプリケーションウィザード」で普通に作ったアプリにそのようなDLLが使うことがありうるのでしょう。
私は次のように解釈してみました。
VBで開発されるソフトは,そのパソコンで使えるアプリ
まず,VBで開発可能なのは,そのパソコンで利用可能なものをすべて使ったアプリだということだと思います。そのパソコンにDLLやOCXが組み込まれているとき,もちろん,それらは当該ソフトの中で使われるために組み込まれていますが,その環境の中で,それ以外の形で呼び出して利用する権利も一緒に提供されているということなのでしょうか。ライセンス契約に関する部分は分かりませんが, exe ファイルとしてでなく, ocxやdllという形態で配布するということは,より自由な利用を認めているということなのではないかと思います。
SHDOCVW.DLLは IE によって組み込まれるが, IE は VB環境の前提でもある
IEをインストールしたらGeometric Constructor / Win が動作したということも示すように,SHDOCVW.DLLは,Internet Explorer によって組み込まれたDLLだと思われます。このDLLはVBそのものによって提供されたものではありませんが,VBあるいは,Visual Studio をインストールするときに,「IEがインストールされていないから,インストールします(あるいは,することを強く推奨かな?)」というような状況になります。いずれにしても,VB環境においては,前提あるいは,それに近い存在です。VB環境があるということは,そのDLLあるいは,それらが動作するために必要なその他のDLL,OCXもあるということです。そういう意味合いで,アプリケーションウィザードで VB標準でないが,それに準拠するものとして組み込んでいるのかもしれません。そして,そうやって開発したアプリは,少なくとも,そのパソコンではきちんと動作するわけです。
開発マシンで動作することと配布した先で動作することは違う
アプリ開発は二つの側面があると考えた方がいいようです。つまり,そのパソコンで使うアプリと,他のパソコンでも使うアプリです。そして,後者を考えるときには,それに関連する様々なDLL,OCXも「引き連れて」インストールする必要があり,それらを含めた「セットアップ」をする必要があるということです。
SHDOCVW.DLLその他は配布できない
さて,VB開発環境では存在が当たり前のSHOWDOCVW.DLLですが,上記のようなことから,それは再配布可能なDLLではありません。また,「SHOWDOCVW.dep」(依存ファイル)がないので,それが動作するのに必要なDLL,OCX一式を丸ごと組み込むというようなことはできません。あるいは,そういうことを意識していないと,自動的に「再配布してはいけないものまで再配布してしまう危険性がある」ので,「SHOWDOCVW.dep」がないのかもしれません(善意すぎる解釈かも)。
配布に当たっては,SHOWDOCVW.DLL関係のものを「抜いて」配布する必要があるのです。
IEがある環境ならば問題はない
そういう「必要なものを抜いたままのセットアップを配布する」ということは,どう考えるべきでしょう。ある意味では,憤慨すべきことかもしれません。しかし,ある意味では,仕方のないことかもしれません。現実的な対処は「ある」のですから。つまり,
「このソフトをインストールする前に,必ず, Internet Explorer 3.02 以降をインストールしておいてください」
という旨を明記しておけばいいのです。そして,少なくとも,現状においては, IE 3.02以降は,新規のほとんどのパソコンには最初から組み込まれているし,また,そうでないパソコンでも,いろいろな方法で「無料で」組み込むことが可能だからです。
それでも感じる不可解なもの
そういう意味で,アプリ開発に当たっては,
- IEの存在を前提として,その機能を使ったアプリを開発し,配布する
- IEがなくても使えるように,その機能は使わない。あるいは,自主開発等の手段を講じる
のどちらかを選択することになります。ブラウザをきちんと作るなんていうのは大変なことです。IEのサブセットをそのまま使えるというのは,開発者にとっては,朗報です。実際,Netscapeはパソコンに組み込まれていても,その機能をこのような形で,自分のソフトの中に取り入れたプログラミングをするというようなことはできません(アドイン等の機能として実現することばできるのかもしれませんが)。
しかし,そのことによって,「IEを組み込まざるを得ない状況」をじわじわと作っているのは事実ではないでしょうか。しかも,そこにおいて,「契約」は存在しないのですから,IEのバージョンが変化したときに,今まで動いていたソフトが使えなくなる可能性もありえます。しかも,依存ファイルさえないということは,どういうDLL,OCXを前提として動いているのかさえ分からない状況におかれているわけです。
「ほとんど無料でとても便利な環境を与えられている」ことは認めます。しかし,通常の開発者には「一緒に配布すべき」としている依存ファイルさえ与えないまま,そして「再配布」に関する正式な権利も与えないまま,そして標準的な機能であるアプリケーションウィザードで,「こういうこともお手軽にできるよ」とそそのかされ,それに安易に乗っている自分は,一体どういう扱いをされうる存在なのか,そうやって作ったアプリはどうなる運命なのかというようなあたりが,とっても気になるこのごろです。
マシンのトラブル等で,長期休憩
1998/1前後に発生した,HDのトラブルと予算の欠乏で,「げっ」。
やはり,仕事で使う環境は,「壊れることがある」のを当然という形で,「まさかのときの対処」を確立しておく必要性を感じました。
いずれにしても,そんな事情で,開発の方はストップした期間がちょっと続きました。
コントロールのフォーカスを設定するのは,「load」ではなく,「activate」にて
以前から,フォーム上のコントロールに対して,起動時のフォーカスを設定したいとおもいつ,setfocusを使うと実行時エラーが生じるということに悩まされ,使えないままでした。何かの記事や会話等からヒントを得て,「load」時では,まずいようだということを認識し,「activate」イベントに書いてみました。そしたら,問題は解消。
なんだ,分かってみたら,そういう簡単なことだったわけね。
tab index は便利
ついでに,フォーム上で,タブキーを押したときのフォーカスの移動順序を変更しました。これは,実行時でも,デザイン時でも設定できるようです。
書いてしまう方が速いようにも思いましたが,デザイン時のコントロールパネルで修正してみました。
この機能も,なかなか便利です。
自動組み込みするファイル群を設定するには,swtファイルを直接編集
サンプルなど,セットアップ時に追加して組み込んでおきたいファイルは,swtファイル,つまり,テンプレートファイルを直接編集する方が,ウィザード内で行うよりも,簡単です。ウィザードでは,テンプレートファイル内にあるものは参照しないため,毎回すべてを設定しないといけませんから。
詳しい文法は分からないけど,その前にウィザードが生成したファイルを参考に,ま,適当に直せば,それなりに動くというわけです。
VBのセットアップを使うには,「同一名のファイルはだめ」
ウィザードで設定すれば問題なくクリアしてくれるのかもしれません。上記のように,直接編集していたら,問題が発生しました。それは,
組み込むファイルのディレクトリィ名が違っていても,ファイル名が同一だと,問題が生じる
ということです。
実際に問題になったのは,
- ../document/index.htm
- ../document/construction/index.htm
- ../index.htm
の3種類のファイルを組み込むように設定したのに,2つめ以降が組み込まれないということです。
swtファイルをどう修正してもだめ。セットアップ用のディレクトリィを見ると,圧縮されたファイル名は,
index.ht_
ということで,同一名のものが3つあっても,やはり一つしかない。
つまり,ウィザードを使えば回避するのかもしれないけど,手作業で適当にやるときには,おそらく,
末尾以外の文字が一致するファイルが2つ以上あるとだめ
ということではないかと思います。
プログラムマネージャーなどの利用(shell, sendkey,..)とタイマーコントロールの利用
VBマガジン(98-5)の付録「Visual Basic 101 Q & A」(日向俊二)を見ていたところ,「HTMLファイルの表示方法」というのがありました。
その手の一つとして,「プログラムマネージャーを利用して,アプリケーションの関連づけがされているソフトでHTMLを呼び出す方法」がつかれわていました。つまり,
shell ("programan" + File$)
という感じです。ver.1.0.8 では,簡易ブラウザではなく,この方法を使うことによって,Netscape あるいは, IE でヘルプファイルを開くようにしてみました。
解消された問題点
- 「不出来な」簡易ブラウザを使わなくても,環境の中に組み込まれているブラウザを使うことができる。
- 組み込まれているのが,Netscapeであろうが,IEであろうが,その環境の中で「html」に関連づけられているブラウザを使うので,エラーが生じる心配は少ない。
新たに生じた問題点
- プログラムマネージャが「開きっぱなし」になってしまう。
- もう一度プログラムマネージャを呼び出すと,ファイルを開くのではなく,そのプログラムマネージャにフォーカスが移動するだけになる
- ブラウザの中で,GC4ファイルなどをクリックしたときに,どういう動作をするかは,元々の関連づけや Helperの設定に依存する。最も一般的なのは,最初に起動したGC/Winとは別のウィンドウのGC/Winで図形が開かれるということだが,それはあまり妥当ではない。
- つまり,「最適と思われる環境」をきちんと作るということが,不可欠であるが,それはちょっとややこしい。
じつは,安易の解消方法として,「プログラムマネージャのみをその後閉じる」という手を考えた。そのためには, SendKeyによって,プログラムマネージャに「Alt + F4」を送ればいいはずだ。しかし,結果的にはうまくいかなかった。想像するに,片方でブラウザを起動させようとしているタイミングとあわないのではないかと思う。
だから,一つの解消方法として,タイマーでSenkdKeyを使うタイミングを少し遅らせるということが考えられるのだが,今までタイマーを使ったことがなかったので,それあえず,ver.1.0.8では,その手は試さないままでいる。後日対策を考えるというところである。
と書きながら,ついついそのままにするのはしのびなく,まずテストを行って,次にGC/Winの中でも,実装した。思ったよりも簡単に実装できた。要するに,Activateできる状態であれば,そのために,タイマーで多少の時間を稼ぐことができれば,処理することはできるということだ。
今回,初めてタイマーコントロールを使ったのだが,なかなか面白い存在だ。あまり臆せず,機会を見つけて,活用してみよう。
プログラムマネージャーなどの利用(shell)で生じた問題点とその解消
(ファイル/パスのロングネーム)
上記を GC/Win 1.1.0 で実装してみたところ,開発環境ではうまく動作したのに,それ以外でうまく動作しなかった。「ゲッ」ということになったのだが,結果的に,その原因は,shell つまりコマンドライン上でファイル/パスの名前に Prgram Files などのロングネームを使っていることが問題だということが判明した。
VB環境の中で使う場合は問題ないのだが, shell 経由で行うから発生するわけだ。開発環境では,安全のために 8+3 以内にしているので,問題が生じていないということだった。
ロングネームを使えるようにするための一つの常套手段は,ダブルクォーテーションで囲むということらしい。実行ファイル名はそれでうまくいった。そして,いろいろと試した結果,次のようなことが分かった。
- dir などはパラメーターに上記の方法が通用する。たとえば,
dir "c:\program Files"
- プログラムマネージャではうまくいかない。つまり,
progman "c:\program Files\test.htm"
はだめ
そこで,ロングネームはショートネーム(?)に変換して扱うようにした。汎用ルーチンを作ればよかったのだが,時間と余裕がないので,間に合わせのもので妥協した。まあ,いいでしょ。とりあえず動くんだから。
WindowsAPI利用による上記の問題の解消
上記のようにして対応してみたものの,結局「インストールした環境によってトラブルがある」ことがあった。「とりあえず動く」のはいいけれど,やっぱり「とりあえず」ということには変わりない。
で,そんなことを頭の済に置きながら,あるとき VB Magazine (98 Summer別冊)を見ていたら,酒井氏の記事があった。「インチキ霊を呼び出そう : パソコン狐狗狸さん」という,いかにもふざけた記事である。タイトルはふざけているが,中身はなかなか渋い。けっこう「目からウロコ的」なTIPSが盛り込まれている。そして,その中の一つに「拡張子に関連づけられたプログラムを起動する方法」というのがあった。WindowsAPIのShellExecute関数を使うという手である。「やっぱりいい方法があるんじゃない」と,気分がすーっとして,定価の980円がとても安く感じられた。
さて,早速,そのコードの一部を使って,あるHTMLファイルをブラウザで呼び出す試作版を作り,それが動作することを確認して, GC の機能として盛り込み, ver.1.1.2 とした次第である。
直交座標/極座標の切り換え
上記からかなり経過した。続きを書くのは久しぶりである。「テスト版」という名前に対して,「いつになったら完成するのか」という問い合わせをときどき頂いていた。ver.1.1.4になって,自分が要求することのかなりの部分が取り敢えず実現でき,あまりトラブルが生じていないので,個人的には,「ver.1.1.4 のままでいいかな」と思っていた。しかし,いい改善案があったときにはやはり前向きに対応する姿勢は継続するわけだし,テスト版→市販版という変化が必要なわけではないので,とりあえず,「テスト」という名前はそのままにしている。(しかし,ユーザーの方の印象としては,そろそろ削除した方がいいのかもしれない)
さて, そんな思いでいたのだが,98/8/19-20の松江の講座の中で,東海南高校の斉藤先生から,「複素数平面の例を考えるときには,極座標の座標軸を表示した方がいいのではないか」という意見を頂いた。確かにそういう場合もあるかもしれない。しかも,大した作業ではないので,「ユーザーからの希望があってこそ,ソフトは成長する」のを,目の前で実感していただこうと,この機能を付け加えたものを,ver.1.1.5としてみた。
このあたりの経緯は,こちらに書いている。
ver.1.1.5 から B 版の廃止
ver.1.1.4のときから,すでに簡易ブラウザは不要になっていたので,いずれ B版は廃止し,A版のみを残そうと思っていた。実際, こちらで問題にしていた SHDOCVW.DLL を使う必要がない。また,htmlファイルに関連づけられているブラウザを起動するので,機能的にもほとんど問題ない。
げ。1.1.4にはなかったバグ。
講座が終わってから,きがついたのですが,前にクリアしたはずと思っていたバグがありました。ver.1.1.4ではクリアされていて,1.1.5では関連するコードは一切触っていないのに...。どうしてだろう。
悪夢を見た雰囲気のまま,修正した次第です。