〜付属コントロール活用の定石を探る
福岡 寿和 FUKUOKA,Toshikazu 富士通SSL
Visual Basic プログラミングの醍醐味は,コントロールを組み合わせて,いかにコードの記述量を減らすかにあります.なぜなら,Visual Basicが簡単なのは,フォームにコントロールを貼るところまでであり,イベントに対応したプロシージャにコードを記述するのは,他の言語(Windows用,ホスト用を問わず)と同じように難しいものなのです.もしかしたら,メッセージベースOSであるWindowsのメッセージをVisual Basic自体が覆い隠しているために,C言語とWin32APIを使って作るよりもバグの修正などには時間がかかるかもしれません.
コード記述量を減らすためには,Windowsの仕様に合わせたプログラムにすることはもちろんですが,実現する機能にあったコントロールの選択能力もVisual Basicプログラマには必要な資質なのです.そして,コントロールを正しく使うことで始めて「Visual Basicは簡単だ」という通説が嘘ではなくなります.
| 付属コントロールが抱える問題 |
|---|
Visual Basic 5.0は,コマンドボタンやテキストボックスなどの標準コントロール(図1)以外にも,数多くのActive Xコントロールが添付されています(図2).
図1:標準コントロール

図2:付属コントロール

このコントロールは,それぞれのバージョン情報を表示すると分かるように,
図3:Crystal Reportsのバージョン情報

図4:MS Multimediaのバージョン情報

図5:MS Tabのバージョン情報

図6:MSFlexGridのバージョン情報

図7:Winsockのバージョン情報

