速報! Visual Basic 6.0オーバービュウ

 

酒井法雄 SAKAI,Norio
norio@int21.co.jp


ActiveXを合い言葉に,コンポーネント作成やWeb対応クライアント開発,API利用などが大幅に強化されたVisual Basic 5.0が登場してから,一年半が経過した.そして,早くもVisual Basic 6.0が発売された.ここでは,データアクセス,Web対応サーバー開発,言語使用などが大幅に強化されたVisual Basic 6.0の概要を紹介する.


Visual Basicを振り返る

 Windowsの進歩とともに,Visual Basicはその機能を強化してきた.新しいVisual Basic 6.0の新機能がどうして出てきたのかを理解する上でも,まずは今までのVisual Basicの流れをおさらいしておこう.

■Visual Basic 1.0(英語版)

Windowsでの開発を容易にした

 初めてのVisual Basicは,Windowsとしては初めてメジャーになったWindows 3.0用の開発ツールとして登場した.イベントドリブンのGUIアプリケーションを作成するためには,その新しい概念ばかりではなく,膨大なAPIについての知識が必要であり,開発言語もC言語であった.しかも,GUIアプリケーションを作るのに,あくまでもキャラクターベースでの開発環境しかなかった.これでは,メジャーとなりつつあるWindowsの普及には大きな障壁となる.このため,よりイージーにGUIベースでの開発環境が求められたのである.
 Windowsの代表的なコントロールをFormに貼り付けるやり方や,プロパティやメソッド,イベントなどもBASIC言語の拡張として実装する方法,カスタムコントロールによる拡張など,Visual Basicを特徴づける基本的な部分は,Visual Basic 1.0で確立されたものである.従来型の開発手法に比べて,その生産性はきわめて高く,誰もが手軽にWindowsアプリケーションを作成できるツールとして,注目され始めることとなった.しかし,その動作は遅く,どちらかといえば,プロトタイプを作るためのツールという見方がされた.

■Visual Basic 2.0

初めての本格的Windows用GUIツール

 1.0の弱点であった実行速度の向上のほか,より使いやすいユーザーインターフェイス,より現実的なプロパティやメソッドの強化などがされた.また,OLE 1.0に対応し,さらにProfessional Editionでは,不完全ながらODBCによるC/S型データベースアクセスの機能が搭載された.おりしも,コストが安いPCベースでのC/S型システムが注目されていた時期であり,Windows用の一般ツールというだけでなく,クライアントツールとして脚光を浴びることとなった.

■Visual Basic 3.0(英語版)

データベースアプリケーションが開発可能に

 2.0の発売からわずか半年後,Visual Basicは大幅なバグフィックスをした3.0となった.残念ながら日本では発売されなかったものの,Access1.1と共通のデータベースエンジンJetを搭載し,DAOを使ってあくまでもVisual Basicライクにアクセスすることができた.また,ODBCのレベルも上がり,より本格的なC/S型アプリケーションが構築できるようになった.もっとも,DAOを使ったC/S対応には構造的問題があり,速度などの点で大いに不満はあった.また,OLE Automationに対応した初めてのツールでもあった.
 このように,Visual Basic 3.0はデータベースアプリケーションを作ることができる初めてのVisual Basicであり,その先進的な機能を,日本語版として使えなかったことは,多くのユーザーを残念がらせた.しかし,実際には英語版でも日本語のハンドリングなどにさして問題はなく,今のCOMに依存した身動きの取れなくなったVisual Basicと違い,私は最良のVisual Basicだと思っている.

■Visual Basic 4.0

32bit化,COM対応,C/S本格対応したWindows標準ツール

 Windows NTやWindows 95(こいつは実際には16bit OSだが)に対応し初めて32bit化されたVisual Basicが4.0である.実際には16bit版もあったが,クオリティは低かった.
 Microsoftが打ち出していたOLE2(COMと読み替えてもほぼ問題ない)に対応して,VBXカスタムコントロールを捨て,COMベースのカスタムコントロール(OCX,今でいうActiveXコントロール)が実装され,Automatonもより本格的に装備された.Classの概念を取り入れ,OLE Severを作成できるようになり,さらにRemote Automation(DCOMの前身的存在)を使った分散オブジェクト環境を構築できるようになった.
 また,RDOが装備され,C/S型アプリケーションでのより高速なデータアクセスが可能になった.これで,我が国でも本格的にVisual BasicをC/S用ツールとして使えるようになった.
 Visual Basic 4.0はおりからのWindows 95ブームに乗って,確実にWindows用の標準的なツールとなっていった.しかし,Visual Basic 3.0のなかった我が国では,この膨大な内容を消化するのに時間がかかったのも事実だった.

■Visual Basic 5.0

インターネットに惑わされたが現実的な進化を遂げた

 16bitは切り捨てられた.おりからのインターネットブーム,Javaブームに負けじと,Microsoftが無理やり考え出したActiveXテクノロジー(実態はCOMにほかならない)を取り入れた,インターネット対応Visual Basic.ActiveXコントロールはJava対抗と思われがちだが,実際にはVisual Basicだけでもコンポーネント資産を作っていくことができる開発環境としての方が便利で重要だった.COMサーバーを構築する上ための言語仕様や機能が強化されており,より柔軟な開発ができるようになった.Windows NT 4.0から採用されたDCOMにも対応しており,分散オブジェクトへの方法性がいちだんと強化されたが,現実的には効率的なオブジェクト管理手段はWindows NTにはなく,あくまでも実験レベルであった.
 RDO 2.0になり,バッチカーソルやイベントなどの採用でより柔軟で高度なアプリケーションが作成できるようになったほか,T-SQLデバッガなどツールも充実してきた.
 AddressOfを使ってCallback関数を使うAPIをコールできるようになり,サブクラス化などが容易になった.また非公式ながらVarPtrなどもサポートされ,ポインタの概念を処理できるようになったことも大きい.
 開発環境も,クイックヒントなどでバグが出にくく,効率の高いコーディングができるように整備された.
 このほか,細かい言語仕様が強化され,「なんでもVisual Basicだけでできるようにする」といった方向が見受けられる.しかし,一方で難しくなり過ぎたという意見も出てきた.


