Visual Basic 初級講座 [改訂版]
VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第8回 練習 クラスの呼び出し

2020/3/28

この記事が対象とする製品・バージョン

VB2019 Visual Basic 2019 対象です。
VB2017 Visual Basic 2017 対象です。
VB2015 Visual Basic 2015 対象です。
VB2013 Visual Basic 2013 対象です。
VB2012 Visual Basic 2012 対象です。
VB2010 Visual Basic 2010 おおむね対象ですが、練習問題4は対象外です。
VB2008 Visual Basic 2008 おおむね対象ですが、練習問題4は対象外です。
VB2005 Visual Basic 2005 おおむね対象ですが、練習問題4と練習問題6は対象外です。
VB.NET 2003 Visual Basic.NET 2003 対象外ですがほとんどの説明があてはまるので参考になります。
VB.NET 2002 Visual Basic.NET (2002) 対象外ですがほとんどの説明があてはまるので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

 

目次

 

 

説明

今回は第6回 クラスの使い方、第7回 クラスを使う仕組み で説明した内容を理解するため練習です。

Windowsフォームアプリケーション(.NET Framework)でアプリケーションを作成して、練習問題で出題しているプログラムを作ってください。

Microsoft Docsのリファレンスを見るのはOKです。

見るべきリファレンスは問題の中にリンクを示します。

リファレンス内のリンクをクリックして別のページに飛ぶのはOKです。

それ以外はGoogle検索等しないでください。

 

練習1.なつかしの数学を!Math.Pow

問題

MathクラスのPowメソッドは、累乗(累乗)を計算する機能です。

累乗とは同じ数字を何個かけ算するかを表しています。たとえば、2を3個かけ算すると答えは8です。これを「2の3乗は8」と表現し、2の右上に小さい3を書いて表現します。

2×2×2=8

xのy乗

 

x の y乗 とは、x を y個かけ算するという意味で、3 の 2乗 は 9、 1 の 12乗 は 1 です。

 

それでは、MathクラスのPowメソッドを使って、6の7乗を計算するプログラムを書いてください。

詳しい説明は下記のリファレンスを参照してください。

https://docs.microsoft.com/ja-jp/dotnet/api/system.math.pow?view=netframework-4.8

 

解答と解説

解答を解説を見るには、下にスクロールしてください。

 

 

 

 

 

 

 

 

 

解答例

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim answer As Double = Math.Pow(5, 7)
MsgBox(answer)

解説

簡単な共有メソッドの呼び出しです。

Math.Powのリファレンスを見ると、Pow には Shared がついているので、これは共有メソッドです。

共有メソッドなので クラス名.メソッド名 の形で呼び出せます。

名前空間は System なのでデフォルトで省略可能です。アセンブリ mscorlib.dll もデフォルトで参照されているので参照設定を行う必要もありません。

戻り値はDoubleなので、Double型の変数で戻り値を受け取ります。

VB2008以上であれば型推論が利用できるので、解答例から As Double を消しても answer は Double型になります。

 

練習2.東京タワーを1文字で StringInfo.LengthInTextElements

問題

StringInfoクラスのLengthInTextElementsプロパティ(読み方:StringInfo = ストリングインフォ、LengthInTextElements = レンクスインテキストエレメンツ)は文字列に含まれる文字の数を表します。

似た機能にStringクラスのLengthプロパティ(読み方:Length = レンクス)や、StringsモジュールのLenメソッド(読み方:Len = レン)がありますが、絵文字や難しい文字(Unicodeの第2面以降の文字)を正しく数えることができません。

たとえば、東京タワーを表す絵文字 🗼 は、1文字なのに2文字と数えてしまいます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim tokyoTower As String = "🗼に行きたい!" '7文字
Dim length As Integer = tokyoTower.Length
MsgBox(length) '8 と表示される。

 

StringInfoクラスのLengthInTextElementsプロパティは絵文字や難しい文字が含まれていても正確な文字数を表します。

これを使って上記の例を修正し、7 が表示されるようにしてください。

 

StringInfoクラスの詳しい説明は下記のリファレンスを参照してください。

https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.stringinfo?view=netframework-4.8

LengthInTextElementsプロパティのリファレンスはここのプロパティ欄内にあるリンクをクリックして表示できます。

 

解答と解説

解答を解説を見るには、下にスクロールしてください。

 

 

 

 

 

 

 

 

 

解答例

 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim tokyoTower As String = "🗼に行きたい!"
Dim info As New Globalization.StringInfo(tokyoTower)
Dim length As Integer = info.LengthInTextElements
MsgBox(length)

解説

非共有プロパティの呼び出しです。

LengthInTextElementsプロパティはSharedが定義されていないので、非共有メソッドです。

つまり、インスタンスを作成して、インスタンスからこのプロパティにアクセスする必要があります。

インスタンスを作成するにはコンストラクターを呼び出します。

StringInfoクラスには2つのコンストラクターが用意されており、2つ目のコンストラクターを使うと文字列 「🗼に行きたい!」 を指定できるので簡単です。