の3種類の製品形態があり,添付コントロールを使うときには,このことを常に意識していなければなりません.というのも,OEM版のコントロールは,OEM元が正式に発売している製品の機能限定版であり,バージョンも古いことが多く既知の障害の修正も行なわれていないことがあるからです.つまり「こんな感じのコントロールを発売しているから,気に入ったら製品版を購入してね」という感じの,おまけコントロールなのです.
また,VB4.0まで付属していたSS系の3Dコントロールが,標準コントロールの機能拡張に伴なって添付されなくなるなど,上位互換性という面からも問題を抱えています.さらに,OSのバージョンアップにしたがって,新しいGUIに対応したActiveXコントロールを使うためには,開発ツールもバージョンアップをしてゆく必要があります(表1).
表1:OSとVisual Basicのバージョンの関係
|
OS |
Visual Basic |
|
Windows 3.1 |
Visual Basic 3.0 |
|
Windows 95 Windows NT 3.51 |
Visual Basic 4.0 |
|
Windows 95 + IE4.0 Windows NT 4.0 |
Visual Basic 5.0 |
|
Windows 98 Windows NT 5.0 |
Visual Basic 98 |
ちなみに,Visual Basic 2.0は,世界的に見れば,あまりのバグの多さに早々とVisual Basic 3.0に置き換わったバージョンなので,表からは削除しています.
このように問題の多い付属コントロールですが,使えるコントロールも含まれていますし,使い方さえ誤まらなければ十分実用に耐えるコントロールもあります.
今回は,私が実際のシステム開発に使ったことのあるコントロールを中心にして,その使い方を整理してゆきたいと思います.コントロールの中には,システム開発に使ったことのないものもあったので,本稿を執筆するにあたり,使ったことのないコントロールについても実際使ってみて,その結果を報告することも考えましたが,業務システムレベルの使用に耐え得るものかどうかは,やはりシステム開発の局面で使ってみないと判断がつけられないと思い,あえて「使用実績なし」と明記しました(表2).
表2:コントロールの使用可否
| コントロール名 | 形態 | 使用 | Lrn | Pro | Ent | 備考 |
| DBList | MS | 否 | ○ | ○ | ○ | 標準Listコントロールを使いコーディングで代替 |
| DBCombo | MS | 否 | ○ | ○ | ○ | 標準ComboBoxコントロールを使いコーディングで代替 |
| DBGrid | MS | 否 | ○ | ○ | ○ | 市販コントロールで代替 |
| CommonDialog | MS | 可 | ○ | ○ | ○ | SP2必須 |
| MSChart | OEM | 否 | ○ | ○ | 市販コントロールで代替 | |
| MSComm | MS | 否 | ○ | ○ | 市販コントロールで代替 | |
| MSRDC | MS | 否 | ○ | RDOによるコーディングを基本とする | ||
| Crystal Report | 他社 | 可 | ○ | ○ | 市販コントロールを推奨 | |
| SSTab | OEM | 否 | △ | ○ | ○ | Tab Stripを使用 |
| MSFlexGrid | OEM | 可 | ○ | ○ | ○ | SP2必須.市販コントロールを推奨 |
| Tab Strip | MS | 可 | △ | ○ | ○ | 同等機能を持つ市販コントロールを推奨 |
| Toolbar | MS | 可 | △ | ○ | ○ | SP2必須 |
| StatusBar | MS | 可 | △ | ○ | ○ | SP2必須 |
| ProgressBar | MS | 可 | △ | ○ | ○ | SP2必須 |
| TreeView | MS | 可 | △ | ○ | ○ | SP2必須 |
| ListView | MS | - | △ | ○ | ○ | 使用実績なし |
| ImageList | MS | 可 | △ | ○ | ○ | SP2必須 |
| Slider | MS | - | △ | ○ | ○ | 使用実績なし |
| Animation | MS | - | ○ | ○ | 使用実績なし | |
| UpDown | MS | - | ○ | ○ | 使用実績なし | |
| Internet Transfer | MS | 可 | ○ | ○ | SP3必須 | |
| RichTextBox | MS | - | ○ | ○ | 使用実績なし | |
| Winsock | OEM | 可 | ○ | ○ | SP2必須 | |
| MAPISession | MS | 可 | ○ | ○ | SP2必須 | |
| MAPIMessage | MS | 可 | ○ | ○ | SP2必須 | |
| MMControl | OEM | - | ○ | ○ | 使用実績なし | |
| PictureClip | MS | - | ○ | ○ | 使用実績なし | |
| SysInfo | MS | - | ○ | ○ | 使用実績なし | |
| MaskEdit | MS | 可 | ○ | ○ | SP2必須 |
注)○ :使用可能 △:BooksOnlineやウィザード用
|
付属コントロールの上手な活用方法 〜CommonDialog〜 |
|---|
[印刷]ダイアログ
CommonDialogコントロールは極めて素直なコントロールですが,ヘルプファイルの記述に難があり,その仕様を勘違いするときがあります.たとえば,Copiesプロパティの説明は「印刷部数を設定します.値の取得も可能です.Printerオブジェクトに使用する場合,デザイン時には使えません」とあります.しかし,Copiesプロパティに設定しただけでは,プリンタの部数は変化しません.このプロパティを含めて,CommonDialogコントロールのプロパティに値を設定するのは(当然といえば当然ですが),プリンタではなくCommonDialogコントロールで表示するダイアログボックスの初期表示値になり,ダイアログボックスを表示せずに,プリンタの設定を切り替えることには使えません.利用者が介在せずにプリンタの設定を変えたいときは,Win32APIを使うことになります(詳細は,本誌98年1月号の特集「Win32 APIによるプリンタ制御」を参考にしてください).コントロールを使うときとWin32 APIを使うときでは,かなり手間が異なるので,注意してください.
[ヘルプ]ダイアログ
メニューやボタンをクリックして,ヘルプファイルを表示するときは,CommonDialogコントロールのHelpCommandメソッドを指定してShowHelpメソッドを使います(リスト1).
ちなみに,このごろの[ヘルプ]メニューにはWebサイトヘジャンプするメニューがありますが,これは,ShellExecute-APIで実現することができます(リスト2).ShellExecute-APIは,ファイルの関連付け情報により,拡張子に対応したプログラムを起動します.今回はWeb Browserが起動されましたが,Word文書の表示やExcelシートの表示などにも利用できます.単にファイルを開くだけでよいのならば,ActiveX Serverとして他のEXEと連携するよりもよほど安定して独立したプログラムを作成できます.
リスト1:[ヘルプ]ダイアログの表示(frmHelpからの抜粋)
Private Sub mnuHlCatalog_Click()
'トピックの検索ダイアログを表示する
cdlgHelp.HelpFile = "c:\windows\windows.hlp"
cdlgHelp.HelpCommand = cdlHelpPartialKey
cdlgHelp.ShowHelp
End Sub
|
リスト2:WebSiteの表示(frmHelpからの抜粋)
Private Declare Function ShellExecute Lib "shell32" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Const SW_NORMAL = 1
Private Sub mnuHlWeb_Click()
Dim lngRet As Long
lngRet = ShellExecute(Me.hwnd, vbNullString, _
"http://www.fujitsu.co.jp/hypertext/ssl/", _
vbNullString, vbNullString, SW_NORMAL)
End Sub
|
[F1]キーでヘルプを表示するには
[F1]キーを押してその画面のヘルプを開きたいときには,CommonDialogコントロールを使う必要はありません.
と設定すれば,[F1]キーを押してその画面に対応したヘルプが表示できます. CommonDialogコントロールを使って,[F1]キーが押されたときに表示するヘルプコンテクストを指定することもできますが,それよりもフォームオブジェクトのHekpContextIDプロパティを使った方がよいでしょう.特に[F1]キーを押したときにヘルプを表示させたいためだけに,CommonDialogコントロールを使うのはリソース面からも無駄が多いといえるでしょう.
図8:[Edit Map Entry]ダイアログ