そして…Visual Basic 6.0

 このように,バージョンアップを受けるたびに,より実戦的で高機能になってきたVisual Basicだが,5.0あたりからはついていけなくなったと感じるユーザーも多いようだ.実際,私も5.0の機能で使ったこともないものがあるし,使ったとしても原稿ネタとしてだけということも少なくない.
 もはや,Visual Basicは5.0で最強であり,これ以上のことをBasicベースのシステムに望むべきではないとすら思う.しかし,Visual Basicは6.0になった.では,いったいどのように強化されているのだろうか?
 Visual Basic 6.0の強化点は,大きく分けると次のようになる.

 このように書いてしまうとわかったようなわからないような感じだ.Visual Basicのヘルプを見ると,「Visual Basic 6.0の新機能」という項目があり,ここから追っていくとさらになんだかわからないことになってしまう.というのも,これらは項目の羅列に過ぎず,細かいことはもっと追っていかないとわからないし,全体像はすべてを追っていかないとさらにわからないからだ.これらを単純化すると,実際には次のような3本柱になると考えてよい.

 このわけ方は,Visual Basic 6.0起動時のプロジェクト選択画面(図1)からも,理解できるだろう.


図1:VB6.0プロジェクト選択画面 (8KB)

 これらのうち,実際には80%くらいの分量をもつのがデータアクセスの強化点である.残りについては,確かに新しい概念もあるものの,さして難しくはない.
 つまり,Visual Basic 6.0の主要な強化点は,ADO/OLE DBベースのデータアクセススタイルにすることであり,既存のDAOやRDOから乗り換えさせるために,強力な機能はADOベースでないと使えなくしてしまったのが変更点である.Web対応は実はたいした内容ではないし,そもそも使わない人にとっては関係ない内容である.細かい言語仕様は「へ〜,便利になったね」という程度なので,比較的すぐに使いこなすことができるだろう.
 Visual Basic 6.0の特集を組むにあたって,編集部と筆者陣でミーティングを開いたときには,このあたりのウェイトの予測が甘く,とくにデータアクセスまわりはコンポーネント作成とは切り放せると思っていたのだが,実際には密接な関係があった.
 ともあれ,各内容の詳細についてはそれぞれの担当ライターが書いてくださることになっているので,ここではそれぞれの機能について概要とバックグラウンドについて述べることにしよう.


ADOとOLE DBとは

 すでに述べたように,Visual Basic 6.0最大の強化点は,ADOおよびOLE DBへの対応である.これらの技術については,MicrosoftのWebサーバーからデータベースに接続する技術として,一部では有名な技術である.すなわちIIS(Internet Information Server)のASP(Active Server Pages)からADO,OLE DB経由でのSQL Serverへのアクセス手法として,採用されていたのだ.
 しかし,こういったWebサーバーでのデータアクセスに興味がなかった方にとっては,「なんでVisual Basicでそんなのが必要なの?」ということになってしまうだろう.そこで,まずは,ADOとOLE DBについてのバックグラウンドについて述べておこう.
 従来,C/S型データアクセスといえば,主としてSQL ServerやOracle 7 or 8 ServerのようなSQL言語を採用したRDBMSに接続することを意味していた.
 もともと,これらのRDBMSには,クライアント側にDB LibraryやOCI(Oracle Call Interface)と呼ばれるAPIセットが提供されており,これらのAPIをネイティブにコールしてアクセスするものだった.しかし,いずれもSQL系のRDBMSなのだから,共通項も多い.そこで共通項となるようなAPIセットを作り,いずれのRDBMSにも同じ手順でアクセスできるようにしたのがODBC(Open DataBase Connectivity)であった.ODBCにアクセスするためには,それぞれのRDBMSに対応したODBCドライバが必要であり,この性能によって機能やパフォーマンスが決定した.ODBCドライバには,ExcelやAccess MDB用,さらにはテキストファイル用などもあり,RDBMS以外にも同じような手順でアクセスすることができるようになっていた.
 しかし,これとて依然として低レベルなAPIセットである.Visual Basicから呼び出しやすいように,DAOやRDOといったCOMオブジェクトベースのミドルウェアが提供されることとなった(図2).もっとも,このような複数レイヤーになるにしたがってパフォーマンスが落ちるのもまた必然であり,Oracle用であればOO4O(Oracle Objects for OLE)のようなODBCを使わずにOCIに直接アクセスするようなものが,結果的にパフォーマンスもよく,Oracle自体の機能も生かすことができた.
 しかし,データソースはRDBMSばかりとは限らなくなってきた.テキスト全文検索のIndex Serverや,マルチメディアに対応したメディアサーバーなど,次第にさまざまなデータ形式に対しても,共通のデータアクセス手法でアクセスできるのが望ましいということになってきた.
 これが,Microsoftの言う「ユニバーサルデータアクセス」(図3)である.このため,Microsoftでは,ODBCに代わる新しいデータアクセス機能として,OLE DBを提唱した.OLE DBは,その名の通りOLEすなわちCOMをベースにしたデータアクセス用インターフェイスであり,RDBMSとネイティブ接続できるほか,そのほかのクエリープロセッサやODBCデータソースに対しても接続が可能である(図4).これらには,非リレーショナル型のデータベース,たとえば,メインフレームのISAM/VSAMおよび階層的データベース,電子メールとファイルシステムストア,テキスト,グラフィカル,および地理データ,カスタムビジネスオブジェクトなどが考えられる.


