Visual Basic 6.0 テクニック
VB6対応

 

Visual Basic 中学校 > VB6 テクニック >

12.見えない標準オブジェクト

 

VBでは、コマンドボタンやテキストボックスはフォームに貼り付けないと使えないのですが、実は貼り付けなくても使えるオブジェクトが最初から用意されていることに気づいていましたか? たとえば、Appオブジェクトや、Screenオブジェクトです。

今回はこれらの「見えない標準オブジェクト」とでもいうべき、Appオブジェクト、Screenオブジェクト、Printerオブジェクト について紹介して、ちょっとだけErrオブジェクトについて触れます。これらのオブジェクトの活用方法を知らないと簡単にできることに気がつかないで難しいプログラムを書いてしまうことがありますから、知らない人はぜひ一読ください。

 

1.Appオブジェクトとは

 

Appオブジェクト(私は「エーピーピーオブジェクト」と呼んでいます)はVBで作成しているプログラムの情報を格納しています。たとえば、プログラムのどこでもいいから次のように記述してみてください。


MsgBox App.Path
 

こうすると、そのプログラムのあるパス、たとえば、C:\Program File\MyProgram などが表示されるのです。ただし、まだ一度も保存していないプログラムでこれをやるとvb.exe(vb6.exe)のあるパスが表示されます。

もちろんプログラムをコピーして移動してから実行すると、ちゃんと新しいパスが表示されます。

このようにAppオブジェクトなどは宣言や生成など一切必要なく、いきなり使えるので大変簡便です。

この他のAppオブジェクトの手軽で便利な機能をいくつか紹介しましょう。

まず、PrevInstanceプロパティ(プレブインスタンス)はおなじプログラムがすでに起動しているかどうかを調べます。俗に言う「二重起動の制御」というものです。Windows上では一度に同じプログラムを何個も起動することができたりするのですがプログラムの中にはこのように多重起動されたくない性質のものがあります。たとえば、最近のWindows Media Playerは多重起動できませんよね? VBでこの多重起動を防ぐにはプログラムが起動されたときに、すでに同じプログラムが起動されているかどうかを調べて、起動されているなら2つ目の起動は終了する。というようにプログラムします。

この「すでに同じプログラムが起動されているかどうか調べ」るのが PrevInstanceプロパティです。

次のように使います。

Private Sub Form_Load()

    If App.PrevInstance Then

        MsgBox "すでに同じプログラムが起動されているので終了します。"

        End

    End If

End Sub

ただ、この機能はプログラムをコンパイルして exe にしてから必要になる機能だと思いますのでVBの評価版を使っている人にはあまり関係ありませんね。

もう1つ、これは中上級者向けの機能なのですが、APIなどを使っているとアプリケーションのインスタンスのハンドルやスレッドのIDなどが必要になることがありますよね? これらもAppオブジェクトのプロパティとして参照できるので簡単に取得できますよ。

インスタンスのハンドルは hInstanceプロパティ(エイッチインスタンス)、スレッドIDは ThreadIDプロパティ(スレッドアイディー)で取得できます。

 

2.Appオブジェクトのその他の主なプロパティ

 

それでは、この他の主要なプロパティを一覧でしめしておきます。

プロパティ 読み方 説明
 Comments  コメンツ コメント。コメントはプロジェクトのプロパティの実行可能ファイルの作成のところでしてできます。
 CompanyName  カンパニーネーム 会社名。同上。
 EXEName  イーエックスイーネーム 開発中はvbpファイル名、コンパイル後はexeファイル名
 Major  メイジャー メイジャーバージョン。同二上。
 Minor  マイナー マイナーバージョン。同上。
 ProductName  プロダクトネーム 製品名。同上。
 Revision  リビジョン リビジョン。同上。
 TaskVisible  タスクビジブル タスクマネージャに表示するか設定できます。
 Title  タイトル タイトル。同上。タイトルはメッセージボックスなどのデフォルトのキャプションとなります。

オブジェクトブラウザで左側の領域(ペイン)から App を選ぶとすべての一覧を見ることができます。このほかにも私は使ったことはない便利そうな機能があるみたいなので、最低でも一度は見るべきです。OLETimeOutの設定がAppオブジェクトでできることをあなたは知っていますか?

 

3.Screenオブジェクト

 

Screenオブジェクト(スクリーン)もAppオブジェクト同様、宣言も何もしないでいきなり使えてしまうお得なオブジェクトです。Screenオブジェクトは主にディスプレイに関する情報を保持しているようですが、他にも便利なプロパティを装備しています。