|
付属コントロールの上手な活用方法 〜Crystal Reports〜 |
|---|
レコードの選択を効率よく行なう
Crystal Reportsを使っているとCrystal Reportsデザイン画面でデータソースと実際に連携して帳票をデザインできるため,デザイン画面でレコードの選択を行なうときが多いようです.また,選択条件を変更するときもSelectionFormulaプロパティを変更していると思います.しかし,これらの方法では,連結したデータソースのレコードをすべて読み込んでそれから選択を行ないます(図9).
選択条件に合うレコードだけCrystal Reportsに読み込むには,データソースとしてクエリーを指定して,そのクエリーをプログラムから変更します(リスト3).このようにすれば,レコード件数の増加が印刷に与える影響を抑えることができます.
図9:CR1実行画面

リスト3:データソースの変更(frmCR1からの抜粋)
crwCR1.SelectionFormula = ""
'データソース側で選択
Set dbsLocal = Workspaces(0). _
OpenDatabase(CurDir$ & "\CR1.mdb", False, False)
dbsLocal.QueryDefs.Delete ("qry住所")
strSQL = "SELECT 県.県コード, 市.市コード, 県.県名, 市.市名 " & _
"FROM 県 INNER JOIN 市 ON 県.県コード = 市.県コード " & _
"WHERE 県.県コード='" & strItem & "'"
Set qdfNew = dbsLocal.CreateQueryDef("qry住所", strSQL)
dbsLocal.Close
|
レポート定義のちょっとした工夫
レポート定義とデータソースのパス位置
Crystal ReportsでデータソースとしてMDBを指定したとき,そのMDBのファイルの位置を絶対パスで登録します(図10).しかし,これでは開発環境と実行環境のディレクトリ構成が異なると上手く動作しなくなってしまいます.そこで,[ロケーションの設定]を[レポートと同一]にすることでディレクトリ構成に依存しない情報が設定できます(図11).
図10:ロケーションの設定(絶対パス)

図11:ロケーションの設定(同一)