図2:ODBCの基本構造 (22KB)


図3:ユニバーサルデータアクセスのアーキテクチャ (15KB)


図4:OLE DBコンポーネント (15KB)

 OLE DBには,データを供給する側の「プロバイダ」と,取得する側の「コンシューマー」がある.
 しかし,OLE DBはこれらの間のインターフェイスに過ぎず,簡単にアクセスする仕組みではない.そこで,ADO(ActiveX Data Object)と呼ばれるCOMベースのオブジェクトが提供された.ADOは従来のRDOなどと同じような複数階層オブジェクトレイヤーとして提供されている(図5).ADOからは適切なOLE DBプロバイダを選び,統一された手続きであらゆるデータソースにアクセスすることができるようになっている.つまり,従来はDAOやRDOとわかれていたものをADOとして統一し,さらにその先にあるものはODBCではなくOLE DBとしたということである.そして,すべてがCOM/DCOMベースとなってきたWindows上では,OLE DBをベースにして,Webアプリケーションのデータソースとしたり,分散オブジェクト環境を作るといったことにも,ハードウェアに依存せず透過的に使えるメリットがある(図6).


図5:ADO概念図 (10KB)


図6: (37KB)


Visual Basic 6.0でのADOとOLE DBの新機能

 こう書いてくると,とってもよいことだらけのようだが,必ずしもそうではない.というのも,現状のADOはその汎用性を武器としており,RDOなどで培われてきたRDBMSに特化した高機能な部分までをサポートしているわけではないのだ.また,ADO/OLE DBはユニバーサルデータアクセスを実現するための新しい機能であり,決して従来よりイージーに使うことができるものではないことは,Microsoftも言明しているのだ.現に,DAOやRDOも継続してサポートされている.
 それならば,ADOを今使う意味はないのではないかということになるのだが,現実的なパフォーマンスや安定性を追求するなら,まさにその通りである.しかし,Visual Basic 6.0のデータアクセス周りの新機能は,ほとんどがADOあるいはOLE DBプロバイダ接続を前提としているため,利用することができないのだ.しかし,それらの新機能は,なかなかソソるものがあり,ついADOに移行しようと思ってしまうである.

 では,実際にこれらのソソる新しい機能について,概要を述べよう.ここでは,次のような分類をしてみた.

●ミドルウェア系
 ADOやOLE DBなどのミドルウェア本体部分

●コンポーネント作成および中間層オブジェクト系
  データアクセスをするデータソースやデータコンシューマのコンポーネントを作成する部分

●コントロール利用系
  データアクセスに対応したコントロール

●環境およびツール系
  開発環境にインテグレートされた機能やツール,ウィザードなど


ミドルウェア系

■ADO
Lrn Pro Ent


 ローカルデータとリモートデータの両方に対応するコモンインターフェイス,リモートアクセス可能な独立したレコードセット,ユーザーアクセス可能なデータ連結インターフェイス,および階層レコードセットを採用している.

■ADOデータ(ADODC)コントロール
Lrn Pro Ent


 DataコントロールやRDCと同様に機能するADO用データソースコントロールであり,OLE DBとの連結が可能.

■OLE DB のサポート
Lrn Pro Ent


 すべての新しいデータ連結コントロール,Data Environmentデザイナ,およびData Reportデザイナは,OLE DBに連結できる.

■ADO Recordsetの受け渡し
Lrn Pro Ent


 プロセス間,およびHTTPまたはDCOMを使用してマシン間でADO Recordsetをやりとりできる(図7).
 この機能は,RDS(Remote Data Service)と呼ばれ,HTTPのポートを使ってMIME形式でデータをやり取りする仕組みとして,すでにIIS方面では知られた技術であるだ.従来は,Webブラウザ内でのスクリプティングあるいはActiveXコントロールなどから,見かけ上のページを切り替えないでサーバー側とデータのやり取りをする仕組みだったのだが,いまやセキュリティがちがちのところでも開いているこのポートを使ってデータをやり取りできること自体に価値がある.


図7:ADO Recordsetの受け渡し (8KB)


■Data Environment
Pro Ent


 ADO オブジェクトを作成するための,既存のUserConnectionデザイナの高機能ADO版ともいえるデザイナー.作成したADOオブジェクトは,フォームやレポート上の連結可能オブジェクトのデータソースとして使用することも,Data Environmentオブジェクトのメソッドやプロパティとしてプログラムでアクセスすることも可能.ドラッグ&ドロップ,階層,グループ化,集計などの機能もサポートしている(図8).


図8:DataEnvironmentデザイナ (6KB)


コンポーネント作成および中間層オブジェクト系

■独自のデータコンシューマとデータソースの作成
Pro Ent


 ユーザーコントロールまたはクラスを使って,複合連結機能をサポートする独自のデータコンシューマとデータソースのコンポーネントを作成できる.これらは,BindingsCollectionオブジェクトを使って任意に連結できる.
 以前のVisual Basic 5.0では,ADOベースでこそないが,いわゆるDataSourceプロパティを装備した,データコンシューマーとなるコントロールは作成できた.しかし,DATAコントロールやRDCのようなデータソースとなるようなコントロールを作成することはできなかった.
 Visual Basic 6.0ではOLE DBベースの独自のデータプロバイダをも作成できるので,面白いデータソースを作ることができるはずだ.

■データフォームウィザードの機能拡張
Pro Ent


 コントロールがデータコントロールに連結されない,ADOを使うコードだけのフォームを作成可能なウィザード.アプリケーションウィザード,チャートウィザード,およびフレキシブルグリッドウィザードと統合されている.

