Visual Basic 初級講座 [改訂版] |
Visual Basic 中学校 > 初級講座 [改訂版] >
2020/3/28
この記事が対象とする製品・バージョン
Visual Basic 2019 | ◎ | 対象です。 | |
Visual Basic 2017 | ◎ | 対象です。 | |
Visual Basic 2015 | ◎ | 対象です。 | |
Visual Basic 2013 | ◎ | 対象です。 | |
Visual Basic 2012 | ◎ | 対象です。 | |
Visual Basic 2010 | ○ | おおむね対象ですが、練習問題4は対象外です。 | |
Visual Basic 2008 | ○ | おおむね対象ですが、練習問題4は対象外です。 | |
Visual Basic 2005 | ○ | おおむね対象ですが、練習問題4と練習問題6は対象外です。 | |
Visual Basic.NET 2003 | △ | 対象外ですがほとんどの説明があてはまるので参考になります。 | |
Visual Basic.NET (2002) | △ | 対象外ですがほとんどの説明があてはまるので参考になります。 | |
Visual Basic 6.0 | × | 対象外です。 |
目次
今回は第6回 クラスの使い方、第7回 クラスを使う仕組み で説明した内容を理解するため練習です。
Windowsフォームアプリケーション(.NET Framework)でアプリケーションを作成して、練習問題で出題しているプログラムを作ってください。
Microsoft Docsのリファレンスを見るのはOKです。
見るべきリファレンスは問題の中にリンクを示します。
リファレンス内のリンクをクリックして別のページに飛ぶのはOKです。
それ以外はGoogle検索等しないでください。
MathクラスのPowメソッドは、累乗(累乗)を計算する機能です。
累乗とは同じ数字を何個かけ算するかを表しています。たとえば、2を3個かけ算すると答えは8です。これを「2の3乗は8」と表現し、2の右上に小さい3を書いて表現します。
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
解答を解説を見るには、下にスクロールしてください。
解答例
Dim answer
As Double =
Math.Pow(5, 7) MsgBox(answer) |
解説
簡単な共有メソッドの呼び出しです。
Math.Powのリファレンスを見ると、Pow には Shared がついているので、これは共有メソッドです。
共有メソッドなので クラス名.メソッド名 の形で呼び出せます。
名前空間は System なのでデフォルトで省略可能です。アセンブリ mscorlib.dll もデフォルトで参照されているので参照設定を行う必要もありません。
戻り値はDoubleなので、Double型の変数で戻り値を受け取ります。
VB2008以上であれば型推論が利用できるので、解答例から As Double を消しても answer は Double型になります。
StringInfoクラスのLengthInTextElementsプロパティ(読み方:StringInfo = ストリングインフォ、LengthInTextElements = レンクスインテキストエレメンツ)は文字列に含まれる文字の数を表します。
似た機能にStringクラスのLengthプロパティ(読み方:Length = レンクス)や、StringsモジュールのLenメソッド(読み方:Len = レン)がありますが、絵文字や難しい文字(Unicodeの第2面以降の文字)を正しく数えることができません。
たとえば、東京タワーを表す絵文字 🗼 は、1文字なのに2文字と数えてしまいます。
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プロパティのリファレンスはここのプロパティ欄内にあるリンクをクリックして表示できます。
解答を解説を見るには、下にスクロールしてください。
解答例
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です。
Dim tokyoTower
As String =
"🗼に行きたい!" Dim info As New Globalization.StringInfo info.String = tokyoTower Dim length As Integer = info.LengthInTextElements MsgBox(length) |
InteractionモジュールのInputBoxメソッド (読み方:Interaction = インタラクション、InputBox = インプットボックス)は、ユーザーに文字を入力するためのダイアログ(子画面)を表示し、ユーザーが入力した文字を返す機能です。
このメソッドを使ってユーザーに好きな食べ物を質問してください。そして、ユーザーが入力した内容を表示してください。
ユーザーはキャンセルしないで必ず何か入力してOKをクリックするものとします。
このメソッドはリファレンスを見るよりも、Visual Studioに表示されるヒントを見たほうがわかりやすいかもしれません。
リファレンスはこちらです。
解答を解説を見るには、下にスクロールしてください。
解答例
Dim value
As String = InputBox("好きな食べ物はなんですか?") MsgBox("あなたの好物は" & value & "ですね。") |
解説
InputBoxはモジュールのメンバーなので、クラス名(モジュール名)であるInteractionを省略していきなり呼び出すことができます。
InputBoxには5つの引数がありますが、第1引数以外は省略可能なので、簡単に呼び出すには引数を1つ渡すだけです。
なお、キャンセルボタンが押された場合、戻り値は空の文字列になります。
ZipFileクラスのCreateFromDirectoryメソッド (読み方:ZipFile = ジップファイル、CreateFromDirectory = クリエイトフロムディレクトリー)は、フォルダーを圧縮したzipファイルを作成する便利なメソッドです。
このメソッドを使って、zipファイルを作ってください。
説明を簡単にするために圧縮するフォルダーとzipファイル名は次のようにします。(変更してもかまいません。)
圧縮するフォルダー: C:\temp\ziptest
zipファイル: C:\temp\myzip.zip
フォルダーには何かファイルを最低1つは入れて置いてください。処理に時間がかかるのを避けるために大きなサイズのファイルは配置しないほうがよいです。
ZipFileクラスは比較的新しいクラスなのでVisual Studio 2012以上が必要です。
このメソッドのリファレンスはここです。
解答を解説を見るには、下にスクロールしてください。
解答例
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」は省略できます。
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
解答を解説を見るには、下にスクロールしてください。
解答例
Dim dialog
As New
ColorDialog dialog.ShowDialog() Me.BackColor = dialog.Color |
解説
ShowDialogメソッドは、非共有メンバーなのでNewを使ってColorDialogクラスのインスタンスを作成する必要があります。
ColorDialogクラスのコンストラクターには引数がないので簡単にインスタンスを作成できます。
同じくShowDialogメソッドも引数はないので簡単に呼び出せます。
この問題は1個1個のメソッド・プロパティの使い方は簡単ですが、組み合わせて使えるかというところがポイントです。
DirectoryInfoクラスのGetFilesメソッド(読み方:DirectoryInfo = ディレクトリーインフォ、GetFiles = ゲットファイルズ)は、フォルダーの中からファイルを検索するメソッドです。
このメソッドを使って、マイピクチャーフォルダーの中に入っている拡張子が png であるファイルの数を数える下記のプログラムを完成させてください。
'マイピクチャーフォルダーのパスを取得します。たとえば、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のリファレンスがあったと思うのですが、度重なるサイトの改変の中でどこかにいってしまったのでしょうか・・・)
解答を解説を見るには、下にスクロールしてください。
解答
'マイピクチャーフォルダーのパスを取得します。たとえば、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 型名 を省略します。
なお、型推論を使わない場合は次のように記述します。
Dim result As IO.FileInfo() = info.GetFiles("*.png", IO.SearchOption.AllDirectories) |