図12:データを保存しない指定![]()
|
印刷内容を保証する
Crystal Reportsでは,レポートにデータを保存しておくことで変化しないデータの再印刷を高速に行なうことができます(図12).これは一見便利そうですが,このオプションを指定しているとデータソースの状態が悪かったときに保存してある内容が印刷されてしまい,障害に気がつかないことがあります.このオプションは使わない方がよいでしょう.
RDBMSのデータを効率よく印刷する
Crystal Reportsは,ODBCを使ってローカルファイルだけではなく,RDBMSのデータも気軽に印刷することができます.しかし,内部的にはDAOと同じような仕組みで動作しているため(Crystal Reports V6からはODBCを経由しないダイレクトアクセスもサポートしています),レコード件数が増加したときなどはRDBMSからのデータ取得に時間がかかるようです. そこで,
するのが良いでしょう(リスト4).
このとき注意しなければならないのは,テキストファイルをデータソースとしたときは,レポートと同一のディレクトリ上にデータソースがなければならない点です.
リスト4:中間ファイルI/F形式(frmCR2からの抜粋)
'(1)最適なミドルウェアを使ってレコードを抽出
Set dbsLocal = Workspaces(0).OpenDatabase(CurDir$ & "\CR1.mdb", False, False)
strSQL = "SELECT 県.県コード, 市.市コード, 県.県名, 市.市名 " & _
"FROM 県 INNER JOIN 市 ON 県.県コード = 市.県コード " & _
"WHERE 県.県コード='" & strItem & "'"
Set rdynLocal = dbsLocal.OpenRecordset(strSQL, dbOpenDynaset)
'(2)レコード抽出結果をテキストファイルに出力
Do While Not rdynLocal.EOF
Write #intFno, rdynLocal(0), rdynLocal(1), rdynLocal(2), rdynLocal(3)
rdynLocal.MoveNext
Loop
rdynLocal.Close
Set rdynLocal = Nothing
dbsLocal.Close
Set dbsLocal = Nothing
Close #intFno
'(3)出力ファイルをデータソースとして印刷
strItem = lstCR2.Text
crwCR2.Formulas(0) = "title='" & Mid$(strItem, InStr(strItem, _
vbTab) + 1) & "一覧表'"
crwCR2.ReportFileName = "CR2.rpt"
crwCR2.DataFiles(0) = strDataSrc
Select Case Index
Case 0
crwCR2.Destination = crptToWindow
Case 1
crwCR2.Destination = crptToPrinter
End Select
crwCR2.PrintReport
|
|
付属コントロールの上手な活用方法 〜MSFlexGrid〜 |
|---|
画面のちらつきを防止する
MSFlexGridはプロパティが変更されると再描画が行なわれます.そのため,プロパティの変更を連続して行なうと画面がちらついてしまいます.画面のちらつきを防止するためには,ReDrawプロパティをFalseにしてからその他のプロパティを変更して,最後にReDrawプロパティをTrueに戻します(リスト5・図13).
リスト5:MSFlexサンプル(frmMSFlex抜粋)
Private Sub cmdSearch_Click()
Dim strItem As String
Dim strSQL As String
On Error GoTo errClick:
'ReDrawプロパティの設定
If chkReDraw.Value = 0 Then
mfgArea.Redraw = False
End If
'レコードソースの変更
If cboKey.ListIndex = 0 Then
dbcLocal.RecordSource = "qry住所"
Else
strItem = cboKey.Text
strItem = Left$(strItem, InStr(strItem, ":") - 1)
strSQL = "SELECT * FROM qry住所 WHERE 県コード='" & strItem & "'"
dbcLocal.RecordSource = strSQL
End If
dbcLocal.Refresh
exitClick:
On Error Resume Next
mfgArea.Redraw = True
Exit Sub
errClick:
MsgBox "frmMSFlex/cmdSearch_Click:" & Error$, vbOKOnly + vbExclamation
Resume exitClick:
End Sub
|
図13:データを保存しない指定