コンストラクターを呼び出してインスタンスを受け取るには Newを使います。

名前空間Globalizationは既定では省略できないので、名前空間から書くか、Importsで省略可能にするか、プロジェクトのプロパティでインポートして省略可能にするかする必要があります。1回呼び出すだけなので名前空間を書くのが楽です。「System」だけは省略できます。

アセンブリ mscorlib.dll は既定で参照しているので参照設定を追加等する必要はありません。

 

なお、1つ目のコンストラクターでインスタンスを作成した場合、対象の文字列を指定するには、Stringプロパティを使用します。

これを使って下記のようにプログラムしてもOKです。

 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim tokyoTower As String = "🗼に行きたい!"
Dim info As New Globalization.StringInfo
info.String = tokyoTower
Dim length As Integer = info.LengthInTextElements
MsgBox(length)

 

練習3.ユーザーに聞いてみよう Interaction.InputBox

問題

InteractionモジュールのInputBoxメソッド (読み方:Interaction = インタラクション、InputBox = インプットボックス)は、ユーザーに文字を入力するためのダイアログ(子画面)を表示し、ユーザーが入力した文字を返す機能です。

このメソッドを使ってユーザーに好きな食べ物を質問してください。そして、ユーザーが入力した内容を表示してください。

ユーザーはキャンセルしないで必ず何か入力してOKをクリックするものとします。

 

このメソッドはリファレンスを見るよりも、Visual Studioに表示されるヒントを見たほうがわかりやすいかもしれません。

リファレンスはこちらです。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.interaction.inputbox?view=netframework-4.8

 

解答と解説

解答を解説を見るには、下にスクロールしてください。

 

 

 

 

 

 

 

 

 

解答例

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim value As String = InputBox("好きな食べ物はなんですか?")
MsgBox("あなたの好物は" & value & "ですね。")

解説

InputBoxはモジュールのメンバーなので、クラス名(モジュール名)であるInteractionを省略していきなり呼び出すことができます。

InputBoxには5つの引数がありますが、第1引数以外は省略可能なので、簡単に呼び出すには引数を1つ渡すだけです。

 

なお、キャンセルボタンが押された場合、戻り値は空の文字列になります。

 

 

練習4.簡単ZIP圧縮 ZipFile.CreateFromDirectory

問題

ZipFileクラスのCreateFromDirectoryメソッド (読み方:ZipFile = ジップファイル、CreateFromDirectory = クリエイトフロムディレクトリー)は、フォルダーを圧縮したzipファイルを作成する便利なメソッドです。

このメソッドを使って、zipファイルを作ってください。

説明を簡単にするために圧縮するフォルダーとzipファイル名は次のようにします。(変更してもかまいません。)

圧縮するフォルダー: C:\temp\ziptest

zipファイル: C:\temp\myzip.zip

フォルダーには何かファイルを最低1つは入れて置いてください。処理に時間がかかるのを避けるために大きなサイズのファイルは配置しないほうがよいです。

 

ZipFileクラスは比較的新しいクラスなのでVisual Studio 2012以上が必要です。

 

このメソッドのリファレンスはここです。

https://docs.microsoft.com/ja-jp/dotnet/api/system.io.compression.zipfile.createfromdirectory?view=netframework-4.8#System_IO_Compression_ZipFile_CreateFromDirectory_System_String_System_String_

 

解答と解説

解答を解説を見るには、下にスクロールしてください。

 

 

 

 

 

 

 

 

 

解答例

 VB2012 VB2013 VB2015 VB2017 VB2019


IO.Compression.ZipFile.CreateFromDirectory("C:\temp\ziptest", "C:\temp\myzip.zip")

 

解説

ZipFileクラスのアセンブリはデフォルトでは参照されていないので参照設定に追加する必要があります。

Microsoft Docsのリファレンスのアセンブリ欄には3つのアセンブリ(dll)が表示されています。Windowsフォームアプリケーション(.NET Framework)の場合、この中から System.IO.Compression.FileSystem.dll を参照設定します。

なお、3つのうちどのアセンブリを参照すればよいかわからない場合は、参照マネージャの中を1つずつ探します。参照マネージャにはSystem.IO.Compression.ZipFileは存在せず、System.IO.Compression.FileSystemは存在するのでこちらを参照することになります。(見分けるコツとしてアセンブリ名にクラス名まで含まれている場合は.NET Frameworkではなく、.NET Coreの場合が多いはずです。)

CreateFromDirectoryメソッドには3つのオーバーロードがありますが、一番上のオーバーロードが引数も少なくシンプルで使いやすそうです。

このメソッドはSharedで定義されているためクラス名.メソッド名 の形で呼び出せます。

名前空間 System.IO.Compressionは既定では省略できません。ただし「System」は省略できます。

 

練習5.色選択 ColorDialog

問題

ColorDialogクラス (読み方:ColorDialog = カラーダイアログ)を使うとユーザーに色を選択させることができます。これを使ってユーザーが選択した色をフォームの背景色に設定しましょう。

