知ってるようでけっこう知らない
- 環境/デザイン編 -
酒井 法雄
VisualBasic 2.0日本語版が発売されて、はや2年が経った。すでにVisualBasicを相当に使いこなしている方も多いことだろう。しかし、実際に話を聞いてみると、意外にもカンタンなことをご存じない方が多いようだ。
というのも、VisualBasicのマニュアルはわかにくいとか、オンラインヘルプでそのとき分からない箇所をスグに知ることができるからといった理由で、マニュアルを読んでいないということらしい。実際問題として、マイクロソフトのユーザーサポートにくる問い合わせの大半はマニュアルに書いてあることだとか。もちろん、マニュアルに書いていないし、Windows SDKや参考文献をいくら探しても書いていないようなウラワザも少なくない。
知っていればなんということはないことでも、知らないと結構ハマるものだ。知らないことでも知ってしまえば「なーんだ、こうすればいいのか」ということになる。
そこで、ここではマニュアルに書いてあること、書いていないことを含めて、知っているようで結構知らないワザを集めてみた。ここにあるワザを全部知っていれば、相当なVisualBasicパワーユーザーである。
さて、アナタはいくつご存じだろうか?
VisualBasicはMDIアプリケーションではないので、メインウィンドウの外に、ツールボックスやプロパティ、プロジェクトなどのウィンドウがあちこちに出てくる。[ファイル][新規プロジェクト]メニューを実行したときには、このうち、プロジェクトウィンドウ以外は直前の状態が保存される。しかし、プロジェクトウィンドウだけは必ず決まった位置に出てきてしまう。この位置は画面の解像度によっては非常に使いにくい位置になってしまうことがままあり、なんとか別の決まった位置にしたいことがある。
また、VisualBasic 2.0Jでは、Professional EditionやあとからVisual Control Pack などに含まれるカスタムコントロールをインストールしても、[ファイル][新規プロジェクト]メニューを実行したときには、Standard EditionからあったグリッドとOLEクライアントの二つのカスタムコントロールのみがロードされてしまう。起動時から、必ず追加したカスタムコントロールが読み込まれるようにしたいときや、逆にカスタムコントロールは一切いらないといった場面では、いちいちプロジェクトの構成をへんこうしなくてはならないので、面倒なことになる。
これを解決するには、VisualBasicディレクトリにある
AUTOLOAD.MAKファイルを編集すればよい。リスト○にあるように、このファイルの内容はカスタムコントロールのファイル名とプロジェクトウィンドウの位置とサイズ、ウィンドウの状態である。
★AUTOLOAD.MAKの内容例
GRID.VBX
OLECLIEN.VBX
ProjWinSize=81,565,202,122
ProjWinShow=2
カスタムコントロールのファイル名は、フルパスで指定することも可能だ。パス名が特に指定されていないときには、Windowsの Systemディレクトリになる。
ProjWinSizeは、プロジェクトウィンドウの位置とサイズである。
ProjWinShowは、次のようになっている。
0 非表示
1 アイコン化
2 ノーマルウィンドウ
『なーんだ、そんなコトなら知ってるヨ』とおっしゃるアナタ。このファイルを秀○とかメモ帳なんぞで編集していないだろうか? VisualBasicではそんなコトをしなくても自由に編集できるだ。
[ファイル][プロジェクトを開く]メニューから AUTOLOAD.MAKを選択するのだ。そして、[ファイル]メニューにある[ファイルの追加]や[ファイルの解放]で使いたいカスタムコントロールだけを選択する。さらに、プロジェクトウィンドウの位置やサイズを好きなように変更するのだ。[ファイル][プロジェクトの保存]を選んで AUTOLOAD.MAKを保存すれば、次回の起動時や新規プロジェクトからこの設定は有効になる。
★AUTOLOAD.MAKの編集
『VisualBasicはたしかに使いやすいけれど、BASICだから...』とおっしゃる方も少なくない。BASIC言語が嫌いなワケはいろいろあるだろうが、何といっても昔のN-BASICやN88-BASICでのスパゲティプログラムを思い出してしまうヒトも少なくないのではないだろうか。そういう往年のBASICと違って、VisualBasicではイベントドリブンでプログラミングしていくので、スパゲティプログラムにはなりにくい。また、変数の問題にしても、VisualBasicではグローバル変数だけではなく、モジュールレベルやプロシージャレベルのローカル変数が用意されているし、Quick BASIC などと違ってそのスコープも明確である。
『でも、変数を宣言しなくても使えるなんて...』という声も聞こえてきそうだ。たしかに、VisualBasicでは既定値で宣言しなくてもいきなり変数を使うことができる。これは、スペルミスによるバグの原因になりやすいよくない仕様である。そればかりか、『DEF INT A-Z』なんてコトまでできてしまう始末で、あのスパゲティBASICを彷彿させるモノがある。
しかし、そのへんもVisualBasicは抜かりがない。[オプション][環境の設定]メニューを選ぶと、開発環境にかかわるいろいろな設定を変更することができるようになっている(図)。
ここには、『変数宣言必須』という項目がある。ここを『Yes』にしておけば、変数を宣言しないとエラーになるよう設定することができるのだ。
しかし、気をつけてほしいのは、スグには反映されない点だ。これを設定した後、初めての新規プロジェクトからこの設定が有効になる。実際にこの設定の変更で行われることは、各モジュールのコード部分の先頭に『Option Explicit』という文が自動的に記述されるようになるというだけだ。したがって、この設定を
する前に作ったコードであっても、各モジュールのコード部分の先頭に『Option Explicit』と記述すれば、変数宣言チェックが行われる。
さて、先ほど述べたように、昔はBASICを使っていたが、その後はバカにしてCしか使っていなかったという方も多いだろう。そこへきていきなりVisualBasic の強力な世界をかいま見ると、近ごろのBASICはスゴいなと思われたことだろう。しかし、あまりにもスゴ過ぎてどうも何が何だかワカランという方も少なくないだろう。そういう方に学習用としてオススメしたいのが、Quick BASICである。
Quick BASICは MS-DOS用のBASICではあるが、言わばVisualBasicの兄貴分に当たるモノだ。もちろん、Microsoft製品である。つまり、いきなりVisualBasicが出てきたわけではなく、Microsoftは地道にBASICを作り続け、改良し続けてきたワケだ。その過程で改良された主な点は、構造化制御構文やプロシージャの概念、ローカル変数の使用といった点である。Quick BASIC はWindows用のモノではないので、VisualBasicとはもちろん大きく異なっている部分もあるが、BASICでの構造化や能率よいプログラミングの方法論という話であれば、Quick BASICは最適の題材となるハズだ。なにせ、VisualBasicの入門書と言えども、そういう基本的だが重要な部分が抜けている本がほとんどだからだ。
そういうところからマジメにやりたいというには、次の本をおすすめしておく。
その他、Quick BASICには良い本がたくさん出ている。
VisualBasicのデザイン時には、フォームにグリッドが表示される。これは便利なようで結構クセモノだ。というのも、貼り付けたいコントロールがグリッドに強制的に合わせられてしまうので、『もうちょっと右にしたのだけど』といったときには困ってしまうのだ。
こんなときには、[オプション][環境の設定]メニューでグリッドについての設定を変更することができる(図)。
ここでは、グリッドの横間隔、縦間隔をそれぞれ変更できるので、より細かいサイズに変更しておくと、調整も楽になる。ただし、デザイン時にフォームをアクティブにしたときの再描画にも時間がかかるようになるので、ビデオの速度があまり速くないマシンのときにはおすすめできない。
また、グリッド表示をしなくすることもできるし、グリッドに合わせてコントロールを配置しないようにすることも可能だ。
自分のやりたい作業に合わせてこのあたりの項目を変更すると良いだろう。
VisualBasicでのフォームは既定値では独自のバイナリ形式で保存される。しかし、使い慣れたテキストエディタや sed や awk、perl などを使ってテキスト処理をしたいこともある。このようなときには、やはり[オプション][環境の設定]メニューでテキスト形式で保存するようにすることが可能だ。
また、[ファイル][ファイルの保存]メニューでのダイアログで、『テキスト形式』
のチェックボックスを選べば、そのファイルだけをテキスト形式で保存することも可能である(図)。
しかし、これはいいことばかりではない。というのも、テキスト形式で保存されたファイルはユーザーが自由に内容を変更することが可能になるため、不正なプロパティに書き換えられる可能性を考慮して、ファイル読み込み時のVisualBasicのチェックが厳しくなるからだ。リストボックスのサイズやコントロールの微妙な位置などは、テキスト形式で保存されたファイルから読み込まれたときには、VisualBasicが適当な値に変更してしまうことがある。このため、当初デザインした内容と異なったフォームになってしまうことがあるのだ。
このようなときには、バイナリ形式で保存しておくとよい。テキスト形式にする必然性がないならば、環境の設定自体をバイナリ形式をデフォルトにしておいた方がいい。もちろん、[ファイル][ファイルの保存]メニューを選んで、特定のファイルだけをバイナリ形式で保存してもよい。バイナリ形式かテキスト形式かは、モジュールごとに設定することができるのだ。
プログラムによっては、同じコントロールをたくさん配置したいことがある。コントロールの配置は、ご存じのようにツールボックスからコントロールのアイコンを選び、フォーム上にドラッグして配置していく。しかし、一個配置するごとにコントロールの選択は解除されてしまうので、またツールボックスからコントロールを選ばないといけない。これでは面倒だ。
これを解決する方法はいくつかある。
1. ツールボックスからアイコンをダブルクリックする
必要な数だけダブルクリックすれば、それらはアクティブなフォームの中央に配置される。
あとは、それらを位置合わせすればよい。しかし、この方法では位置合わせの作業が別に必要になってしまう。
2. {Ctrl}キーを併用する
ツールボックスのコントロールアイコンの選択が解除されないようになっていれば、この問題は解決する。これには、{Ctrl}キーを併用すればよい。
まず、{Ctrl}キーを押しながら、ツールボックスからマウスでアイコンを選ぶ。選んだら、{Ctrl}キーは離してかまわない。あとは、通常と同じように配置したい位置と大きさにマウスでドラッグすればよい。
3. コントロール配列を使う
配置したいコントロールが数が多いときには(本当はそういうときには GRIDやサードパーティのVBXなど別のコントロールを使うべきだが)、コントロール配列を使うという手がある。これは元となるコントロールを一つだけ配置し、その
Index プロパティを『0』にしておく。あとは、実行時に
Form_Load プロシージャなどでコントロールのインスタンスを
Load して位置やサイズを必要に応じて変更し、Visible プロパティを True にする。これならば、コードを使って規則的に配置することが可能だ。
比較的複雑なフォームのデザインをしているときには、あとからまとめてコントロールを移動したいということがよくある。また、すべてのコントロールの FontName プロパティを変更したいなどということがある。
このようなときには、次の二つの方法でコントロールをまとめて選択してから、移動するやプロパティの変更をすることが可能だ。
1. {Shift}または{Ctrl}キーを併用する
選択したいコントロールを、{Shift}または{Ctrl}キーを押しながら次々とクリックしていく。すると、それらのコントロールの外側が図のように選択されたことを示すサムが表示される。必要ないコントロールまで選択してしまったときには、もう一度クリックすると選択を解除することができる。
2. コントロールの配置してある範囲をドラッグする
コントロールが特定の範囲に全部あるときには、その範囲をドラッグする(図)。すると、ドラッグされた範囲のコントロールが選択される。ここで必要ないコントロールがあるときには、1.の方法を使って選択を解除することができる。
これらのいずれかの方法、または組み合わせで移動したいコントロールを選択したら、選択状態にあるコントロールをドラッグすれば、まとめて移動することができる。
また、コントロールが複数選択状態にあるときに、プロパティウィンドウを見ると、選択されたコントロールに共通なすべてのプロパティが表示される。ここでプロパティを変更すると、すべてのコントロールのプロパティが変更される。フォント名などをまとめて変更したいときには、これがベストの方法だ。
フォームのデザイン時には、一連のコントロールの組み合わせをまとめたブロックを複数並べたいということがある。このようなときには、先ほどのコントロールの複数選択ワザを使ったあとで、まとめてコピー
& ペーストしてしまうのがよい。
1. 必要なコントロールを選択する
方法はこの前に述べた通り。
2. コピーする
[編集][コピー]メニューでコントロールをコピーする。このとき、いちいちメニューを選んでいては面倒臭い。VisualBasicに限らず、Windows 3.1でのコピーは Macintosh と同じく {Ctrl}
+ {C} でOKだ。ただし、ちょっと古いアプリケーションだと、{Ctrl} + {Insert} になっているケースがあるので気をつけてほしい。ちなみに、切り取りは
{Ctrl} + {X}だ。
3. ペーストする
[編集][コピー]メニューではなく、{Ctrl} + {V} を使おう。
4. コントロール配列にするかの選択
この時点で、次のようなメッセージボックスが表示される。
これは、コピーしようとしたものの、すでに Label1というコントロールがあったので、コントロール配列にするかと聞いてきたものだ。ここでは、Text1とCommand1も同様に選択しているが、これらの組み合わせで何らかの処理をする場合に、コントロール配列になっていた方がよいときとそうでないときがある。目的の処理に応じて選ぶ必要があるだろう。
5. ペーストしたコントロールの移動
ペーストされたコントロールは、フォームの左上に選択状態で表示される。このままドラッグすれば、任意の位置に移動することができるから、適切な位置に移動させれば良い。
ただし、この作業が終わっても、Caption や Text などのプロパティはコピー元と同じである。必要に応じて変更する必要がある。
実際にコーディングの作業に入ってくると、イベントプロシージャはどんどん増えるし、自分で定義した
Sub や
Function プロシージャも増えてくる。こうなってくると、コードウィンドウの『オブジェクト』や『プロシージャ』のドロップダウンリストボックスからプロシージャを選択するのも手間である。もちろん、目的のフォームを探して、その上にあるコントロールをダブルクリックすれば、少しは速いこともあるのだが、そうしたところで、そのコントロールに複数のイベントプロシージャがあることもザラだから、選択はいよいよ困難になってくる。
このようなときには、{F2}キーを押そう。すると、図のようにモジュールの一覧、そしてモジュールごとのプロシージャの一覧リストボックスを選ぶダイアログボックスが表示される。ドロップダウンリストボックスに比較すると、リストボックスはスピーディーに目的のプロシージャを選ぶことができるので便利だ。
また、アクティブなリストボックスで一文字入力すると、その文字から始まる項目の先頭から表示されるようにリストボックスがスクロールする。これはWindowsのリストボックスの基本的な機能なのだが、意外に使いこなせていないようだ。ぜひ、積極的に利用したい。
↓
『q』を入力
↓
たとえば、現在フォームには図のように、Activate, Deactivate, Load, Unload の4つのイベントを記述してあったとしよう。このようなとき、現在
Loadイベントを表示していたとする。ここで、Deactivate イベントを表示するにはどうしたらよいだろうか。
もちろん、コードウィンドウの『プロシージャ』のドロップダウンリストボックスを使ってもいいし、{F2}キーを押して選択してもいい。しかし、一番速いののは {Ctrl} + {↑}キーを押すことだ。{PageUp}キー(PC-98シリーズでは{RollDown}?)を押しても同じ動作になるから、キーボードによってはそちらの方がいいかもしれない。
同様にして、Load から Unloadを表示させたたいときには、{Ctrl} + {↓}キーまたは、{PageDown}キーを押せばよい。
この方法は実はかなりスピーディーなので、少々離れたプロシージャを表示したいときにもキー入力を繰り返していけば、相当速く移動することができる。
コーディング中にイライラするのは、プロシージャ画面の移動ばかりではない。カーソルの移動も結構ストレスがたまる。カーソルキーだけ使っていては、遅くてしょうがない。したがって、マウスでいきなり指定位置に移動するなどしたいところだ。しかし、マウスを使うとホームポジションから手が離れて具合が悪いし、だんだん手も痛くなる。また、一行が長くなってくると、マウスといえども見えない位置に移動することはできないので、なかなか苦闘してしまう。オマケに、水平スクロールは結構遅かったりする。
こんなときに便利なのが、次のキーである。
これらを組み合わせれば、コードを書いているときにも素早い移動ができるようになる。
これは今まで出てきたモノの合わせワザである。VisualBasicに限らずWindows 3.1では、{Shift}キーを押しながらカーソル移動をすると、テキストが選択される。したがって、{Shift}キーを押しながら先ほど出てきたキーを適切に組み合わせて押せば、テキストを選択する時間を短縮することができるというワケだ。
さらに、次のショートカットを使えば、いよいよスピーディーなテキスト編集ができるというワケだ。
また、1ワードだけを選択したいときには、単にそのワードをダブルクリックするというのも、有効な方法である。
文字列の検索や置換は、コーディング時やデバッグ時によく必要になる作業だ。これも、メニューからいちいちダイアログを出してやっていては時間も手間もかかってしまう。能率よい作業の基本はショートカットキーを使うことだ。しかし、それだけではない。
文字列の検索や置換には、必ず文字列を入力しなくてはならない。これをいちいち入力していたら時間ばかりかかってしまう。もちろん、ダイアログを出してから、あらかじめコピーした文字列をペーストしても良いのだが、もっと能率的な方法がある。
たいていは、検索したい文字列はすでに目の前のエディタに表示されているものだ。この文字列がスペースなどを含まない1ワードであれば、ダブルクリックしてから {Ctrl} + {C}を押す。これでコピーはできたわけだ。
次に、そのまま {Ctrl} + {F}を押す。これで、検索ダイアログが表示される。そのまま{Enter}を押せば、検索が開始される。次の文字列を検索するには {F3}を、前のものを検索したいときには {Shift} + {F3} を押せばよい。
置換したいときには、{Ctrl} + {R}で置換ダイアログを表示することができる。
このとき、検索または置換する範囲をカレントプロシージャ内にするか、カレントモジュール内にするか、すべてのモジュールにするかも必要に合わせて指定すると、能率が良いだろう。
VisualBasic単体ではめったに起きないコトだが、Windows APIやDLLなどをコールしていると、アッと言う間に UAE(修復不可能なアプリケーションエラー)になってしまい、VisualBasicが終了してしまうコトがある。このようなときには、直前に直したソースを保存していないと、とっても悲しいコトになってしまう。実は、VisualBasic 3.0(英語版)では実行前に必ずファイルを保存するという環境オプションがあるのだが、残念ながらVisualBasic 2.0Jにはそのようなオプションはない。
ではどうしたらよいかと言えば、実行する前にいちいちファイルを保存するしかない。しかし、それも難儀な話である。
このようなときには、保存したいフォームまたはコードモジュールのウィンドウをクリックして選択してから、{Ctrl} + {S}キーを押せばよい。これは、[ファイル][ファイルの保存]メニューのショートカットである。
このようなショートカットキーはメニューを見れば書いてあるものだが、なかなか使いこなせていないことが多い。ショートカットキーは有効に使いたい。
VBXカスタムコントロールをプロジェクトに追加するときには、[ファイル][ファイルの追加]メニューを選べばよい。これにも同じくショートカットキーが登録されているから、{Ctrl} + {D}を選べばよい。
比較的複雑なアプリケーションを作っていると、ほとんど同じだけどチョットだけ違ったフォームが必要になることがある。このようなときには、フラグなどを立てて内部処理を分けたり、Form_Load時にみかけを変更するなどという手もある。しかし、必ずしもそう単純にコトは済まないものだ。
そんなときには、ファイルを別名保存してからプロジェクトに追加すると、フォームモジュールごとソックリ同じモノをコピーすることができる。具体的には次のような手順になる。
1. 次のようなフォーム (Name プロパティ frmA)をコピーしたい
2. フォームを保存する
まずは、フォームを保存する。 ここでも{Ctrl} + {S}を使おう。これまで一度も保存されていないときには、ファイル名を指定しなくてはならない。ここでは、FRMA.FRMという名前にしよう。
3. フォームの Name プロパティを変更する
新しく追加したいフォームの Nameプロパティを決めて、FrmAのNameプロパティを変更する。ここでは、FrmBにしよう。ついでに Caption も同様に変更しておく。
4. 別名でフォームを保存する
FrmB(ちょっと前まで FrmAだったモノ)を別名保存する。[ファイル][名前をつけてファイルの保存]メニューなどは使わずに、{Ctrl} + {A} を使おう。
ここで、FRMB.FRMという名前で保存する。
5. FrmAをプロジェクトに追加する
{Ctrl} + {D}で、FRMA.FRMをプロジェクトに追加する。すると、プロジェクトウィンドウには
FrmAとFrmBのいずれもが並び、両方のフォームが表示できるようになる。
6. 必要に応じて、それぞれの処理を記述する。
この方法のキモは、{Ctrl} + {A}, {S}, {D} をうまく使いこなすことだ。慣れてしまえば、ものの数十秒でこの作業は完了するハズだ。
しかし、もっとも注意しなくてはならないのは、フォームのNameプロパティを変更しなくてはならないことだ。同じ名前のフォームを一つのプロジェクトに複数入れることはできないから、必ず
Nameプロパティだけは変更しなくてはならないのだ。
ここまでの話で、作業を能率的に進める上で重要なのは、メニューをマウスでたぐっていくようなオペレーションではなく、キーボードを多用したショートカットの積極的な使用であることはご理解いただけたことと思う。もちろん、ショートカットが設定されていないような機能であったら、{Alt}キーを併用したアクセスキーで素早く実行することも重要だ。
しかし、必ずしもショートカットキーやアクセスキーの使用が最善ではないこともある。それは、特にデバッグ時などキーボードを打つことが第一とは限らないときだ。マウスでオペレーションをしている途中でキーボードを使うのは、やはり得策ではない。
このようなときには、ツールバーを使うのがよい。ツールバーにはよく使う機能が凝縮されている。しかし、最近のアプリケーションのツールバーと違って、VisualBasicにはバルーンヘルプがない。このため、『このアイコンって何するんだっけ?』というようなことになり、せいぜい使うのは実行のボタンくらいという人も少なくないようだ。
しかし、たとえば既存のプロジェクトを開きたいといったときなどにはショートカットがないから、[ファイル][プロジェクトを開く]をマウスで選ぶか、{Alt} + {F}, {O}と打たなくてはならない。もし、すでにマウスを握っているときならば、ツールバーの左から3番目のボタンを押すだけで、同じ処理をすることができる。こっちの方が能率的である。
同様に、プログラムをを実行するときならば、次の4つもの方法がある。
1. [実行][スタート]メニューをマウスで選ぶ
2. {Alt} + {R}, {S}キーを押す
3. {F5}キーを押す
4. ツールバーの左から7番目のアイコンをクリックする
いずれの方法でも良いわけだが、私などはキーボードに手があったときにも、{F5}はちょっと遠いので、スグにマウスに手を伸ばしてツールバーを使って実行してしまう。もっとも、これだけ選択肢があるのだから、アナタのもっとも使いやすい方法は別にあるかもしれない。自分にあった方法を見つけよう。
念のため、VisualBasic 2.0Jのツールバーの機能を次に示す。全部とは言わないが、自分がよく使うものは覚えておいてソンはないだろう。
図(VisualBasicプログラミングガイド
P.17から起こしてください)
デザイン時に必ずお世話になるのがプロパティウィンドウだ。しかし、このウィンドウ、どうにも使いにくい。例えば、図を見てほしい。このプロパティウィンドウ、一般的には次のようにして使う。
つまり、1と2の間にマウスの移動が必要になってしまうのである。それも、場合によってはかなり離れた位置にあることも少なくない。
一方、Accessなど最近のMicrosoft製アプリケーションのプロパティシートでは、クリックしたプロパティのその位置からドロップダウンリストボックスが出たり、そこでそのまま文字列を編集できるようになっている。VisualBasicもこうなってほしいところだが、今のところいたしかたない。
しかし、問題となっているマウスの移動を無くして、すばやくプロパティを変更することは可能だ。それらの処理を系統別に次にまとめてみた。
★リストからの選択
1. 表示されているプロパティを直接ダブルクリックする。リストの順に次の項目に変更される。最後まで行ったら最初の項目に戻る。True/Falseのときには交互に現れる。
2. 一文字入力する。その文字で始まる項目が表示される。
★テキストの入力
クリックしたら、その場で直接テキストを入力しはじめることが可能。ただし、いきなり入力しはじめると、以前のテキストはすべて消えてしまう。これは、実は選択状態になっているためである。一部を残して修正したいなどのときには、一度
{Tab}キーを押す。すると、テキストが表示されている2行目にカーソルが移動して選択状態が解除される。あとは、カーソルキーなどを併用して編集することが可能になる。
★ダイアログの表示
2行目の右側のボタンが<...>表示されているときには、そのボタンを押すと何らかのダイアログが開くパターンのときには、直接プロパティが表示されているところをダブルクリックする。すると、ダイアログが開く。また、このパターンのときには、テキストの直接入力が可能なこともあるということも覚えておきたい。
プロパティウィンドウなど、たくさんの文字列情報が必要なときには、Windowsの Systemフォントでは大きすぎて情報量が少なくて困ることがある。このような日本固有とも言える問題を回避するために、VisualBasic 2.0Jには
VFONTと呼ばれるフォントが用意されており、このフォントを使うためのVBフォントユーティリティが付属している。
これは大変便利なものであるが、ある日突然 VFONTが使えなくなったという話もよく聞く。具体的には、『MS VFONTを利用する』のオプションボタンが選択不能のグレイ表示になってしまうのだ。これは、Microsoft Access など外のMicrosoft製アプリケーションをインストールしたときに発生するようだ。
こうなってしまうと大変だ。これだけのためにVisualBasicを再インストールするのもちょっと...。こんなときには、WIN.INI を見てみよう。
一番カンタンなのは、プログラムマネージャから
[アイコン][ファイル名を指定して実行]を選び『sysedit』を起動する。ここで、WIN.INI の [fonts]セクションを見てみよう。上から下まで見ても、『VFONT』という表示はないだろう。そこで、図のように
MS VFONT=VFONT.FON
という一行を追加する。また変なアプリケーションをインストールして消されてはたまらないので、先頭に『;』をつけてさらに一行追加しておくとよいだろう。このファイルを保存したら、Windowsを再起動する。今度は VFONTが使えるようになっているハズだ。
プログラミングの行程の中で、実はもっとも大変なのがデバッグかもしれない。VisualBasicのデバッグ機能はそこそこのものが付属しているが、実際にはあまり活用されていないことも少なくないようだ。
デバッグの基本は、問題のありそうな箇所の前後にブレークポイントを設定して動作を一時停止し、そのときの変数の内容を見ることだ。
しかし、イベントドリブンのVisualBasicでは、コールヒストリを見るのも重要なことだ。あるイベントから意図しないイベントが発生し、さらにそこから別のプロシージャが呼ばれた結果、またまた最初のイベントが発生して...というような恐ろしいことになっていることも少なくないのだ。
このように意図しないところからスタックを使い果たしてエラーになったり、無限ループにハマってしまうこともある。
無限ループにハマったときには、あせらず {Ctrl} + {Break}キーを押そう。これでアプリケーションは一時停止する。そこから [実行][終了]メニューを選んでもいいが、フルスクリーンのウィンドウとか怪しいプログラミングをしているときには、ときとしてVisualBasicのメインウィンドウが表示されないといったことがある。しかし、こんなときにもたいてい出てきてくれるのがデバッグウィンドウだ。
デバッグウィンドウさえ出てくれば、こっちのモノである。おもむろに『End』 と打とう。これでアプリケーションは終了する。
これ以外にも、デバッグウィンドウでは演算などができるから、コードを実装する前にテストで処理を書いて実行してみるといったコトにも使うことができる。もちろん、Debug.Print で変数の内容も表示できるわけだが、デバッグウィンドウはそれだけではない、実に強力なモノであることを覚えておきたい。
デバッグしていてよく聞くのが、通常の実行時とデバッグ時で動作が変わるという話だ。『これは、VisualBasicのバグに違いない』と鬼の首でも取ったようにMicrosoftの悪口を言う人がいるが、残念ながらコレはバグではない。むしろ、そんなコトを言ってはアナタの無知をさらけ出すコトになりかねないので、十分に注意してほしい。
Windowsはご存じのようにメッセージ駆動のマルチタスク環境である。というコトは、タイミングにシビアな部分は、一気に実行してしまうときと、デバッグ時にステップ実行したときでは当然動作が異なってしまうのだ。通常動作ならば、外のアプリケーションやイベントが動作する恐れはないが、ステップ実行時には停止時に別のイベントが動作する時間ができてしまうのである。
したがって、厳密にはブレークポイントを設定したり、ステップ実行しても、正確にバグの原因を追及できない可能性があることを知らなくてはならない。このへんは、十分に論理的に考えてデバッグする必要がある。
VisualBasicでのフォーム名やコントロール名(Nameプロパティ)は、デフォルトでは Text1, Text2 といったソッケない名前になっている。しかし、コントロールが数が多くなってくると、何番目が何であるかなんてスグにはわからなくなってくる。そこで、Nameプロパティを変更しようというコトになる。
VisualBasicのマニュアルでは、コントロールの種類によって表(プログラミングガイド P.37 相当の表)のようなプリフィックスと、機能を示すサフィックスの組み合わせのコントロール名にすることを勧めている。たとえば、<OK>ボタンは cmdOK といった具合だ。
しかしながら、VisualBasic付属のサンプルプログラムはさっぱりこうなっていないし、Option Explicit すら入ってないばかりか、Def Int A-Zなどとタワけたことが書いてある。こういうコトは絶対にやってはいけない。
また、このオススメ表ではメニューは『mnu』で始まるコトになっているが、これは必ずしもよいとは言えない。というのは、メニューは階層化されているのが普通なので、階層がわからなくなりがちだからだ。私の場合、メニューだけは次のようにしている。
ファイル M_FILE
新規 M_F_NEW
開く M_F_OPEN
保存 M_F_SAVE
名前をつけて保存 M_F_SAVEAS
- M_F_SEP
終了 M_F_EXIT
編集 M_EDIT
元に戻す M_E_UNDO
- M_E_SEP
切り取り M_E_CUT
コピー M_E_COPY
貼り付け M_E_PASTE
大文字にしているのは、メニューであることが人目で分かるようにするためだ。また、M_F_NEWはM_FILE_NEWでもいいわけだが、長くなってしまうので途中は省略している。基本的に各階層はユニークな一文字で区別できるハズなのでこうしている。
私のやり方が最善だというつもりはないが、自分自身が後から見ても分かりやすいキチンとしたプログラミングを心がけよう。適当なプログラムを作って、あとから仕様変更で泣くのはほかならぬ自分であることを忘れないようにしたい。
コントロールには、プロパティ、イベント、メソッドがある。では、コントロール名だけを書いたときにはどうなるのだろうか?
実は、コントロールにはデフォルトのプロパティがあり、コントロール名だけを書いたときにはそのプロパティを参照したことになる。例えば、テキストボックスでは
Textプロパティであるから、次の2行は同意義である。
szBuf = txtName.Text
szBuf = txtName
このようなデフォルト値は、表(プログラミングガイド
P.134 相当の表)のようになっている。
これは一見便利なようだが、もし他人に見せるソースならば、なるべく避けた方がいいだろう。プロパティはプロパティ、メソッドはメソッド、変数は変数といった具合に分かりやすいようにしておくべきである。
VisualBasicで何がイヤかって、そりゃ数々あれど、FontName のデフォルト値が System フォントであるコトだ。システムフォントなんて、そのシステム設定によってかなり大きさの差がでてきてしまうから、アプリケーションのデザインが実行時にくずれてしまうことがあるのだ。
これは、実際のところフォントだけの問題ではないのだが、まずはフォントくらいは標準明朝といったどんなシステムにも普通はあるフォントにして、サイズもキチンと指定しておくのが第一である。
しかし、すべてのコントロールのフォントをいちいち『標準明朝』に書き換えるのは面倒である。もちろん、前に述べたような方法でコントロールをまとめて選択するという方法はある。しかし、どうせならばVisualBasic起動時から標準明朝になっていてくれれば、こんな結構なコトはない。
実は、私はかつてこれを実現したことがある。VisualBasic本体であるVB.EXEの内容をダンプして、それらしき箇所にパッチを当ててみたのである。何度か失敗したものの、最後は見事に動いた。
しかし、こんなことをしてしまうと、もちろん何かマズいコトが起きたときにもMicrosoftに文句を言えなくなるし、やっぱりオススメはできない。というワケで、今回は『できる』というコトだけは書いておくが、その手順やアドレスなどは一切公開しないが、あしからず。どうしてもやってみたい人は、自分の責任でやっていただきたい。
今回はVisualBasic環境を中心とした内容を取り上げたが、いかがだっただろうか。以上の TIPSのうちアナタはいくつご存じだっただろうか?
次の機会には、実戦的なプログラミングなどのトピックから、TIPSを拾ってご紹介したいと思う。