■データオブジェクトウィザード
Pro Ent


 Data Environmentまたはユーザーコントロールに連結される中間階層オブジェクトの作成を自動化するウィザード.

■フォーマットオブジェクト
Lrn Pro Ent


 データベースと連結コントロールの間で双方向のデータ変換を実現.データベースから値を読み取るとき,フォーマットオブジェクトは,連結コントロールに対応したデータ型に値を変換する.既存のコントロールからは,DataFormatプロパティをクリックして図9のようなダイアログから表示形式を選ぶことができる.通貨や日付などのほか,チェックボックスなどの指定もでき,データ内容と表示形式の違いを吸収できる.


図9:プロパティページ (6KB)


コントロール利用系

■DataRepeaterコントロール
Pro Ent


 このコントロールにActiveXコントロールを挿入すると,いくつかの表示フィールドを組み合わせた行単位の表示を繰り返すカスタムビューを作成できる.ただし,一行分の表示は事前にActiveXコントロールとして作成している必要がある.

■階層フレキシブルグリッド(MSHFlexGrid)コントロール
Lrn Pro Ent


 MSFlexGridコントロールの更新バージョンであり,フレキシブルグリッドコントロールの全機能をサポートするほか,ADO Recordset の階層を表示できる.返された各Recordsetは個々のバンドとしてグリッド内に表示され,個別にフォーマット可能.

■DataList,DataCombo,DataGridコントロール
Lrn Pro Ent


 DBList,DBComboおよびDBGridコントロールのOLE DBバージョン.ADOデータコントロールもサポートする.

■DTPickerコントロール
Pro Ent


 日付や時刻をカレンダー表示し,スピーディーに入力するためのコントロール.クリックすると,次に述べるMonthViewがポップアップする(図10).


図10:UpDown(上段左),MonthView(上段中),DTPicker(上段右),CoolBar(中段),FlatScrollBar(下段) (6KB)


■MonthViewコントロール
Pro Ent


 カレンダーから個々の日付や特定範囲の日付をピックアップできる.


環境およびツール系

■DataReportデザイナー
Pro Ent


 ドラッグ&ロップで,レコードセット(階層レコードセットも可)から,レポートを作るためのデザイナー(図11).



図11: DataReportデザイナーのデザイン画面(左) (13KB) 実行画面(右) (8KB)


■Visual Database Toolsの統合(Query,Databaseデザイナ)
Ent


 データベースのスキーマとクエリーをビジュアルに作成,変更できるデザイナー.SQL ServerやOracleテーブルの作成,ドラッグ&ドロップによるビューの作成,および列のデータ型の自動変更ができる.

■[データビュー]ウィンドウ
Pro Ent


 接続しているすべてのデータベースを閲覧し,それらのテーブル,ビュー,ストアドプロシージャなどを参照できる.

■SQLエディタ
Ent


 新しいストアドプロシージャやトリガをSQLサーバーおよびOracleデータベースに追加できる.

 データアクセスのためのデザイナーやウィザードは,次のように大幅に数が増えた.

 このように,Visual Basic 6.0でのデータアクセスまわりの拡張は目覚ましい.それも,単にADO/OLE DBにアクセスできるとか,それに対応したコントロールが用意されただけでなく,OLE DBプロバイダまでもがActiveXコンポーネントを作る要領で作成できるようになっている.また,開発時に必要な便利なツールがインテグレートされたことも大きい.
 しかし,いずれもがADOベースになっていることを忘れてはならない.今後,ADOベースでの開発をするならば,Visual Basicは強力な開発環境であると言える.しかし,ADO自体がさらに強力な機能をもつようにならないと,従来のRDBMSへのアクセスしか考えないならば,すぐに移行すべきとは言い難いように思える.
 とはいえ,独自のOLE DBプロバイダを作り,今までは考えられなかったモノ,たとえばカード名をパラメータとしてトランプのカードの図柄を得られるOLE DBプロバイダを作るといった,面白いことが可能になったのである.まずは,OLE DBのもつ,ユニバーサルデータアクセスという考え方を納得した上で,用途を考えるべきだろう.


インターネットの新機能

 インターネット時代に入り,JavaにプラットホームとしてのWindowsを脅かされることを,Microsoftは恐れた.そこでひねり出したのが,以前から押し進めてきたCOMベースのコンポーネント化をインターネットに対応させることだった.Visual Basic 5.0では,クライアント側コンポーネントとして,ActiveXコントロール,ActiveXドキュメントという2つの大きな柱があったが,いずれもセキュリティや開発効率などの問題から,インターネットの世界では大きな流れを作り出すには至らなかった.
 そこで,Microsoftはもっと標準に近づいた方法を取ることにした.サーバーサイドでは,IISにVBScriptベースのASPを搭載し,容易にWebアプリケーションが作れるという方向性,クライアントサイドでは,Dynamic HTMLである.実際にはDHTMLはCOMを生かすためにやはりMicrosoft独自の部分が少なくない.それどころか,その拡張としてScriptletといったテキストベースのCOMコンポーネントすら発明している.いずれもあくまでもHTMLの拡張としてテキストベースでやろうというものだ.
 Visual Basic 6.0では,このIIS対応のVisual Basicアプリケーション,さらにDHTMLアプリケーションを開発するための拡張がなされている.