ユーザーに色を選択させるには ColorDialogクラスの ShowDialogメソッド (読み方:ShowDialog = ショウダイアログ)を使用します。

ユーザーが選択した色を取得するには ColorDialogクラスの Color プロパティ (読み方:Color = カラー)を使用します。

フォームの背景色を設定するにはフォームの BackColorプロパティ (読み方:BackColor = バックカラー)を使用します。

フォームのプログラムではキーワード Me を使ってフォームのインスタンスにアクセスできます。

これだけ情報があれば、リファレンスを見なくてもできそうです

なお、ユーザーはキャンセルをせず必ず色を選択するものとします。

 

リファレンス

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.colordialog?view=netframework-4.8

 

解答と解説

解答を解説を見るには、下にスクロールしてください。

 

 

 

 

 

 

 

 

 

解答例

 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim dialog As New ColorDialog
dialog.ShowDialog()
Me.BackColor = dialog.Color

解説

ShowDialogメソッドは、非共有メンバーなのでNewを使ってColorDialogクラスのインスタンスを作成する必要があります。

ColorDialogクラスのコンストラクターには引数がないので簡単にインスタンスを作成できます。

同じくShowDialogメソッドも引数はないので簡単に呼び出せます。

この問題は1個1個のメソッド・プロパティの使い方は簡単ですが、組み合わせて使えるかというところがポイントです。

 

 

練習6.pngはいくつあるか? DirectoryInfo.GetFiles

問題

DirectoryInfoクラスのGetFilesメソッド(読み方:DirectoryInfo = ディレクトリーインフォ、GetFiles = ゲットファイルズ)は、フォルダーの中からファイルを検索するメソッドです。

このメソッドを使って、マイピクチャーフォルダーの中に入っている拡張子が png であるファイルの数を数える下記のプログラムを完成させてください。

 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'マイピクチャーフォルダーのパスを取得します。たとえば、C:\Users\rucio\Pictures です。
Dim myPictureFolderPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)

'子フォルダーも含め拡張子がpngのファイルをすべて取得します。

'★この部分にプログラムを追加して機能を完成させてください。

'結果を表示します。
MsgBox(result.Count & "個見つけました!")

ただし、GetFilesメソッドの戻り値は、まだ初級講座では説明していない「配列」というものです。

そのため型推論を使って、戻り値を取得してください。戻り値の配列の Count プロパティを使うと数を取得することができます。

※型推論はVB2008から導入された機能なので、VB2005では使用できません。

GetFilesメソッドのsearchPattern引数に "*.png" を指定すると、「拡張子が png のファイル」という意味になります。

 

リファレンス

https://docs.microsoft.com/ja-jp/dotnet/api/system.io.directoryinfo.getfiles?view=netframework-4.8

なんということでしょう!VBのリファレンスが存在しないようです。C#のリファレンスが表示されます。こういうときはVisual Studioのヒントを積極的に活用しましょう。

(以前はVBのリファレンスがあったと思うのですが、度重なるサイトの改変の中でどこかにいってしまったのでしょうか・・・)

 

解答と解説

解答を解説を見るには、下にスクロールしてください。

 

 

 

 

 

 

 

 

 

解答

 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'マイピクチャーフォルダーのパスを取得します。たとえば、C:\Users\rucio\Pictures です。
Dim myPictureFolderPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)

'子フォルダーも含め拡張子がpngのファイルをすべて取得します。
Dim info As New IO.DirectoryInfo(myPictureFolderPath)
Dim result = info.GetFiles("*.png", IO.SearchOption.AllDirectories)

'結果を表示します。
MsgBox(result.Count & "個見つけました!")

解説

GetFilesメソッドは非共有メソッドのため呼び出すにはインスタンスが必要です。

インスタンスを作成するにはコンストラクターを使用します。コンストラクターを呼び出すには New を使用します。

DirectoryInfoクラスのコンストラクターはフォルダー名を引数に取りますので、マイピクチャーフォルダーのパスを格納する変数 myPictureFolderPath を引数に渡します。

GetFilesメソッドには3つのオーバーロードがあります。

GetFilesメソッドの第1引数 searchPatternには、問題文に書いてあるように "*.png" を指定します。これで、拡張子がpngのファイルを検索できます。

第2引数を省略すると子フォルダーを探してくれないので今回は第2引数の指定が必須です。

第2引数は列挙体になっており、型は IO.SearchOption となっています。

 

第1引数の後ろのカンマを入力して、スペースを押すと入力候補が表示されます。

この中にIO.SearchOptionから始まるものが2つ含まれており、どちらかを指定すべきです。

キーボードの矢印キーの↑↓を使って、入力候補を移動するとそれぞれのヒントが見られます。

IO.SearchOption.AllDirectoriesの方は、ヒントに「現在のディレクトリとサブディレクトリ」と書いてあり、子フォルダーも検索してくれることがわかります。

 

GetFilesメソッドの戻り値は型推論で受け取るので、 As 型名 を省略します。

なお、型推論を使わない場合は次のように記述します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim
result As IO.FileInfo() = info.GetFiles("*.png", IO.SearchOption.AllDirectories)