Screenオブジェクトの機能をまとめるとディスプレイに関する情報の保持・フォントに関する情報の保持・マウスカーソルの制御・アクティブコントロールの制御のの4つに分けられます。ただ、残念なのはどの機能も簡単なことしかできないのでこった情報の取得や複雑な制御はできないのです。とはいえ、普通のアプリケーションを作成している場合には十分な機能ですから活用しない手はありません。

Screenオブジェクトの4つの機能
 ディスプレイに関する情報の保持
 フォントに関する情報の保持
 マウスカーソルの制御
 アクティブコントロールの制御

 

3−1.ディスプレイに関する方法の保持

まず、ディスプレイに関連したプロパティを紹介しましょう。

プロパティ 読み方 説明
 Height  ヘイト 画面の縦幅
 Width  ウィドゥス 画面の横幅
 TwipsPerPixelX  トゥウィップスパーピクセルエックス 横方向で1ピクセルあたりのTwips数
 TwipsPerPixelY  トゥウィップスパーピクセルワイ 縦方向で1ピクセルあたりのTwips数

このWidthやHeightはWindowsではディスプレイのプロパティの設定のところで解像度としていじれる設定です。VBで画面の大きさを取得したいときに使います。

但し、Windowsの世界ではピクセル単位(ドット単位)で大きさを指定するのですが、VBの世界ではピクセルではなくTwipsが標準です。そのためディスプレイの設定画面で表示されている値とScreenオブジェクトが返す値は異なります。

それでは、 1ピクセルは何Twipsなのでしょうか? 実はこれは環境によって違うのです。

しかし、環境によって違うといわれても困ってしまうのでScreenオブジェクトはこれをプロパティとして装備しています。それがTwipsPerPixelXプロパティとTwipsPerPixelYプロパティです。私の環境で試してみたところどちらも 15 を返しました。だから、私の環境では 1ピクセルは15Twipsということになります。

ほとんどの環境では12か15を返すようですね。TwipsPerPixelXとTwipsPerPixelYと2つ用意されているということは環境によってはこれらが異なる場合もあるということでしょうか?私は今までそのような環境はいじったことがありません。何か普通のパソコンではない特殊な環境を想定しているのかもしれませんね。

 

3−2.フォントに関する方法の保持

次に、フォントに関するプロパティを紹介します。

プロパティ 読み方 説明
 Fonts  フォンツ 使用可能なフォント名の一覧
 FontCount  フォントカウント 使用可能なフォントの数

このフォントに関するプロパティを使ってできることはさまざまでしょうが、さしあたってすべての使用可能なフォントを列挙するサンプルを掲載しておきましょう。

Dim K As Integer

For K = 0 To Screen.FontCount

    List1.AddItem ScreenFonts(K)

Next K

試す場合はフォームにリストボックスを追加してから実行してください。

 

3−3.マウスカーソルの制御

次は、マウスカーソルの制御に関するプロパティです。

プロパティ 読み方 説明
 MouseIcon  マウスアイコン マウスカーソルの画像
 MousePointer  マウスポインター マウスカーソルの種類(標準・砂時計など)

この機能をつかってマウスカーソルを砂時計にするには次のようにします。

Screen.MousePointer = vbHourglass

標準に戻すには次のようにします。

Screen.MousePointer = vbDefault

ここで登場する vbHouglassやvbDefaultはあらかじめ設定されて言う定数でこの他にはいくつかの定数が用意されています。このWEBページのサンプルの所にマウスカーソルを砂時計に砂時計にするサンプルがあってそこにすべての定数が紹介されているので興味のある人は参照してください。

さて、これらの標準や砂時計のアイコンはWindowsのコントロールパネルやデスクトップテーマのところで設定したものが表示されます。だから「砂時計」とは言ってもユーザーがちょっと面白いカーソルを設定している場合などはそのユーザーが指定しているカーソルが表示されるわけです。

しかし、プログラムで独自のアイコンを使用したい場合もありますよね。そういう場合はMouseIconプロパティも使って次のようにします。

Screen.MouseIcon = LoadPicture("C:\Test\MyCursor.cur")

Screen.MousePointer = vbCustom

これでいいのですが、やってみるといろいろ不満も出てきます。まず、この方法ではアニメーションカーソルは指定できないのです。これだけで結構がっかりですよね。それにくわえてどうも色数に制限があるらしくちょっと違う色で表示されたりしてしまいます・・・。

VBでアニメーションカーソルなどに切り替えたい場合は今のところAPIを使うしかないようです。

 

3−4.アクティブコントロールの制御

最後にアクティブコントロール関係のプロパティを紹介しましょう。

プロパティ 読み方 説明
 ActiveControl  アクティブコントロール  アクティブなコントロールを返します
 ActiveForm  アクティブフォーム  アクティブなフォームを返します