■IISアプリケーション
Pro Ent


 Visual Basicコードを使ってIISを使ったサーバーサイドのアプリケーションを作成,デバッグができる.
 この機能は,IIS+ASPの拡張として位置づけられるもので,直接ISAPIと接続するものではない.実際にはASPファイルの内容は次のようになっており,「WebClassRuntime.WebClassManager」をCreateObjectしている.このWebClassManagerからASPのServer,Application,Session,Request,Responseの各オブジェクトが渡される.つまり,ユーザーがVisual Basicで作成したCOMベースのActiveXサーバーは,さらにWebClassManagerから呼び出されるのである.

<%
Server.ScriptTimeout=600
Response.Buffer=True
Response.Expires=0

If (VarType(Application("~WC~WebClassManager")) = 0) Then
  Application.Lock
  If (VarType(Application("~WC~WebClassManager")) = 0) Then
    Set Application("~WC~WebClassManager") = _
     CreateObject("WebClassRuntime.WebClassManager")
  End If
    Application.UnLock
End If

Application("~WC~WebClassManager").ProcessNoStateWebClass "wcDemo.wbcls1", _
    Server, _
    Application, _
    Session, _
    Request, _
    Response
%>

 このようなアプリケーションを作成するため,Visual BasicにはWebClassと呼ばれるオブジェクトが追加され,このデザインをするのがWebClassデザイナー(図12)である.WebClassには,次の二種類のアイテムがある.


図12:WebClassデザイナ (10KB)


1)HTMLテンプレートアイテム
 HTMLのテンプレート中に指定した<WC@XXXX>といったタグで囲まれた部分を,任意の文字列に置き換えてクライアントに返す.

2)カスタムWebアイテム
 アイテム名+イベント名の形で呼び出されるイベント(図13)にResponseオブジェクトのWriteメソッドを使ってHTMLを記述する.実際にはこのアイテムとイベント名を指定したURLをASPの引数として渡す形になっている(図14).このため,Getはできず,Postにしか対応できない.


図13:WebClassでのカスタムイベント定義 (12KB)



図14:IE 4.xカスタムイベントを呼び出すURL (14KB)


 ASP配下にありながらVisual Basicで作成可能であるから,ASPの有用なオブジェクトを参照できるし,コーディング自体はイヤらしいVB ScriptではなくVisual Basicそのものでできる点は,開発効率もよい.しかし,このURLはちょっと恥ずかしい.
 また,IISが同じマシンにインストールされていれば,[F5]キーで実行すると,自動的にIISの仮想ディレクトリが設定され,IEが起動されてスグにデバッグできるのも優れている.しかし,エラー時にIE内に表示されるHTML文に<HTML><BODY>などの当然あるべきタグがなかったり,いまだに1バイトカナが使われているなど,センスを疑わざるを得ない部分もある.
 確かに開発効率はよくなっているものの,技術的に新しい部分や強化された部分というのものがない.あくまでもASP配下にあり,直接ISAPIをいじるような形になっていないため,たとえばユーザー認証まわりをDB化するとか,改変ができないようにするといった業務向けのイントラネットソリューションにはなっていないのである.デバッグ環境などがよいだけに,この点は残念なところだ.

■DHTMLアプリケーション
Pro Ent


 Internet Explorer 4.x以降のDHTMLに対応するアプリケーションを作成できる.実際には,DHTMLデザイナー(図15中央)を使って記述する.これは,まるでHTML作成ツールのようなもので,左側のTreeViewにタグのようすが階層表示され,実際のデザインは右側に表示される.左側のツールボックスにあるような部品はここに直接貼り付けることができ,もちろんプロパティはプロパティウィンドウで指定ができる.応答するコードもVisual Basicのエディタでイベントとして記述することができる.
 これはなかなかうまく作ったなという感じはするが,どうもVisual Basicである必然性が感じられないのも事実だ.確かにDHTMLはよいソリューションとなり得るかもしれないが,Microsoft独自技術であることから,あまり普及するとは思えない.用途やターゲットを限定したイントラネットであれば,うまい使い道がありそうである.


図15:DHTMLデザイナー (44KB)


■AsyncReadの機能拡張
Lrn Pro Ent


 従来からあった,ActiveXコントロールでのAsyncRead,すなわち非同期ダウンロードの機能が拡張された.実際には,現時点で読み取られているバイト数や,これから読み取るバイト数などのステータス情報を取得できるようになった.
 新しい言語メンバとして,AsyncReadProgressイベント,BytesMaxプロパティ,BytesReadプロパティ,Statusプロパティ(AsyncPropertyオブジェクト),StatusCodeプロパティ,Targetプロパティがある.さらに,AsyncReadメソッドおよびAsyncReadCompleteイベントは機能拡張されている.

■ActiveXドキュメントの強化
Pro Ent


 IE 4.xを使ったとき,ActiveXドキュメントはURL直指定でのダウンロードが可能となった.

 このように,インターネットというよりWebを拡張するさまざまなアプローチが追加され,このためVisual Basic環境自体がモディファイされている.それぞれに興味がある方には面白いものかもしれないが,今一歩詰めが甘いように思えた.


新しいコントロールと強化されたコントロール(データアクセス系以外)

 データアクセス系以外にも,さまざまなコントロールが追加・強化されている.その中でも気をつけておかなくてはならないのは,Windowsのコモンコントロールを使わないコントロールがサポートされていることだ.

■Windowsコモンコントロールについて


 VTreeView, ListViewといったいわゆるWindows 95インターフェイスのコモンコントロールは,その名の由来通り,Windowsの提供するComCtl32.dll内にあるコントロールを使うものである.Visual Basic 5.0では,このDLL内のコントロールを使うためのインターフェイスとして,カスタムコントロールComCtl32.ocxとComCt232.ocxという2つのOCXとして実装されていた.
 ところが,ComCtl32.dllは煩雑にバージョンアップされたため,そのためにDLLの整合性がとれずにうまく動作しないといった問題や,配布時の再配布権限で問題が発生するケースがあった.そこで,Visual Basic 6.0では,ComCtl32.dllを使わないバージョンのOCXも用意することになったのである.