入力を行なう
テキストボックスと組み合わせることで入力を行なうこともできますが,更新系のグリットが必要なときは,市販ActiveXコントロールを購入した方がよいでしょう.
|
付属コントロールの上手な活用方法 〜Tab Strip〜 |
|---|
TabStripコントロールは,SSTabコントロールと異なりコンテナではありません.そのため,タブをクリックしたときに,そのタブに表示したい情報だけを画面上に表示するようにプログラムする必要があります.
そのためには,まずタブごとに対応したFrameコントロール配列を用意して,
とプログラムします(リスト6・図14).ここでのポイントは,最前面表示していないFrameコントロールを使用不可にしておくことです.使用不可にしないとタブキーで項目移動しているときに,最前面表示されているコントロール以外にフォーカスが移動してしまうからです.
リスト6:TabStripサンプル(frmTabStrip抜粋)
Private Sub Form_Load()
Dim iintLoop As Integer
'(1)配置と最前面表示
With tabSample
For iintLoop = 0 To tabSample.Tabs.Count - 1
fraTabStrip(iintLoop).Move .ClientLeft, .ClientTop, _
.ClientWidth, .ClientHeight
fraTabStrip(iintLoop).Enabled = False
Next
End With
fraTabStrip(0).Enabled = True
fraTabStrip(0).ZOrder 0
End Sub
Private Sub tabSample_BeforeClick(Cancel As Integer)
'(2)フレームの無効化
fraTabStrip(tabSample.SelectedItem.Index - 1).Enabled = False
End Sub
Private Sub tabSample_Click()
'(3)選択タグのフレームの有効化
fraTabStrip(tabSample.SelectedItem.Index - 1).Enabled = True
fraTabStrip(tabSample.SelectedItem.Index - 1).ZOrder 0
End Sub
|
図14:TabStripサンプル画面

|
付属コントロールの上手な活用方法 〜Toolbar〜 |
|---|
ToolBarコントロールは,ImageListコントロールとペアで使って,はじめて意味のあるコントロールです.なぜなら,ToolBarコントロールのボタンに表示するイメージは,ImageListコントロールに割り当てたBMPまたはアイコンファイルのイメージになるからです.
ですから,まずは,ImageListコントロールにイメージを登録しなければなりません.図15はImageListコントロールにBMPフィイルを取り込んだ例です.このとき,イメージには左から順番に1, 2, 3と番号が振られます.
図15:TabStripサンプル画面

次に,ToolBarコントロールのプロパティページの[イメージリスト]にImageListコントロールを指定します.そして,各ボタンの[イメージ]プロパティにImageListコントロールのイメージ番号を指定します. このとき,プログラムから使いやすいように[キー]として別名を割り当てておきます.別名があれば,
のように位置ではなく名前で指定することができて便利です.
また,ToolBarコントロールには,ConboBoxコントロールやTextBoxコントロールを配置することもできます.そのためには,ButtonオブジェクトをPlaceHolderスタイルにして,その位置にComboBoxコントロールを配置します(図16・リスト7).
図16:TabStripサンプル画面