知らない人はかなり損をしているのがこの ActiveControlプロパティです。これを使えば、現在フォーカスのあるコントロールを参照することができるのです。

この機能についての説明はそのうち別の場所ですることにしますが、待ちきれない方は自分で実験してみてください。

ただ、気をつけたいのはフォームにもActiveControlというプロパティがあるのですよね。両方とも似たようなきのうなので混同しないようにしましょう。フォームのActiveControlプロパティはそのフォームの中でアクティブなコントロールを返します。たとえそのフォーム自体が非アクティブであってもです。一方ScreenオブジェクトのActiveControlプロパティは全体でアクティブなコントロールを返します。

 

4.Printerオブジェクト

 

Printerオブジェクト(プリンター)はVBでプリンター情報の取得や印刷をするときに使います。印刷についてはいかに簡単に工夫をこらしすばらしいものを印刷するか、さまざまなこだわりようがあるので各社からいろいろなツールが発売されています。クリスタルレポートやアクティブレポートなどはその代表でVBから行う印刷を助けてくれます。

しかし、なにもそれらのツールを使わなくてもこのPrinterオブジェクトを使えば印刷はできます。たしかにプロが作るようなかっこいい印刷物をつくるのはこのPrinterオブジェクトだけでは大変ですが、それでもちょっと印刷機能をつけるくらいなら十分です。

次の例はテキストファイルの内容を印刷します。

Private Sub Command1_Click()

   
Dim FileName As String
   
Dim LineText As String

    FileName = "C:\Test.txt"

   
Open FileName For Input As #1
   
Do Until EOF(1)

       
Line Input #1, LineText
        Printer.
Print LineText

   
Loop
   
Close #1

    Printer.EndDoc

End Sub

どうでしょう? プログラムの大部分はテキストファイルの読み込みで、印刷自体の部分は少ないことがお分かりになるでしょうか? このようにPrinterオブジェクトは違和感なくVBに溶け込んで印刷を実現してくれます。

さらに、CircleメソッドやLineメソッドを使って線を引いたり円を描いたりもできますし、中級者以上になればデバイスコンテキストのハンドルをとって画像の複雑な転送やそのほかの凝った処理まで可能になるのです。

業務用のプログラムでもそれほど凝った印刷を必要としないのであれば、Printerオブジェクトで十分ということですね。

なお、PrinterオブジェクトはあらかじめWindowsで設定されている「通常使うプリンタ」が対象となりますが、VBから通常使うプリンタを変更することも簡単なはずなのでこのあたりは問題にはなりません。

印刷関係の話は話題が尽きないので今回の枠の中ではここまでとします。また機会があったら印刷の話を書きたいと思います。

 

5.Errオブジェクト

 

Errオブジェクト(エラー)は上の3つのオブジェクトとは違って、正確にはErrObjectオブジェクト(エラーオブジェクト)型の変数の名前です。しかし、やはり自分で宣言したりする必要はないので上の3つと同じように気軽に使用することができます。

Errはエラー情報を管理しています。プログラムにエラーはつきものでどんなに慎重にプログラムしてもエラーを0にするというのは不可能に近いです。そこで、万一発生してしまったエラーに対応するのがErrです。もっともわざとエラーが発生しそうなコードを実行してErrを技巧的に使う場合もありますが。

Errにはエラーが発生した場合にVBが自動的に値をセットするので、エラー発生時にErrを参照するとどんなエラーが発生しているのかプログラムで調べることができます。もちろん、実行時エラーが発生するとプログラムが終了してしまうのでErrを使いたい場合はあらかじめOn Errorステートメントで準備しておく必要があります。

但し、On Errorステートメントを使用するとその場でErrの内容がリセットされてしまうのでご注意ください。

エラー処理のやや詳しい説明は初級講座第22回にありますので、ここではこれだけとします。

 

6.最後に

 

今回はAppオブジェクト、Screenオブジェクト、Printerオブジェクト、Errオブジェクトの4つを紹介しました。これら4つは宣言も何もしないでいきなり使えるので簡便性もあり、またその提供する機能には見るべきものがあります。

実はこれらの他にもVBでは標準で使用することができるオブジェクトがいくつかありますが、それらは最低でも宣言が必要となるので今回紹介した4つとは一線を画しているといえます。

みなさんは、VBのことを知り尽くしていますか? まだ知らない便利なVBの機能があるのではないですか? VBの標準で使える機能を探すにはオブジェクトブラウザが手っ取り早いです。あなたの知らないオブジェクトや関数がオブジェクトブラウザに掲載されていないかどうか一度眺めてみるのもいいと思います。

オブジェクトブラウザは [Shift ] + [F2] か [プロジェクト]メニューから表示させることができます。

それでは、失礼します。