古いファイル名新しいファイル名
ComCtl32.ocxMsComctl.ocx
ComCt232.ocxMsComct2.ocx
ComCtl32.dllこのファイルは必要ありません.

 これらは,ソースを読み込むと,自動的にアップグレードするかを聞いてくる.また,[プロジェクト]メニューから[プロジェクトプロパティ]ダイアログボックスを開き,[ActiveXコントロールのアップグレード]をオフにすれば,聞いてこなくすることもできる.
 次に,各OCXに含まれるコントロールを示す.

MsComctl.ocx

MsComct2.ocx


新しいコントロール

■Coolbarコントロール
Pro Ent


 Internet Explorer のツールバーのようにユーザーが構成できるツールバーを作成するためのコンテナコントロール.

■FlatScrollbarコントロール
Pro Ent


 フラットな外観のスクロールバーを使うことができる.

■ImageComboコントロール
Lrn Pro Ent


 項目リストにイメージを追加できるコンボボックスコントロール.


強化されたコントロール

■組み込みコントロールの機能拡張
Lrn Pro Ent


 データ連結プロパティ(データアクセスでの強化点を参照のこと)およびデータの妥当性検査の機能拡張(後述)

■ImageListコントロールの機能拡張
Lrn Pro Ent


.gif,.jpg,.curファイルをサポート.

■ListViewコントロールの機能拡張
Lrn Pro Ent


新しいコレクション:ListSubItemsコレクション
新しいプロパティ:AllowColumnReorder,CausesValidation,Checkboxes,ColumnHeaderIcons,FlatScrollBar,FullRowSelect,GridLines,HotTracking,HoverSelection,Picture,PictureAlignment,Position Property(ColumnHeaderオブジェクト),TextBackground
新しいイベント:ItemCheck,Validate

■MSChartコントロールの機能拡張
Pro Ent


 データ連結およびIObjectSafetyインターフェイスをサポート.
新しいプロパティ:CausesValidation,DataMember,DataSource,OLEDragMode,OLEDropMode
新しいメソッド:OLEDrag
新しいイベント:OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,OLESetData,OLEStartDrag,Validate

■ProgressBarコントロールの機能拡張
Lrn Pro Ent


新しいプロパティ:Orientation,Scrolling
新しいメソッド:Refresh

■Sliderコントロールの機能拡張
Lrn Pro Ent


新しいプロパティ:CausesValidation,Text,TextPosition
新しいイベント:Validate

■TabStripコントロールの機能拡張
Lrn Pro Ent


新しいプロパティ:CausesValidation,HighLighted Property(Tabオブジェクト),HotTracking,MultiSelect,Placement,Separators,TabMinWidth,TabStyle
新しいメソッド:DeselectAll
新しいイベント:Validate

■Toolbarコントロールの機能拡張
Lrn Pro Ent


新しいオブジェクトおよびコレクション:ButtonMenuオブジェクト,ButtonMenusコレクション
新しいプロパティ:DisabledImageList,HotImageList,Style,TextAlignment
新しいイベント:ButtonDropDown,ButtonMenuClick

■TreeViewコントロールの機能拡張
Lrn Pro Ent


新しいプロパティ:CausesValidation,Checkboxes,FullRowSelect,HotTracking,Scroll,SingleSel
新しいイベント:NodeCheck,Validate

 このように,細かい点ではあるが,各コントロールの機能が地道にアップしているのは好感がもてる.一方で,Validation系のイベントが整備されてくると,サードパーティ製コントロールの優位性がひとつ脅かされてきたようにも思える.


コンポーネント作成の新機能(データアクセス系以外)

 Visual Basic 6.0の目玉はなんといってもADO/OLE DBベースのコンポーネントを作ることができることだ.しかし,それ以外の部分でもコンポーネント作成のための強化点がある.

■ウィンドウレスユーザー コントロール
Pro Ent


 リソースの消費量を低減できるウィンドウレスのユーザーコントロールを作成できる.これは単純にWindowlessプロパティを真(True)にすればよい.

■クラスの持続性
Lrn Pro Ent


 クラスのプロパティは,通常は初期化時に初期値に設定される.しかし,特定の時点での情報を格納できた方が便利だ.たとえば,ActiveXコントロールではデザイン時のプロパティを初期値とすることができる.このような持続性を持たせ,プロパティの内容を格納/取得のためにPropetyBagにパーシストすることができる.

■ClassIDと互換性の管理のサポート
Pro Ent


「プロジェクト互換」を設定すると,ActiveXコンポーネントの各バージョン間でクラスIDの一貫性を維持することができるようになった.Visual Basic 5.0では,いずれかのクラスがバイナリ互換でなくなると,プロジェクト内のすべてのクラスIDとインターフェイスIDが変更された.

■ユーザーコントロールの妥当性検査イベント
Pro Ent


 Validateイベントを作成しておくと,LostFocusイベントが発生する前に,コントロール中のデータについて妥当性の検査をすることができる.

■アパートメントモデルのスレッド
Pro Ent


 アパートメントモデルのスレッドを作成し,個々のスレッド上で非同期のプロシージャを実行するActiveXコンポーネントを作成できる.これは,Visual Basic 5.0 Service Pack 2以降の新機能である.

■FontChangedイベント
Lrn Pro Ent


 コンテナ側でフォント特性が変更されたときに,ActiveXコントロールに通知を送る.

■Microsoft Transaction Serverのサポート
Pro Ent


 Classに追加されたMTSTransactionModeプロパティを使い,Microsoft Transaction Serverと共に使用されるクラスのトランザクション機能を指定できる.