リスト7:ToolBarサンプル(frmToolBar抜粋)
Private Sub Form_Load()
'コンボボックスを設定
With tbrSample.Buttons("cboFontName")
.Width = cboFontName.Width
cboFontName.Move .Left, .Top, .Width
End With
cboFontName.ListIndex = 0
With tbrSample.Buttons("cboFontSize")
.Width = cboFontSize.Width
cboFontSize.Move .Left, .Top, .Width
End With
cboFontSize.ListIndex = 0
End Sub
|
|
付属コントロールの上手な活用方法 〜ProgressBar〜 |
|---|
ProgressBarコントロールは,コントロールの使い方自体は簡単ですが,「長時間処理」に絡んで使われるので,その部分で若干考慮しなければならないポイントがあります.
正しく表示する
長時間処理を行なっているとフォームの再描画などが行なわれず,他のWindowが重なったあとは,フォームが白くなってしまうことがあります.この現象を防止するためには,ループの中に,
を入れる必要があります(リスト8).
リスト8:ProgressBarサンプル(frmPBar抜粋)
Private Sub cmdOK_Click()
Dim ilngLoop As Long
Dim ilngTimer As Long
pbrSample.Value = pbrSample.Min
If IsNumeric(txtValue) Then
pbrSample.Max = CLng(txtValue)
For ilngLoop = 0 To pbrSample.Max
pbrSample.Value = ilngLoop
If chkRefresh.Value = 1 Then
Me.Refresh
End If
For ilngTimer = 0 To pbrSample.Max
Next
Next
End If
End Sub
|
長時間処理のキャンセルをサポートする
さらに使い勝手がよいプログラムにするためには,途中キャンセル機能をもたせる必要があるでしょう.キャンセル機能をもたせるには,
ようにプログラムする必要があります(リスト9).
リスト9:長時間処理の途中キャンセル(frmPbar2抜粋)
Option Explicit
Private mblnCancel As Boolean
Private mblnUnload As Boolean
Private Sub cmdCancel_Click()
'途中キャンセル依頼
mblnCancel = True
End Sub
Private Sub cmdOK_Click()
Dim ilngLoop As Long
Dim ilngTimer As Long
'二重にイベントが発生しないようにボタンを使用不可にする
cmdOK.Enabled = False
'長時間処理
pbrSample.Value = pbrSample.Min
If IsNumeric(txtValue) Then
pbrSample.Max = CLng(txtValue)
For ilngLoop = 0 To pbrSample.Max
pbrSample.Value = ilngLoop
If chkRefresh.Value = 1 Then
Me.Refresh
End If
For ilngTimer = 0 To pbrSample.Max
Next
'途中キャンセルの判定
DoEvents
If mblnCancel Then
Exit For
End If
Next
End If
'ボタンを使用可能に戻す
cmdOK.Enabled = True
If mblnUnload Then
Unload Me
End If
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Not cmdOK.Enabled Then
If MsgBox("処理を中断しますか。", _
vbYesNo + vbExclamation + vbDefaultButton2, _
App.Title) = vbYes Then
'長時間処理中の時はフォームを閉じさせない
mblnCancel = True
mblnUnload = True
End If
Cancel = True
End If
End Sub
|
|
付属コントロールの上手な活用方法 〜TreeView〜 |
|---|
TreeViewコントロールも,ImageListコントロールとペアで使うことの多いコントロールです.ImageListコントロールに割り当てたイメージをノードのイメージとして表示することができます.
ImageListコントロールに割り当てたイメージを使うときは,TreeViewコントロールのプロパティページの[イメージリスト]にImageListコントロールを指定します.そして,
のようにノードに割り当てるイメージ番号を指定すると該当のイメージをノードのイメージとして表示することができます.
TreeViewコントロールでデータを表示するときは,一度にデータを取得せずに,ノードがクリックされた単位で,データを取得するようにします(リスト10).このようにプログラムすれば,データ件数が増加しても画面が使えるようになるまでの時間があまり変化しないで,操作性の劣化を防止できます.
リスト10:ノードクリック時のデータ取得(frmTreeViewサンプル)
Private Sub tvwSample_NodeClick(ByVal Node As ComctlLib.Node)
Dim rdynlocal As Recordset 'ローカルテーブルポインタ
Dim strCode As String '子コード
Dim strSQL As String 'SQL文
Dim nodAddr As Node 'ツリービューのノード
Dim strAddrCode As String
On Error GoTo errClick:
strAddrCode = Mid$(Node.Key, 2)
If Node.Children = 0 Then
If Len(strAddrCode) = 2 Then
'市コード展開
Set rdynlocal = mdbsLocal.OpenRecordset("SELECT 市コード, _
市名 FROM 市 WHERE 県コード='" & _
strAddrCode & "' ORDER BY 市コード", _
dbOpenDynaset, dbForwardOnly + dbReadOnly)
If Not rdynlocal.EOF Then
Do While Not rdynlocal.EOF
strCode = strAddrCode & CStr(rdynlocal("市コード"))
Set nodAddr = tvwSample.Nodes.Add("K" & _
strAddrCode, tvwChild, "K" & _
strCode, strCode & ":" & _
CStr(rdynlocal("市名")), 1)
rdynlocal.MoveNext
Set nodAddr = Nothing
Loop
End If
rdynlocal.Close
End If
End If
exitClick:
On Error Resume Next
rdynlocal.Close
Node.Selected = True
Exit Sub
errClick:
MsgBox "frmTreeView/tvwSample_NodeClick:" & _
Error$, vbOKOnly + vbCritical, App.Title
Resume exitClick:
Resume Next
End Sub
|
|
DBxxx系の代替方法 〜標準コントロールの有効利用法〜 |
|---|
一覧の生成
DBxxx系のコントロールを使わずにRDBMSやMDBなどのデータソースの内容を一覧表示するには,データソースからデータを取得して,ListコントロールやConboBoxコントロールに対してAddItemメソッドで追加するようにプログラムします(リスト11).これは,一見,データソースの中身が変化したときにそれが反映されないという弱点があるように思えます.しかし,この弱点は致命的なものではありません.なぜなら,コントロールを正しく使うという観点からすれば,ListやComboBoxで一覧を表示したいと思うのはマスタデータであり,データが変化するタイミングはある程度限定できるはずです.その限定したタイミングでデータの再取得をすればよいのです.
リスト11:ListBoxにデータソースからのデータを設定する処理
Dim rdynLocal As Recordset
Dim dbsLocal As Database
Set dbsLocal = Workspaces(0).OpenDatabase(CurDir$ & _
"\CR1.mdb", False, True)
Set rdynLocal = dbsLocal.OpenRecordset( _
"SELECT * FROM 県 ORDER BY 県コード", dbOpenDynaset)
Do While Not rdynLocal.EOF
lstCR2.AddItem rdynLocal("県コード") & vbTab & rdynLocal("県名")
rdynLocal.MoveNext
Loop
lstCR2.ListIndex = 0
|
選択値の設定
DBxx系コントロールのよいところは,画面に表示する値と選択されたときにデータソースに設定する値が違うフィールドの値にできる点です.たとえば,ComboBoxコントロールには県名を表示して,実際にデータソースに設定するのは,対応した県コードにすることができます.
この仕様を標準コントロールで実現するのは,比較的簡単です.要はComboBoxコントロールに設定する値に,データソースに設定する値を含んでしまえばよいわけです.たとえば,
と設定する代わりに
と設定すれば,
でデータソースへの設定値が取得できます.
値の選択
しかし,問題点もあります.選択した値を取得するのはいいのですが,CobmoBoxコントロールのStyleプロパティを2として一覧に登録されている値以外を入力できないようにしたときに,データソースの値をCobnoBoxコントロール上で選択することできません.この問題を回避するには,Win32 APIを使います.
リスト12のpsubCmbSelectにComboBoxコントロールと値を渡すと,該当する項目が選択されてきます.
リスト12:コンボボックスからの項目検索
Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Public Sub psubCboSelect(robjCbo As Object, _
rstrItem As String)
Dim lngRet As Long
lngRet = SendMessage(robjCbo.hWnd, &H14D&, _
CLng(-1), ByVal rstrItem)
End Sub
|
| 最後に |
|---|
付属ActiveXコントロールのOEM版の発売元はあくまでもUSAでの発売元なので,私たち日本の開発者は,会社名やコントロールの名前を頼りに日本語版の発売元を探すことになります.
しかし,そのような手間をかけても製品版を探すだけの価値はあります.製品版には,Visual Basic 5.0に添付されてくるものよりも詳しい説明が載った説明書やサンプルプログラムが付属しているなどの特典もあります.また,機能も豊富で障害も少ないようです.ですから,気に入ったコントロールが添付されていたら,ぜひその製品版を入手して本来の機能と性能を堪能してください.そして,それから,個々の開発システムで,OEM版でこと足りるのか製品版が必要なのかを判断してください.そうすれば「こんな機能は絶対ついているはずだろう」という誤解から,開発中に「しまった製品版が必要な仕様にしてしまった」ということが防げると思います.
動作確認環境
Windows95 4.00.950B + IE4.0 4.71.1712.6
Visual Basic 5.0 (SP3)