■HasDCプロパティ
Lrn Pro Ent


 ユーザーコントロールで共有hDCを必要に応じて使うのではなく,実行中ずっと固定されたhDCを割り当てるかどうかを決定する.これは,イベントの適用範囲の外から取得したhDCでAPIを呼び出すと,クラッシュや不具合が発生するため.
 ただし,HasDCプロパティは,ユーザーコントロールがウィンドウ付きで作成された場合に限り有効となる.したがって,Visual Basic 4.0やIE 3.xなどではこのプロパティは無視される.

■クラスビルダユーティリティの機能拡張
Pro Ent


 クラスを作成するためのクラスビルダユーティリティでは,引数リストにあるParamArray,Optional,ByVal,およびDefault値をサポートするほか,列挙型(Enum)もサポートした.


言語機能の新機能
全て
Lrn Pro Ent



 Visual Basic 6.0で強化された新機能とも言える比較的大きなトピックを紹介してきたが,細かい言語仕様などでも,優れた改良がなされている.

■データの妥当性検査の機能拡張
 CausesValidationプロパティをTrue(デフォルト)にすると,LostFocusイベントが発生する前に,Validateイベントが発生する.コントロールのフォーカス移動がされる前に,データの内容について妥当性を検査することができる.

■ValidateControlsメソッド
 フォームを終了する前に,フォームに配置された最後のコントロールの内容を妥当性検査する.

■コントロールの動的な追加
 コーディングで,フォームにコントロールを追加したり,フォームからコントロールを削除することができるようになった.もちろん,初期化時のライセンス情報やプロパティなども動的に設定してインスタンシングできる.

■CallByName関数
 プロパティやメソッドの名前を示す文字列を使って,そのプロパティまたはメソッドにアクセスできる.これは,コントロールの動的追加時に,設定に必要となるプロパティに“Left”といった文字列を使ってアクセスできるようにするためのものだ.もちろん,それ以外のときにも,文字列を使ってプロパティ名を実行時に指定することができる.

■LoadPictureの機能拡張
 サイズとカラーデプス(色数)を指定して読み込むことができるようになった.サムネイルなど大量の絵を表示するときにはリソースを使わず便利だ.

■パブリックメソッドのユーザー定義型
 パブリックプロパティおよびメソッドの引数や戻り値に,ユーザー定義型を使うことができる.すべてのプロジェクトのすべてのモジュールのどのプロシージャからも参照できるユーザー定義型を宣言するとき,Publicキーワードを指定することができる.

■関数の戻り値としての配列の使用
 Functionプロシージャ,Propertyプロシージャなどで,配列を返すことができる.

■可変サイズの配列の代入が可能
 左辺に可変サイズの配列を指定し,一行で配列全体を代入することができる.上記の関数の戻り値を一行で配列に代入することができるようになった.

■FileSystemObjectオブジェクト
 ファイルシステムの情報を得たり,アクセスしたりするほか,テキストファイルへのアクセスができるようになった.これはWSH(Windows Scripting Host)に含まれていたオブジェクトであり,詳細は先月号で紹介したのでご参照いただきたい.

■Dictionaryオブジェクト
 FileSystemObjectと同じモジュールに含まれているもので,連想配列を扱うためのオブジェクト.詳細は先月号をご参照いただきたい.

■CreateObject関数の機能拡張
 CreateObjectで,マシン名を省略可能な第二引数として指定できるようになった.APIのCoCreateInstanceExに対応したもの.DCOMなどの使用時に便利.

■StrConv関数の機能拡張
 LCID引数を指定し,システムのロケールIDと異なるロケールIDの文字列を指定できる.


新しい文字列関数
全て
Lrn Pro Ent



 次のような文字列操作をする関数が増えている.

■Filter関数
 元となる文字列配列中から,指定されたフィルタ条件に合致した要素だけの配列を返す.これも配列を一行で代入できるようになったことと組み合わせると強力だ.

■Replace関数
 指定された文字列を1対1対応に置換する.

■Split関数
 文字列を指定された1文字のデリミターでトークンの配列に切り出す.これも配列だ.

■Join関数
 Splitとは逆に,配列の各要素となる文字列を繋げてひとつの文字列にする.

■InstrRev関数
 文字列の最後から指定した文字列位置を得る.フルパス名からのファイル名部分だけの取得などに便利.

■StrReverse関数
 文字列を逆さまにする.

■Round関数
 指定した小数点位置で丸める.

■FormatCurrency関数
 コントロールパネルで設定されたCurrency型にフォーマットする.

■FormatNumber関数
 数値のフォーマットをする.

■FormatPercent関数
 パーセンテージのフォーマットする.

■FormatDateTime関数
 日付や時刻のフォーマットする.

■MonthName関数
 指定した月名を得る.

■WeekdayName関数
 曜日を得る.

 このように,配列を返す関数と,それを一行で代入できる仕組み,さらに配列から配列を取り出す関数,配列からひとつの文字列にしたり,その逆というように,配列を便利に使うための関数が増強されている.これらを組み合わせると,なかなか面白いことができそうである.


ウィザードの新機能

 最後に,新しいウィザードや機能強化について述べよう.

■セットアップウィザードの機能拡張
Lrn Pro Ent


 従来のセットアップウィザードは,ディストリビューションウィザードという名前に変更された.
 強化された機能としては,

■アプリケーションウィザードの機能拡張
Lrn Pro Ent


■Add-Inデザイナ
Pro Ent


 アドインの既定のロード機能,名前,ターゲットアプリケーションとそのバージョン番号,および必要に応じてほかのプロパティを指定するだけで,アドインの開発を開始できる.

■ツールバーウィザード
Lrn Pro Ent


 アプリケーションウィザードがロードされていれば,ツールバーコントロールをフォームに追加したときに,自動的にツールバーウィザードが開き,ツールバーのカスタマイズが容易にできる.


結論 Visual Basic6.0に乗り換えるべきか?

 Visual Basic 6.0には,確かに数多くの新機能や機能アップがある.しかし,実際に機能として本当に必要かといえば,そうでもないことも少なくない.
 できることが増えるのはよいことなのかということが気にかかってきたのだ.確かに,できることは増えているが,依然としてできないこともあるのだ.これが問題のひとつだ.
 まず,Visual Basicの構造を考えよう.

 Visual Basicは,そんなには細かい制御はできないが,比較的面倒ながらありがちな処理をカンタンにできることがメリットだ.つまり,それなりに高機能なアプリケーションを素早く手軽に作ることができるRADツールであった.
 では,できなかった細かい制御とは何だったのだろうか.Visual BasicやCOMオブジェクトはAPIをラップしている.乱暴に言ってしまえば,ラップしていないものができないことだ.Visual Basicの高機能化の先を考えると,いずれはAPIと同じだけのメソッドが用意されるということになる.これは一見便利なことだが,実はムダではないか.
 Visual Basicだけで何ができないのかは,何ができるかを知り,それ以外となる.しかし,Visual Basicからできることが増えるにつけ,何ができるのかわかりにくくなっており,何ができないかもわかりにくくなっている.
 これは,Visual Basicを深く使おうとすればするほど,スキルが要求されるようになるということだ.以前のようにできることが限られてあれば,それを克服するのはAPIかコントロールを買ってくるというカンタンな結論が出た.しかし,そうではなくなってきている.
 このようなオブジェクトやコントロールが増えること自体は,Windowsのすべての機能がVisual Basicから制御できるというところまで行かないと,結局は整理が面倒になっていくばかりだ.しかし,そうやってオブジェクトを増やしている間にも,Windowsはさらに高機能化している.これはいたちごっこなのだ.Visual Basicだけでなんでもできる日は,永遠にきそうにない.
 WWWまわりの強化は,IISとDHTMLへの対応が大きなところではあるが,私のように,UNIXベースで使いやすく,信頼性やセキュリティの高いWebアプリケーション作成システムを使っている人間にとっては,この程度ではまったく魅力は感じられない.まあ,WWWまわりのことは,この仕様から言っても,実はあまりパワーがかけられていないように思う.
 データアクセスやコンポーネントについては,確かに大幅な機能アップあるいは仕様変更がされている.だが,ほとんどの強化点はADO/OLE DBを前提としている.
 確かに,OLE DBにはユニバーサルデータアクセスという今までにないすばらしい考え方がある.しかも,Visual Basicでプロバイダまでもが作れてしまうことは,すばらしいことだ.しかし,何かをやるときにActiveXサーバーやコントロール,Implementsなどの事前処理をする必要があり,RADとしての手軽さを失いつつある.
 そもそも,本来はどんなデータソースとも,汎用にそしてカンタンにコネクトできるという方向だったハズだ.しかし,自前でコンポーネントをしようとすると,こんなに難しいことをしなくてはならないのでは,なかなか使いこなせないのではないだろうか.現に,Visual Basic 5.0の機能でさえ,なかなか使いこなせるものではないほど,言語仕様は巨大化している.
 多くのユーザーがターゲットとしているSQL系に限定するならば,結局のところ,SQLを投げてfetchするに尽きるのだ.そこにあまりにも高機能なフリをして,間に多くのレイヤーを必要とするミドルウェアが必要なのだろうか.そこまでやっても,結局はRDBMSごとに違う独自の高機能な部分は使えなかったりするのだ.それなら,RDBMSごとになるべくネイティブに接続できるものを使えばよいのではないだろうか.私には,高機能と汎用のバランスが崩れてきたように思える.
 言語仕様としては,細かい部分では便利なものも増えてはいるが,言語仕様としての素性がよくなったというものでもない.ワープロで言うならば,新しく罫線が引ける機能が増えたというのではなく,罫線は以前から引けたけれど,その種類が増えた程度である.だが,全体として私が一番面白く思ったのは,やはりこの部分であった.

 このように,私個人がVisual Basic 6.0をざっと使ってみた感想としては,今までのバージョンアップ時の感動にはおよばない.しかし,それはまだVisual Basic 6.0を本当に使い込んでいないからかもしれない.やはり,Visual Basic 6.0の新機能は,とくにDBまわりの機能は,今までにも増して膨大なのである.
 もちろん,乗り換えが必要な人もいるだろう.これは以前のバージョンが出たときと同じである.DLLの整合性やサポートOSのことを考えれば,乗り換えざるを得ないことが多いかもしれない.しかし,それは我々の望んでいたものだったのだろうか.MicrosoftのOLE DB戦略やCOM/DCOM戦略の都合ではないか…という気もしてくる.
 だが,考えてみれば,今までもそうだった.Microsoftは「次はこんな素晴らしい世界を作りますよ」と言うものの,実際にそのカケラが見え出すまで数年が必要で,現実的に使えるレベルまでには,さらに熟成が必要だった.だが,多少調子悪いことはあったにしても,それを次々と確実にカタチにしてきたのだ.そして,それらはいずれもオモシロイことがありそうなものだった.
 COMとOLE DBの熟成にはまだしばらくかかるのかもしれないが,実際にVisual Basic 6.0を使い込んでいけば,今のレベルでも十分にオモシロイものではないかという予感がしてきた.


VB Magazine ライブラリ | Visual Basic WorkGroup
int21 ホームページ | PCDN ホームページ


Copyright (c) 1998 PCDN All Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp