テキストエディタの 作成...

38
フォームのサイズを設定する メニューを作成する メニューにショートカットキーを設定する メニュー項目のオブジェクト名を変更する フォームにツールバーの領域を設定する タブコントロールを配置する テキストボックスを設定する メニューの処理を行うコードを記述する テキストボックスの編集機能を実装する テキストボックスの文字サイズを変更する 1 2 3 4 5 6 7 8 9 10 ここからアプリケーション としてのさまざまな機能を 実装していきます。まずは Windows アプリケーショ ンの土台となる「フォーム」 にあらためて注目し、この あとの章で実装する機能の 大枠となる「コントロール」 を配置します。そこに、テ キストボックスコントロー ルを1 つ設定するだけでテ キストエディタの基本機能 が実現できることが確認で きます。また、メニューを 作成し、編集操作などのコ マンドを実装します。 テキストエディタの 作成 3

Upload: others

Post on 13-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

フォームのサイズを設定する

メニューを作成する

メニューにショートカットキーを設定する

メニュー項目のオブジェクト名を変更する

フォームにツールバーの領域を設定する

タブコントロールを配置する

テキストボックスを設定する

メニューの処理を行うコードを記述する

テキストボックスの編集機能を実装する

テキストボックスの文字サイズを変更する

12345678910

第 章

ここからアプリケーション

としてのさまざまな機能を

実装していきます。まずは

Windowsアプリケーショ

ンの土台となる「フォーム」

にあらためて注目し、この

あとの章で実装する機能の

大枠となる「コントロール」

を配置します。そこに、テ

キストボックスコントロー

ルを1つ設定するだけでテ

キストエディタの基本機能

が実現できることが確認で

きます。また、メニューを

作成し、編集操作などのコ

マンドを実装します。

テキストエディタの作成 3

Page 2: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

はアプリケーションとしての外観を整えます。そして、テキストエディタの編集操作を行うためのメ

ニュー処理を作成します。テキストエディタとは、Windowsのメモ帳のような文字だけのデータを

編集するためのアプリケーションです。

●フォームのサイズ設定をプログラムで行う方法

●ツールバー、タブページ、テキストボックスをフォームに配置するためのDockプロパティの使い方

●テキストボックスをテキストエディタとして使うためのプロパティの設定

●アプリケーションにメニューを設定する方法

●メニューが選択されたときの処理

●アプリケーションを終了させる方法

●テキストボックスで行うクリップボードを使った編集処理

●メニュー項目を状況依存にする処理

●テキストボックスのフォントを設定する処理

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門70

メニューを追加して、タイマとテキストエディタに関係するコマンドを実装する

ツールバーの領域を追加する

タブコントロールを設定し、テキストエディタを作成する

テキストエディタでは、複数行で文字の入力と編集が行えるようにし、クリップボードを使った編集操作はメニューからも実行できる。また、テキストエディタの文字の大きさは、メニューから「大」、「標準」、「小」の3つのサイズで切り替えることができる

Page 3: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 71

フォームのサイズを設定する1フォームのサイズの変更…Sizeプロパティ

ヒント

プロパティを使ったサイズの設定

フォームやフォーム上に配置するオブジェクトは、プロパティウィンドウのSizeプロパティで、幅と高さの数値を「,」(カンマ)で区切って直接入力するか、Sizeプロパティの左側の[+]をクリックして、WidthプロパティとHeightプロパティにそれぞれ幅と高さを入力します。

qForm1フォームをフォームデザイナで開いて

いない場合は、ソリューションエクスプローラ

の[Form1.vb]アイコンをクリックして選択

し、[デザイナの表示]ボタンをクリックする。

●[Form1.vb[デザイン]]タブをクリックし

てもフォームデザイナを表示できる。

wフォームの右下隅をドラッグして適当な大きさ

に設定する。ここでは幅を464、高さを452に

設定する。数値で設定したい場合は、プロパテ

ィウィンドウのSizeプロパティに幅と高さを指

定する(ヒントを参照)。

ここで幅と高さを指定する

注意

OSによるフォームのサイズや位置について

ここではフォームのサイズを横464、縦452に設定しました。本書に付属CD-ROMにもこの設定でのプロジェクトを収録しています。しかし、Windows XPとWindows Vista、またはWindowsの画面設定によっては、Visual Studio 2008で読み込んだときに自動的に環境に合わせてサイズが変更されます。その場合は、変更されたサイズをフォームの基本サイズとしてください。なお、フォーム上のコントロールのサイズや位置などもOSの環境によって自動的に変更されます。

ここでは、ドラッグして大まかなサイズに変更し、Sizeプロパティを使ってフォームの大きさを調整します。

フォームのサイズは、フォームの周囲に表示されているハンドルをドラッグすることで任意の大きさに変

更することができます。また、Sizeプロパティを設定することで、数値による正確な設定も可能です。

Page 4: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門72

フォームの下限のサイズの設定…MinimumSizeプロパティ多くのWindowsアプリケーションは、実行しているときに自由にサイズが変更できます。ここで作成し

ているフォームも、FormBorderStyleプロパティが[Sizable]に設定されているためサイズの変更が可能で

す。ちなみに、このプロパティは第2章でダイアログボックスを設定するときには、サイズ変更ができない

ように設定しました。

サイズ変更が可能なフォームでは、その最小のサイズと最大のサイズを設定できます。ここでは、下限の

サイズを現在のフォームサイズに設定します。これによって、フォーム上のコントロールが切れて見えなく

なるようなことを防げます。

qフォームデザイナでForm1フォームをクリッ

クして選択する。

wプロパティウィンドウでMinimumSizeプロパ

ティの[+]をクリックする。ここで、幅と高

さをカンマで区切って直接入力してもよい。

eWidthプロパティとHeightプロパティに下限の

幅と高さを入力する。

●Width…464

●Height…452

コードを使ったフォームのサイズの設定フォームのサイズはフォームデザイナでフォームのプロパティとして入力していますが、コードにも記述

しておくことができます。設定がコードで確認できるとともに、フォームデザイナでうっかりサイズを変更

した場合の影響も受けません。

qフォームデザイナでForm1フォームをダブル

クリックする。

�コードエディタが表示され、第2章で記述し

たForm1_Loadイベントプロシージャにカー

ソルが移動する。

w以下のコードを記述する(色文字部分)。

Private Sub Form1_Load(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles MyBase.LoadMe.Width = 464Me.Height = 452Me.MinimumSize = New Size(464, 452)ToolStripProgressBar1.Visible = FalsespanTime = 1

End Sub

Page 5: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 73

サイズの指定について… Size構造体追加したコードについて、少し詳しく説明します。

まず、「Me.Width」と「Me.Height」は、Form1フォームのインスタンスである「Me」(つまり、実行時

のForm1フォーム)の幅と高さをそれぞれ表します。

一方、「Me.MinimumSize」のMinimumSizeプロパティは、幅と高さの値の組み合わせを表すSize型の値

をとります。そのため、「New Size(464,452)」のように、NewステートメントでSize構造体のインスタンス

を生成します。

不要なコードの削除ここでForm1_Loadプロシージャの別の箇所に注目します。ここには、タイマの時間を初期化するために

次のコードを記述しました。

spanTime = 1

しかしこれは、前の章でタイマの時間を設定するダイアログボックスを作成したことで不要になっていま

す。タイマ時間設定用のダイアログボックス([タイマ時間設定]ダイアログボックス)を開くと、このダ

イアログボックス側でこの値が60分に初期化されるためです。

したがって、Form1_Loadイベントプロシージャからこの1行を削除して、次のようにします。

Private Sub Form1_Load(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles MyBase.LoadMe.Width = 464Me.Height = 452Me.MinimumSize = New Size(464, 452)ToolStripProgressBar1.Visible = False

End Sub

ヒント

Newステートメントについて

クラスや構造体の変数に値を設定する場合、Newステートメントでその型のコンストラクタを使ってインスタンスを作成してから値を代入するようにします。

注意

付属CD-ROMでのサンプルファイルのサイズが本書の内容と異なる場合

71ページの注意でOSの環境によってフォームやコントロールの位置やサイズが変更されると解説しました。その場合は、ここで設定したコードでのフォームのサイズ設定や最小サイズの設定値を、自動的に変更されたサイズに合わせてください。また、フォームデザイナのプロパティウィンドウではフォームの最小サイズの設定値が自動的に変更されていますが、あらためて数値を入力しておきます。このようにしないとコードでのサイズ設定が反映されない場合があります。

Page 6: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門74

メニューを作成する2ここではメニューの外観(インターフェイス部分)だけを作成していきます。それぞれのメニューを選択

したときの動作は、あとで実装します。

メニューの配置…MenuStripコントロール

qフォームデザイナでツールボックスの[メニュ

ーとツールバー]のMenuStripコントロール

をクリックする。

wフォーム上をクリックする。

�コードエディタの下にコンポーネントトレイ

が表示され、「MenuStrip1」が追加される。

また、フォームにはメニューデザイナが表示

される。

メニュー項目の入力フォームに配置されたメニューは、選択された状態のときにはメニューデザイナとなります。メニューデ

ザイナでは、直接メニュー項目(メニューアイテム)を入力できます。

qメニューデザイナの[ここへ入力]をクリック

する。

wファイル(&F)と入力してgを押す。

�入力したメニューアイテムが設定される。な

お、アクセスキーの部分は半角で入力する

(ここでは「(&F)」)。

用語

アクセスキー

メニュー項目で「&F」のように&をアルファベットに付けて入力すると、その文字がアクセスキーになり下線付きで表示されます。実行したときaに続けてアクセスキーを押すことでそのメニューを選択できます。

21

メニューを作成するには、MenuStripコントロールを追加します。

Page 7: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 75

すべてのメニュー項目の設定同様の手順でそのほかのメニュー項目を設定します。次のメニューの構造をメニューデザイナで入力して

いきます。

メニュー項目の間にセパレータ(区切り)を設定したいときは、半角の「-」(マイナス)を入力します。

また、「...」は半角の「.」(ピリオド)を3つ入力します。

ファイル(&F)  新規(&N)  開く(&O)...  -  上書き保存(&S)  名前を付けて保存(&A)...  -  ページ設定(&U)...  印刷プレビュー(&V)...  印刷(&P)...  -  終了(&X)

編集(&E)  元に戻す(&U)  -  切り取り(&X)  コピー(&C)  貼り付け(&V)  -  すべて選択(&A)  -  検索(&F)...  置換(&R)...

オプション(&O)  文字の大きさ(&F) 標準(&N)

大(&B) 小(&S)

ヘルプ(&H)  目次(&C)...  バージョン情報(&A)...

ツール(&T)  タイマ時刻設定(&T)...

[オプション]メニューの[文字の大きさ]にはサブメニュー項目を設定しています。サブメニューは、

サブメニューを設定したいメニュー項目をクリックすると、右側にサブメニュー項目を入力するための[こ

こへ入力]のボックスが表示されます。

メニューデザイナでの操作メニューデザイナでは以下のような操作ができます。

●入力した文字の編集

項目をクリックするとその項目に枠が表示され、編集状態になります。そのまま文字を入力すると上書き

されます。もう一度クリックすると、カーソルが表示され、文字の入力とともにb(カーソル前の1文字を

削除)やd(カーソル位置の1文字削除)で文字列を編集することができます。

●メニュー項目の削除

削除したいメニュー項目をクリックしてdを押します。

●メニュー項目の順序の変更

位置を変更したいメニュー項目をドラッグして変更します。メニューバーのメニュー項目は左右にドラッ

グできます。ドロップダウンメニューの中のメニュー項目は上下にドラッグできます。

Page 8: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門76

メニューにショートカットキーを設定する3

メニュー項目にショートカットキーを設定すると、cと組み合わせたキー操作などでメニューを実行で

きます。

ショートカットキーの設定…ShortcutKeysプロパティ

qショートカットキーを設定したいメニュー項目

(ここでは[新規])をクリックして選択する。

wプロパティウィンドウのShortcutKeysプロパ

ティをクリックして、▼をクリックする。

e一覧から「修飾子」(ここでは[Ctrl]チェッ

クボックスをオン)を選択する。

r[キー]ボックスの▼をクリックし、割り当て

たいキー(ここではN)を選択する。

tgを押す。

�メニュー項目に設定したショートカットキー

が表示される。

ショートカットキーの作成ここでは、以下のメニュー項目についてショートカットキーを設定します。

メニュー項目のショートカットキーの設定は、ShortcutKeysプロパティで行います。

■[ファイル]メニュー

メニュー項目 ShortcutKeysプロパティ

新規 Ctrl+N

開く Ctrl+O

上書き保存 Ctrl+S

■[編集]メニュー

メニュー項目 ShortcutKeysプロパティ

切り取り Ctrl+X

コピー Ctrl+C

貼り付け Ctrl+V

すべて選択 Ctrl+A

検索 Ctrl+F

置換 Ctrl+Hヒント

ショートカットキーの削除

ショートカットキーを解除したいメニュー項目のShortcutKeysプロパティの内容を削除すると[None]になります。

Page 9: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 77

メニュー項目の文字列はNameプロパティで設定します。

メニュー項目のオブジェクト名を変更する4

メニューの処理は、それぞれのメニュー項目に対するClickイベントに対応します。そこで、メニュー項

目には、処理の内容がわかりやすく入力しやすい名前に変更しておくと便利です。

メニュー項目の設定…Nameプロパティ

qNameプロパティを変更したいメニュー項目を

クリックする。

wNameプロパティを設定したい名前に変更す

る。

�プロパティウィンドウのリストでは(Name)

と表示されている。2

上記の手順で、すべてのメニュー項目のNameプロパティを以下のように設定します。

ファイル mnuFile

新規 mnuFileNew

開く mnuFileOpen

上書き保存 mnuFileSave

名前を付けて保存 mnuFileSaveAs

ページ設定 mnuFilePageSetup

印刷プレビュー mnuFilePreview

印刷 mnuFilePrint

終了 mnuFileExit

編集 mnuEdit

元に戻す mnuEditUndo

切り取り mnuEditCut

コピー mnuEditCopy

貼り付け mnuEditPaste

すべて選択 mnuEditSelectAll

検索 mnuEditFind

置換 mnuEditReplace

ツール mnuTool

タイマ時刻設定 mnuToolTimer

オプション mnuOption

文字の大きさ mnuOptionFont

標準 mnuOptionFontNormal

大 mnuOptionFontBig

小 mnuOptionFontSmall

ヘルプ mnuHelp

目次 mnuHelpIndex

バージョン情報 mnuHelpAbout

Page 10: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門78

プログラムの実行と確認(サンプルフォルダ 03-04)

[標準]ツールバーの[デバッグ開始]ボタンをクリックして、プログラムを実行します。

設定したメニュー項目の操作ができることを確認しましょう。ただし、メニューの実際の処理は記述して

いないので、メニュー項目をクリックしても何も起こりません。

確認が終了したら、実行中のフォームの閉じるボタンをクリックします。

文字についての制限Visual Basicでは、オブジェクトや変数、プ

ロシージャの名前を付けるとき、次のような制

限があります。

●最初の文字は数字にしない。

●英字、アンダースコア(_)、数字が使える。

●既に予約や定義されている名前は使えない。

Visual Basicでは英字の大文字と小文字は区

別されません。定義したときの状態で大文字/

小文字の表示が記憶されますが、たとえば「a」

と「A」を別の変数にすることはできません。

実は、全角の文字や半角のカタカナなども使

うことができますが、通常は半角英数字などに

限定するのが一般的です。

名前付けの基準変数名やオブジェクト名の付け方は自由にで

きますが、基本的にプログラムが解読しやすい

ように、その変数やオブジェクトが何であるか

がわかるように付けます。

また、大文字/小文字の使い分けにはいくつ

か方式があります。たとえば本書ではプライベ

ートな変数は、「先頭を小文字で始めて、単語

の意味の区切りで先頭を大文字にする」という

方式で名前を付けています。また、パブリック

な変数は大文字で始めています。

そのほか、英単語の動詞や名詞の使い方など

推奨されている指針などについては、ヘルプな

どで参照してください。

名前の付け方Cコラム

Page 11: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 79

フォームにツールバーの領域を設定する5

メニューに続いてWindowsアプリケーションのユーザーインターフェイスには欠かせない機能の1つで

ある「ツールバー」を配置します。ここでは、その領域だけを設定しておき、ツールバーの設定は第7章で

行います。

ツールバーの領域の設定…ToolStripContainerコントロールツールバーはツールストリップコンテナ内に配置することで、実行時にツールバーの位置をアプリケーシ

ョンの上下左右のどの枠にもドラッグで移動できるようになります。

qフォームデザイナでツールボックスの[メニュ

ーとツールバー]のToolStripContainerコント

ロールをクリックする。

wフォーム上をクリックする。

�ToolStripContainer1が配置される。

e[パネルの表示状態]で、ツールバーを配置可

能な場所(上下左右)を指定する。ここでは

[上]と[下]のチェックボックスだけをオン

にする。

r[フォームの四辺にドッキングする]をクリッ

クする。

�ツールストリップコンテナがフォームのメニ

ューの下の領域いっぱいに広がって配置され

る。ツールバーを設置するためのツールスト

リップパネルとそのほかのコントロールを配

置する領域となるコンテントパネルで構成さ

れている。

ヒント

四辺へのドッキングとDockプロパティ

[ToolStripContainerタスク]ボックスで[フォームの四辺にドッキングする]を選択した場合は、ツールストリップコンテナのDockプロパティをFullに設定したことと同じです(Dockプロパティについては82ページのコラムを参照)。

上部のツールストリップパネル。ここにツールバー(ToolStrip)を配置する

ここをクリックすると「ToolStripContainerタスク」の表示を切り替えられる

ここをクリックすると下部のツールストリップパネルが表示される

コンテントパネル。ここにアプリケーションで使うコントロールを追加していく

Page 12: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門80ヒント

ツールストリップコンテナの選択

ツールストリップコンテナは、ツールストリップパネルとコンテントパネルの2種類の部分からなっているので、どちらかをクリックしても、ツールストリップコンテナの一部分しか選択できません。ツールストリップコンテナ全体を選択したいときは、次のどちらかの操作をします。

●プロパティウィンドウのボックスの▼をクリックして一覧から選択する。

●ツールストリップコンテナのいずれかのパネルをクリックし、そのパネルの左上隅の白い四角を右クリックしてショートカットメニューの['ToolStripContainer1'の選択]をクリックする。

ツールストリップの追加…ToolStripコントロール

qフォームデザイナでツールボックスの[メニュ

ーとツールバー]のToolStripコントロールを

クリックする。

wツールストリップをクリックする。

�ToolStrip1が配置され、ツールバーのボタン

などの追加や編集が行える状態になる。

ここではツールバーの領域を作成しておくだけなので、ここまでの作業で終了です。別のコントロールを

クリックすると、ツールバーは次の図のように表示されます。

作成したツールストリップコンテナ内に、ToolStripコントロールを使ってツールバーを作成する領域を追

加します。

Page 13: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 81

プログラムの実行と確認(サンプルフォルダ 03ー05)

[標準]ツールバーの[デバッグ開始]ボタンをクリックして、プログラムを実行します。

上部に表示されているツールバーをドラッグすると、下部に移動されます。左右には表示されないように

設定されていることも確認します。

ツールバーをドラッグする

ツールバーが下部に表示された

確認が終了したら、実行中のフォームの閉じるボタンをクリックします。

Page 14: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門82

DockプロパティDockプロパティは、配置したコントロール

の下にあるコントロールのいずれかの辺に吸着

させるためのプロパティです。フォームのほか

にパネルやタブコントロール(タブページ)の

上に配置されるコントロールで使われることが

多いです。

簡単にいえば「テキストボックスをパネルの

上半分いっぱいに配置したい」といったときに

設定します。

吸着させる方向は、次の図のように土台のコ

ントロール(白い四角形)の上に配置したコン

トロール(灰色の四角形)のDockプロパティ

の設定によって5つあります(設定しないとき

は[None])。矢印は設計時にサイズ変更が可

能な辺と方向を示します。

Top(上辺への吸着)

Right(右辺への吸着)

Bottom(底辺への吸着)

Left(左辺への吸着)

Fill(全辺への吸着)

なお、コンテナ側でPaddingプロパティを設

定すると、その大きさで吸着する辺との間隔を

設定できます。

また、複数のコントロールのDockプロパテ

ィを[Top]に設定するとコンテナ上辺から順

に並べていくようなこともできます。

AnchorプロパティAnchorプロパティは、フォーム上に配置さ

れるコントロールに設定します。次のような設

定方法があります。

Top,Bottom,Left(上辺と底辺と左辺へのアン

カー)

フォームのサイズが上下方向に変更されたと

きは、コントロールの高さが変更されます。フ

ォームの左右方向のサイズ変更では、コントロ

ールの左辺に対しての位置は変わりません。

Bottom,Right(底辺と右辺へのアンカー)

フォームのサイズが変更されても、コントロ

ールの幅や高さは変更されません。ただし、位

置は右辺への距離と底辺への距離が一定のまま

で移動します。

Top,Bottom,Left,Right(全辺へのアンカー)

フォームのサイズが変更されると、同じ割合

でコントロールの幅や高さが変化して、それぞ

れの辺への距離が一定に保たれます。

DockプロパティとAnchorプロパティCコラム

Page 15: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 83

タブコントロールを配置する6タブコントロールは、タブをクリックすると、そのページ(パネル)に切り替わるコントロールです。設

定項目が多いダイアログボックスなどでよく使われます。ここでは、アプリケーションのメインフォームに

タブコントロールを設定して、テキストエディタのページとカレンダーと日誌のページの2つの機能を実装

する準備をしておきます。

フォームにタブコントロールを表示するには、TabControlコントロールを追加します。また、ここでは

Dockプロパティを使ってパネルの大きさを設定します。

タブコントロールの配置…TabControlコントロール

qフォームデザイナでツールボックスの[コンテ

ナ]のTabControlコントロールをクリックす

る。

wフォーム上をクリックする。

�TabControl1コントロールがフォーム上に追

加される。

eTabControl1をクリックして選択する。

rDockプロパティをクリックし、▼をクリック

する。

t一覧から中央の四角形をクリックする。

�TabControl1がフォーム上で、ツールバーと

パネル、ステータスバー以外の空いた部分い

っぱいに広がり、Dockプロパティは[Fill]

となる。

ヒント

ほかのオブジェクトの下に隠れたオブジェクトを選択したい場合

オブジェクトはあとから追加したものほど手前にきます。Dockプロパティで[Fill]が設定されているオブジェクトによって覆い隠されたときは、Dockプロパティを[None]に戻して、サイズや位置を変更して隠されたオブジェクトが見えるようにします。

Page 16: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門84

タブコントロールの設定…TabPagesプロパティ

ヒント

タブページの順序の変更

タブコントロールに追加したページは、[TabPageコレクションエディタ]ダイアログボックスの[メンバ]ボックスに追加した順に並びます。並び順を変更したいときは、 と を使って[メンバ]ボックスでの順序を変更します。

タブコントロールとタブページを選択する方法

タブコントロールを選択したいときは、タブあるいはタブの余白部分をクリックします。それぞれのタブページを選択したいときは、そのタブページのタブをクリックしてから、タブの下のページの部分をクリックします。

qTabControl1のタブの部分をクリックして選択

する。

wTabPagesプロパティをクリックし、[...]をク

リックする。

�[TabPageコレクションエディタ]ダイアロ

グボックスが表示される。

e[メンバ]ボックスの[TabPage1]をクリッ

クする。

r[TabPage1プロパティ]ボックスで以下のプ

ロパティを設定する。

プロパティ 値 意味

Name TabEditor タブページの名前

Text ノート タブに表示される文字列

t[メンバ]ボックスの[TabPage2]をクリッ

クして、以下のプロパティを設定する。

プロパティ 値 意味

Name TabDiary タブページの名前

Text 日誌 タブに表示される文字列

y[OK]をクリックする。

タブページが設定される

それぞれのタブをクリックするとページが切り換わる

タブ見出しの文字列やタブページの名前の設定は、TabPagesプロパティで行います。

Page 17: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 85

テキストボックスを設定する7テキストエディタの機能の中心となるテキストボックスコントロールをフォームに追加して設定します。

フォームにテキストボックスを作成するには、TextBoxコントロールを追加します。

テキストボックスの追加…TextBoxコントロール

qフォームデザイナでツールボックスの[コモン

コントロール]のTextBoxコントロールをクリ

ックする。

wTabControl1の[ノート]タブページをクリッ

クする。

�TextBox1がTabContro l1の[ノート]

(TabEditor)タブページ上に追加される。

21

複数行エディタの設定テキストボックスは、ツールボックスからフォームに追加した状態では、1行のテキストしか入力できま

せん。この場合、テキストボックスへの入力中にgを押すとテキストボックスへの入力が確定されます。

ここでは、テキストボックスを複数行のテキストが入力できるエディタにするので、TextBox1のプロパテ

ィを以下のように設定します。

プロパティ 設定値 意味

AcceptsTab True 複数行のとき、tでタブ文字を入力する

Multiline True テキストボックスを複数行にする

ScrollBars Vertical 垂直スクロールバーを表示する

AcceptsTabプロパティはtの機能を切り替えます。[False]のときは、次のコントロールに移動する働

きをします。Multilineプロパティを[True]にすると、テキストボックスの幅で文字列が折り返されるよう

になります。また、テキストボックスへの入力中にgを押す操作が改行になります。ScrollBarsプロパテ

ィで垂直スクロールバーを表示させることによって、テキストボックスに表示しきれない部分の文字列もス

クロールすることで表示できるようになります。

ヒント

テキストボックスを複数行にする方法

テキストボックスを複数行にする場合、プロパティウィンドウでMultilineプロパティを設定する以外に、フォーム上でテキストボックスの右上隅のボタンでタスクを選択する方法もあります。

Page 18: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門86

タブページの余白の設定…PaddingプロパティテキストボックスのDockプロパティを[Fill]に設定する前に、[ノート]タブページのPaddingプロパテ

ィで余白部分を設定しておきます。余白の大きさはタブページの上下左右の辺から8ピクセルに設定します。

q[ノート]タブページのページ部分をクリック

して表示されているタブページを選択する。

wPaddingプロパティの左の[+]をクリックし、

Allプロパティに8と入力して、gを押す。

テキストボックスのサイズの設定…Dockプロパティ

qTextBox1をクリックして選択する。

wDockプロパティをクリックし、▼をクリック

する。

e一覧から中央の四角形をクリックする。

�Dockプロパティが[Fill]に設定され、テキ

ストボックスがタブページ全体に表示され

る。ただし、タブページに設定したPadding

プロパティの大きさだけ、テキストボックス

のまわりに余白が設定されている。

Paddingプロパティで設定した8ピクセルの余白

Page 19: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 87

プログラムの実行と確認(サンプルフォルダ 03-07)

[標準]ツールバーの[デバッグ開始]ボタンをクリックしてプログラムを実行し、次のことを確認します。

●フォームのサイズを変更すると、テキストボックスのサイズもフォームのサイズと同じように変化す

る。

●フォームの最小サイズが決められている。

●タブページのタブをクリックして、タブページを切り替える。

●テキストボックスに文字を入力したり、入力した文字を編集する。

また、テキストボックスに入力した文字をマウスのドラッグで選択して右クリックすると、コピー、切り

取り、貼り付けなどのコマンドがショートカットメニューとして表示されます。テキストボックスには、文

字の入力や編集に必要なコマンドが初めから組み込まれています。

ここをドラッグしてフォームのサイズを変更する

なお、テキストボックスに入力できる最大文字数はMaxLengthプロパティで設定できます(既定では

32767)。

また、テキストボックスで行うことができる主なキー操作とマウス操作についてまとめておきます。

■キー操作

操作 機能

b カーソルの前の1文字の削除

d カーソル位置の1文字の削除

t タブ文字の入力

s+£、§、°、¢ 範囲の選択

■マウス操作

操作 機能

クリック クリックした位置(文字がある場所)へのカーソルの移動

ドラッグ ドラッグした範囲の選択

右クリック ショートカットメニュー(コンテキストメニュー)の表示

確認したら、実行中のフォームの閉じるボタンをクリックします。

Page 20: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門88

本書で使っているテキストボックス以外に、

ツールボックスには似たようなコントロールと

してリッチテキストボックス(RichTextBox)

があります。

リッチテキストボックスは、文字データだけ

でなく、それぞれの文字に設定する書式も扱え

るようになっています。たとえば、フォントの

種類とサイズ、文字の色、文字の形状、文字へ

の修飾、段落の書式といったものです。

これによって、文書の一部を赤字で書き込ん

だり、見出しを大きくしたりといったことが実

現できます。ほかに、ワードパッドやWordで

作成した文書をコピーして貼り付けると、設定

されている書式もそのままコピーできます。

また、LoadFileメソッドやSaveFileメソッド

によって、リッチテキスト形式(拡張子が

「.rtf」の書式の情報を持ったテキスト)のファ

イルでの読み書きが簡単にできるようになって

います。

プログラミングに上達したら、リッチテキス

トボックスを活用するプログラムに挑戦してみ

るのもよいでしょう。

テキストボックスとリッチテキストボックスCコラム

フォームにリッチテキストボックスを設置した例。書体を変えたり、さまざまな文字修飾が使える。この図は、Word上に入力した文章をコピーして貼り付けたところ。文字修飾などの設定もコピーされる

Page 21: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 89

メニューの処理を行うコードを記述する8

MenuStripコントロールを配置することで、メニュー操作のインターフェイスを組み込めますが、個々

のメニューを選択したときの処理は、コードエディタで記述しなければなりません。具体的には、メニュー

項目がクリックされたときのイベントに対応するイベントプロシージャを記述することになります。

ここでは、[ファイル]メニューの[終了]を選択したときの、アプリケーションを終了する処理のコー

ドを記述します。

[ファイル]メニューの[終了]の処理

qフォームデザイナでメニューデザイナの[ファ

イル]をクリックする。

w[終了]をクリックしてからダブルクリックす

る。

�コードエディタが表示され、そのメニュー項

目のイベントプロシージャが記述できる状態

になる。

e以下のコードを記述する(色文字部分)。 3

Private Sub mnuFileExit_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuFileExit.ClickMe.Close()

End Sub

メニューデザイナでメニュー項目をクリックすると、そのメニュー項目がクリックされたときのイベント

プロシージャ(ここではmnuFileExit_Click)が生成され、コードが記述できる状態になります。

処理の中身であるプログラムの終了は、メインフォームを閉じることで行われます。これは、Fomr1フォ

ームのインスタンスを示す「Me」のCloseメソッドを使います。

Page 22: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門90

[ツール]メニューの[タイマ時刻設定]の処理

q[Form1.vb[デザイン]]タブをクリックし、

フォームデザイナでメニューデザイナの[ツー

ル]をクリックする。

w[タイマ時刻設定]をクリックしてからダブル

クリックする。

�コードエディタが表示され、mnuToo l

Timer_Clickイベントプロシージャの処理が

記述できる状態になる。

e以下のコードを記述する(色文字部分)。

Private Sub mnuToolTimer_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuToolTimer.ClickTimerStart()

End Sub

プログラムの実行と確認(サンプルフォルダ 03-08)

[標準]ツールバーの[デバッグ開始]ボタンをクリックしてプログラムを実行して、次のことを確認し

ます。

●[ツール]メニューの[タイマ時刻設定]をクリックして、前の章で作成した[タイマ時間設定]ダイ

アログボックスが表示されることを確認する。

●そのほかの機能を実装していないコマンドを選択して、何も動作しないことを確認する。

●[ファイル]メニューの[終了]をクリックして、プログラムの実行が終了するのを確認する。

[ツール]メニューの[タイマ時刻設定]を選択したときの処理のコードを記述します。このコードは、

[タイマ設定]ボタンをクリックしたときのイベントプロシージャと同じ内容です。

Page 23: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 91

テキストボックスの編集機能を実装する9

この章の「7 テキストボックスを設定する」の最後で確認したように、テキストボックスコントロール

は、そのオブジェクトをフォーム上に配置するだけでコピーや切り取り、貼り付けなどの基本的な編集操作

ができるようになっています。ここでは、クリップボードを使った編集操作のほか「すべて選択」や「元に

戻す」などの基本的な機能を、メニューから実行できるようにします。

テキストボックスとクリップボード「切り取り」、「コピー」、「貼り付け」は、Windowsのクリップボードに一時的にデータを保管したり取り

出したりすることで行われます。TextBoxクラスには、クリップボードとテキスト形式のデータをやり取り

するためのメソッドが用意されています。たとえば、TextBox1では、次のように使います。

コード(メソッド) 意味

TextBox1.Copy テキストボックスで選択されている文字列をクリップボードにコピーする

TextBox1.Cut テキストボックスで選択されている文字列を切り取る

TextBox1.Paste テキストボックスで選択されている文字列を貼り付ける

このように簡単にできそうですが、実際には考慮しないといけない点があります。

まず、コピーと切り取りはテキストボックスで文字列が選択されていることが前提となるため、以下のよ

うなプロパティを使って選択文字列について調べてからコピーや切り取りを行います。

コード(プロパティ) 意味

TextBox1.SelectedText テキストボックスで選択されている文字列。選択されていないときは空の文字列

TextBox1.SelectionLength テキストボックスで選択されている文字列の長さ(文字数)

また、貼り付けを行うには、クリップボードにテキストとして貼り付け可能なデータが保管されているこ

とが前提となります。

クリップボードの内容を調べるには、Clipboardクラスを使います。たとえばこのクラスには、コピーや

貼り付けをするための次のようなメソッドがあります。

コード(メソッド) 意味

Clipboard.SetDataObject(TextBox1.SelectedText) TextBox1で選択されている文字列をクリップボードにコピーする

Clipboard.GetDataObject() クリップボードのデータを取得する

Page 24: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門92現在、クリップボードにテキスト形式のデータとして扱えるデータがあるかどうかを調べるには、次のよ

うなコードを記述します。

Clipboard.GetDataObject().GetDataPresent(DataFormats.Text)

これは、GetDataObjectメソッドで取り出したクリップボードのデータを、GetDataPresentメソッドで、

指定する形式のデータがあるかどうかを調べるコードです。結果はTrue(真)かFalse(偽)になります。

「DataFormats.Text」はテキスト形式のデータを表します。

これらを元に、テキストボックスで切り取りやコピー、貼り付けを行う実際のコードを実装していきます。

[編集]メニューの[コピー]の処理メニューの処理を記述する方法はこれまでと同じです。

q[Form1.vb[デザイン]]タブをクリックし、

フォームデザイナでメニューデザイナの[編集]

をクリックする。[コピー]をクリックしてか

らダブルクリックする。

wコードエディタが表示され、mnuEditCopy_

Clickイベントプロシージャの処理が記述でき

る状態になるので、以下のコードを記述する

(色文字部分)。

Private Sub mnuEditCopy_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuEditCopy.ClickEditCopy()

End Sub

「EditCopy」というプロシージャはまだ定義されていないので、上記のように入力してカーソルを下に移

動すると、エラーであることを表す波線が表示されます。このままでは、デバッグ実行はできないので、次

にこのプロシージャを記述します。

e「End sub」の次の行に、private sub Edit

Copyと入力してgを押す。

r以下のコードを記述する(色文字部分)。

Private Sub EditCopy()If TextBox1.SelectedText <> "" Then

TextBox1.Copy()End If

End Sub

Page 25: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 93mnuEditCopy_Clickイベントプロシージャにこのコードを記述しても同じですが、本書ではこのあとでツ

ールバーのボタンの機能として呼び出すことを考えてEditCopyというプロシージャを別に作成します。

EditCopyプロシージャは、IfステートメントでTextBox1で選択されている文字列があるかどうかを調べ、

それが空の文字列でない場合は、TextBoxクラスのCopyメソッドで、その文字列をクリップボードに書き込

むという処理になっています。

ここで入力したコードの動作を確認する場合は、デバッグ実行したあと、テキストボックスに適当に文字

を入力して、ドラッグして文字列を選択し、[編集]メニューの[コピー]をクリックします。そして、別

のアプリケーション(メモ帳やWordなど)にコピーした内容が貼り付けられれば正常に動作しています。

[編集]メニューの[切り取り]の処理[コピー]コマンドと同じように、フォームデザイナで[編集]メニューの[切り取り]をクリックして

からダブルクリックして、コードエディタでmnuEditCut_Clickイベントプロシージャを記述します(色文字

部分)。ここでも、[コピー]コマンドと同様に「EditCut」という新しいプロシージャを呼び出します。

Private Sub mnuEditCut_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuCut.ClickEditCut()

End Sub

続けてEditCutプロシージャを記述します。以下のコードを記述します(色文字部分)。

Private Sub EditCut()If TextBox1.SelectedText <> "" Then

TextBox1.Cut()End If

End Sub

Ifステートメントで文字列が選択されているかどうかを調べるのは[コピー]コマンドのときと同じです。

選択されている文字列があるときは、TextBoxクラスのCutメソッドでクリップボードに切り取ります。

[編集]メニューの[貼り付け]の処理同様の手順で、フォームデザイナで[編集]メニューの[貼り付け]をクリックしてからダブルクリック

して、コードエディタでEditPasteプロシージャを呼び出すmnuEditPaste_Clickイベントプロシージャを記

述します(色文字部分)。

Private Sub mnuEditPaste_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuEditPaste.ClickEditPaste()

End Sub

Page 26: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門94続けてEditPasteプロシージャを記述します。以下のコードを記述します(色文字部分)。

Private Sub EditPaste()If My.Computer.Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) Then

TextBox1.Paste()End If

End Sub

既に説明したように、Ifステートメントでクリップボードにテキスト形式のデータがあるかどうかを調べ、

テキスト形式のときは貼り付けを行うという処理になっています。「My.Computer.」の部分はなくてもいい

のですが、「My」から始めると一覧から選択していくだけで入力することができます。

[編集]メニューの[すべて選択]の処理同様の手順で、フォームデザイナで[編集]メニューの[すべて選択]をクリックしてからダブルクリッ

クして、コードエディタでEditSelectAllプロシージャを呼び出すmnuEditSelectAll_Clickイベントプロシー

ジャを記述します(色文字部分)。

Private Sub mnuEditSelectAll_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuEditSelectAll.ClickEditSelectAll()

End Sub

EditSelectAllプロシージャは、テキストボックスのSelectAllメソッドを実行します。

Private Sub EditSelectAll()TextBox1.SelectAll()

End Sub

[編集]メニューの[元に戻す]の処理同様の手順で、フォームデザイナで[編集]メニューの[元に戻す]をクリックしてからダブルクリック

して、コードエディタでEditUndoプロシージャを呼び出すmnuEditUndo_Clickイベントプロシージャを記

述します(色文字部分)。

Private Sub mnuEditUndo_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuEditUndo.ClickEditUndo()

End Sub

EditUndoプロシージャは、テキストボックスのUndoメソッドを実行します(色文字部分)。

Private Sub EditUndo()TextBox1.Undo()

End Sub

Page 27: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 95これで、テキストボックスを右クリックして表示されるショートカットメニューの[元に戻す]と同じ機

能になります。つまり、[元に戻す]を実行するたびに、直前の入力や編集操作を行う前の状態に戻ります。

たとえば、文字を入力してから[元に戻す]を実行すると、文字を入力する前の状態に戻ります。

さらに、もう一度[元に戻す]を実行すると、元に戻す前の状態(文字を入力していた場合は、文字が表

示される)になります。したがって、[元に戻す]を実行するたびに、2つの状態を繰り返すことになります。

これはWindowsアプリケーションの「メモ帳」などと同じです。Wordなどでは、元に戻す前の状態には戻

れないようになっています。もし、Wordと同じようにする場合は、EditUndoプロシージャに以下のコード

を記述します(色文字部分)。

Private Sub EditUndo()TextBox1.Undo()TextBox1.ClearUndo()

End Sub

テキストボックスのClearUndoメソッドは、以前の状態の記憶をクリアします。これによって[元に戻す]

を実行した直後は元に戻れなくなります。

本書では、ClearUndoメソッドは追加せず、テキストボックスの右クリックによるショートカットメニュ

ーと同じ機能にします。

プログラムの実行と確認(サンプルフォルダ 03-09a)

以上の作業でメニューを使ったテキストボックスの基本的な編集操作が実装できたので、[標準]ツール

バーの[デバッグ開始]ボタンをクリックして、プログラムを実行します。

メニュー操作および、メニュー項目に設定したショートカットキー操作(76ページ)で[編集]メニュー

で実装した機能が実行できることを確認してください。

実際に確認しているうちに、テキストボックスを右クリックしたときに表示されるショートカットメニュ

ーと同じ動作をしていないことに気付くかもしれません。たとえば、文書が新規の状態のときにショートカ

ットメニューを表示したときは、通常、[元に戻る]コマンドはグレー表示されていて選択できません。状

況に応じてメニュー項目の表示が自動的に切り替えられているわけです。一方、ここで作成したメニューは、

どのような状態でもすべてのメニュー項目が表示され、選択できるようになっています。

ユーザーインターフェイスとしても実行できなかったり、または実行しても意味のないメニュー項目は選

択できないようになっているほうが親切です。次にこれを実現します。

確認が終了したら、実行中のフォームの閉じるボタンをクリックします。

Page 28: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門96

状況に応じたメニュー項目の表示の変更メニュー項目の表示を状況に応じて変更するには、次の2つのポイントがあります。

●メニュー項目を選択できない表示にする。

●メニューが表示されるときに、状況を判断して表示を切り替える。

まず、選択できない状態というのは、そのメニュー項目(MenuItemクラス)のEnabledプロパティを

[False]にします。これで、そのメニュー項目はグレー表示になります。

2点目の状況判断をどうするかについては、そのメニュー項目が表示されるタイミングのイベントに対応

するプロシージャを使うことで実現できます。具体的には、[編集]メニューがマウスのボタンで押された

ときのイベントを使います。

次の手順で行います。

qコードエディタで[クラス名]ボックスの▼を

クリックして、一覧から[mnuEdit]を選択す

る。

w[メソッド名]ボックスの▼をクリックして、

一覧から[MouseDown]を選択する。

�mnuEdit_MouseDownイベントプロシージ

ャの処理が記述できる状態になる。

e以下のコードを記述する(色文字部分)。

Private Sub mnuEdit_MouseDown(ByVal sender As Object, ➔

ByVal e As System.Windows.Forms.MouseEventArgs) Handles mnuEdit.MouseDownIf TextBox1.CanUndo Then

mnuEditUndo.Enabled = TrueElse

mnuEditUndo.Enabled = FalseEnd IfIf TextBox1.SelectionLength > 0 Then

mnuEditCopy.Enabled = TruemnuEditCut.Enabled = True

ElsemnuEditCopy.Enabled = FalsemnuEditCut.Enabled = False

End IfIf My.Computer.Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) Then

mnuEditPaste.Enabled = TrueElse

mnuEditPaste.Enabled = FalseEnd If

End Sub

Page 29: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 97最初のIfステートメントは、「Undoが可能か」ということをテキストボックスのCanUndoプロパティで調

べています。Undoが可能な場合はTrue(真)、そうでない場合はFalse(偽)となります。

2番目のIfステートメントは、テキストボックスで文字列が選択されているかどうかを、SelectionLength

プロパティが「0」より大きいかどうかで調べています。SelectionLengthプロパティは選択されている文字

列の長さです。前にEditCopyプロシージャやEditCutプロシージャを記述したときは、選択された文字列が

あるかどうかをSelectedTextプロパティが空の文字列でないかどうかで調べました。それでもいいのですが、

同じ目的でもいろいろなアプローチができる例として、ここではSelectionLengthプロパティを使っていま

す。

3番目のIfステートメントは、EditPasteプロシージャでのIfステートメントと同じです。クリップボードに

貼り付け可能なテキスト形式のデータがあるかどうかを調べています。

プログラムの流れとしては、ユーザーが[編集]メニューをクリックするとポップアップメニューが表示

される直前にPopupイベントが発生し、それぞれのメニュー項目のEnabledプロパティの設定が行われま

す。

ところで、ここで記述したIfステートメントは、EditCopy、EditCut、EditPasteの3つのプロシージャでの

Ifステートメントと同じ評価を行っています。この場合、EditCopyプロシージャなどのIfステートメントは

不必要に思えるかもしれません。しかし、無駄になるのはEditCopy、EditCut、EditPasteのプロシージャを

メニューから実行したときに限った場合です。これらのプロシージャをツールバーから呼び出すときは、こ

の条件判断が必要になります。

このことはツールバーボタンの表示を状況依存型にするかどうかということと関わってきます(詳細につ

いては、「第7章 ツールバーの仕上げ」で説明します)。

プログラムの実行と確認(サンプルフォルダ 03-09b)

[標準]ツールバーの[デバッグ開始]ボタンをクリックして、プログラムを実行します。

テキストボックスの入力や編集の状態に応じて[編集]メニューのメニュー項目の表示が切り替わるのを

確認します。右クリックして表示されるショートカットメニューと同様の動作になります。

確認したら、実行中のフォームの閉じるボタンをクリックします。

実行できないコマンドはグレー表示になる

Page 30: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門98

テキストボックスの文字サイズを変更する10

ここではテキストボックスの文字のフォントやサイズの設定について説明します。また、メニュー項目に

チェックマークを表示させる方法も取り上げます。

メニュー項目へのチェックマークの表示…Checkedプロパティここでは、[オプション]メニューの[文字の大きさ]の機能を実装します。文字の大きさはサブメニュ

ーの[標準]、[大]、[小]の3種類から選択するという仕様を考えていますが、現在の文字の大きさがどれ

であるかがわかるように、次の図のようにメニュー項目にチェックマークを付けることにします。

現在の設定にチェックマークが付く

この機能はそれぞれのメニュー項目(MenuItemクラス)のCheckedプロパティを[True]にするか

[False]にするかどうかで実現できます。

テキストボックスのフォントの設定…Fontプロパティテキストボックスに入力された文字の設定については、テキストボックスのFont

プロパティで行います。

右の図のようにFontプロパティの左の[+]をクリックすると、フォントに関す

るさまざまなプロパティが表示されます。

Fontプロパティは、ここで見られるようなプロパティで構成されていますが、実

はほかにも設定するプロパティがあり、それらはまとめてFontクラスのオブジェク

トとなっています。

そこで、文字について設定するときは、新しくFontオブジェクトを作成して、そ

のオブジェクトをテキストボックスのFontプロパティに与えます。具体的には次の

コードのように、Newステートメントを使ってFontオブジェクトを作成します。

「MS UI Gothic」というフォントでサイズが「10ポイント」という指定をしています。

TextBox1.Font = New Font("MS UI Gothic", 10)

Fontオブジェクトの作成では、ほかに斜体などの文字スタイルなどを指定する方法もあります(詳しくは

ヘルプのFontクラスのFontコンストラクタで参照できます)。

ちなみに、「New Font()」のように何も指定しないでFontオブジェクトを生成すると既定の設定になりま

す。

Page 31: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 99

[オプション]メニューの[文字の大きさ]の処理ここでは、3つのメニュー項目を設定しますが、どれも処理は共通しています。手順としては、[編集]メ

ニューの実装と同じ手順になります。

●[標準]コマンド

まず、フォームデザイナで[オプション]メニューの[文字の大きさ]の[標準]をクリックしてからダ

ブルクリックして、コードエディタでmnuOptionFontNormal_ClickイベントプロシージャにOptionFont

Normalプロシージャを呼び出すコードを記述します(色文字部分)。

Private Sub mnuOptionFontNormal_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuOptionFontNormal.ClickOptionFontNormal()

End Sub

OptionFontNormalプロシージャは以下のように記述します(色文字部分)。

Private Sub OptionFontNormal()TextBox1.Font = New Font("MS UI Gothic", 10)mnuOptionFontNormal.Checked = TruemnuOptionFontBig.Checked = FalsemnuOptionFontSmall.Checked = False

End Sub

TextBox1オブジェクトのFontプロパティを、新しく作成するFontオブジェクトで設定します。「MS UI

Gothic」のフォントで10ポイントのサイズを標準として設定しています。フォント名の指定はフォントの名

前を「"」(二重引用符)で囲んで指定します。

続く3行はどれもメニュー項目にチェックマークを付けるかどうかをCheckedプロパティで指定するコー

ドです。メニュー項目の[標準]だけTrueでチェックマークが付きます。そのほかをFalseにするのは、チ

ェックマークが付いていた場合にそのチェックマークを取るためです。

●[大]コマンド

フォームデザイナで[オプション]メニューの[文字の大きさ]の[大]をクリックしてからダブルクリ

ックして、mnuOptionFontBig_ClickイベントプロシージャにOptionFontBigプロシージャを呼び出すコー

ドを記述します(色文字部分)。

Private Sub mnuOptionFontBig_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuOptionFontBig.ClickOptionFontBig()

End Sub

Page 32: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門100OptionFontBigプロシージャは以下のように記述します(色文字部分)。

OptionFontBigプロシージャでは、フォントサイズを12ポイントにしています。また、チェックマークを

[大]にだけ表示します。

Private Sub OptionFontBig()TextBox1.Font = New Font("MS UI Gothic", 12)mnuOptionFontNormal.Checked = FalsemnuOptionFontBig.Checked = TruemnuOptionFontSmall.Checked = False

End Sub

このコードの入力は、既に入力しているOptionFontNormalプロシージャの内容をコピーして修正を行う

ほうが効率的です。

●[小]コマンド

フォームデザイナで[オプション]メニューの[文字の大きさ]の[小]をクリックしてからダブルクリ

ックして、mnuOptionFontSmall_ClickイベントプロシージャにOptionFontSmallプロシージャを呼び出す

コードを記述します(色文字部分)。

Private Sub mnuOptionFontSmall_Click(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles mnuOptionFontSmall.ClickOptionFontSmall()

End Sub

OptionFontSmallプロシージャは以下のように記述します(色文字部分)。

OptionFontSmallプロシージャでは、フォントサイズを8ポイントにし、チェックマークを[小]にだけ

表示します。

Private Sub OptionFontSmall()TextBox1.Font = New Font("MS UI Gothic", 8)mnuOptionFontNormal.Checked = FalsemnuOptionFontBig.Checked = FalsemnuOptionFontSmall.Checked = True

End Sub

Page 33: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第3章 テキストエディタの作成 101

初期化処理によるフォントの設定プログラムを実行した状態ではフォントのサイズはここでの標準である10ポイントになっている必要があ

ります。これはフォームデザイナでテキストボックスのFontプロパティのSizeプロパティで設定しておけば

いいのですが、ここでは、コードエディタの初期化処理の部分に、フォントについての設定を以下のような

コードを記述して追加します(色文字部分)。また同時にメニュー項目のチェックマークも設定しています。

Private Sub Form1_Load(ByVal sender As System.Object, ➔

ByVal e As System.EventArgs) Handles MyBase.LoadMe.Width = 464Me.Height = 452Me.MinimumSize = New Size(464, 452)ToolStripProgressBar1.Visible = FalseTextBox1.Font = New Font("MS UI Gothic", 10)mnuOptionFontNormal.Checked = True

End Sub

プログラムの実行と確認(サンプルフォルダ 03-10)

[標準]ツールバーの[デバッグ開始]ボタンをクリックして、プログラムを実行します。

テキストボックスに文字を入力したあと[オプション]メニューの[文字の大きさ]の各コマンドの動作

を確認します。

コマンドの選択によって文字の大きさが変わる。また、選択されたコマンドの前にはチェックマークが付く

確認したら、実行中のフォームの閉じるボタンをクリックします。

Page 34: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で
Page 35: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門16

そもそもプログラムとは何でしょうか?

簡単にいえば、コンピュータを動作させるた

めの命令を並べたものです。

Windowsもそこで実行されるアプリケーシ

ョンもすべてプログラムであり、要するにコン

ピュータはプログラムが動作していないと「た

だの箱」というわけです。

そして、Visual Basicはプログラムを作成す

るプログラム言語の1つです。

プログラムの基本プログラムはコンピュータを動作させるため

の命令を並べたものです。通常はその文字の並

びを「コード」といいます(Visual Basicでは、

「ステートメント」ということもあります)。

ただし、単に命令を順に並べたのではなく、

次のような仕掛けが加わることで、単なる指示

書とは違う「プログラム」となります。

●変数

変数は値を保持するための入れ物です。プ

ログラムは変数にさまざまな値を入れてデー

タを保持したり、取り出してほかの値と合わ

せて計算したり、値どうしを比較したりとい

った処理をします。

●条件判断と分岐

プログラムは、単に上から順に実行される

だけでなく、「もし変数Xの値が0だったらA

の処理をする、そうでないときはBの処理を

する」といったように、条件に応じて処理を

分岐させることができます。これによってプ

ログラムは状況に応じた「賢い処理」が行え

るようになります。

●繰り返し

「Aという処理を1000回行う」というのが

繰り返し処理です。繰り返し処理自体は、変

数と条件判断で組み立てられます。現在何回

目の処理を行っているかを記憶する変数と、

最終的に何回繰り返すかを記憶している変数

を用意して、それらが同じになったかどうか

を判断しながら処理を繰り返せばいいわけで

す。

この仕組みによって1000回行う処理を1000

回分記述しなくても済むわけです。

このように、変数を使った計算などの処理を、

条件判断や繰り返しなどを使って組み立てたも

のがプログラムです。

クラスとオブジェクトVisual Basicはオブジェクト指向型の言語で

す。これについてはあとのコラムでも詳述しま

すが、ここでは次のことを理解しておきましょ

う。

●クラス

オブジェクト指向型のプログラムでは、あ

る機能のまとまりを「部品」としてまとめ、

それらの「振る舞い」を記述していきます。

クラスは、このプログラムを構成する部品の

設計図にあたります。

●オブジェクト

オブジェクトは、クラスという設計図を基

に実際にプログラムで部品として扱えるよう

にしたものです。「インスタンス」とも呼ば

れます。

抽象的でわかりにくいかもしれませんが、た

とえば、フォームデザイナでツールボックスの

ボタンをフォーム上に配置することは、そのま

まクラスを基にオブジェクトを作成することに

なります。ツールボックスのボタンなどの部品

がクラスで、それらをフォーム上に配置すると

オブジェクトになります。

プログラムとはCコラム

Page 36: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門20

オブジェクト指向型言語Visual Basic 2008は「オブジェクト指向」を

基本にしたプログラム言語です。オブジェクト

指向とは、あるまとまった機能を「クラス」と

いうものに構成し(モデル化といいます)、そ

のクラスの機能を使うという形でプログラムを

構成するという考え方です。

オブジェクト指向型に対して、処理を羅列し

て構成していく言語を「手続き指向型言語」と

呼びます。

といっても、オブジェクト指向と手続き型は

対立した概念というよりも、「より間違いを少

なくし、労力を減らして、あとで改良しやすい」

といった要求に応えるために考えられた、もと

もとのプログラムについての発想が異なるもの

となっています。

手続き型では、プログラムの規模が大きくな

ればなるほど、エラーを見つけ出したり、あと

で改良したりといったことが困難になります。

もちろん、それに対応するためにいろいろ工夫

が重ねられましたが、結局、根本的な部分から

プログラムというものの構成を変える必要が出

てきたわけです。

オブジェクト指向型の特徴は、まとまりのあ

る機能をクラスという抽象的なモデルにしてい

ることです。そのため、開発者は必要なクラス

を集めて構成するという形でプログラムを作成

できるようになります。プログラムが巨大化し

ても、それぞれのクラスがきちんと組み立てら

れていればいいわけです。次のような点がオブ

ジェクト指向の利点となります。

●プログラムを切り分けて開発できる

●切り分けられていた部分を再利用できる

オブジェクト指向型言語を学ぶ場合、初めか

らこれらの利点を十分に意識しておくといいで

しょう。

オブジェクト指向の2つの側面オブジェクト指向型言語が登場したことで、

プログラム開発に2つの側面が出てきました。

それは、「クラスを使う」ということと「クラ

スを作る」ということです。

●クラスを使う

クラスはある機能を実現するためのまとま

りなので、よく使われるものは初めから用意

しておけば便利です。それが「クラスライブ

ラリ」というもので.NET Frameworkがまさ

にそれです。

Visual Basic 2008でのプログラム開発は、

初めから用意されている膨大なクラスを使う

ことで「楽」に行うことができます。ただし、

「どこにどんなクラスが用意されていて、そ

れをどう使えばいいかわかっている」ことが

前提となります。

それを解説しているのが統合開発環境に付

属するオンラインヘルプです。開発者にはそ

れを読み解きながらさまざまなクラスについ

て習熟することが求められます。

●クラスを作る

自分で独自のクラスを作れる、というのは

オブジェクト指向型の開発のもう1つの側面

です。といっても、用意されているクラスで

十分なら、あえてクラスを作成する必要はあ

りません。また、クラスを作成するためには、

オブジェクト指向型の基本理念を理解し、さ

まざまな概念と用語を習得していかなければ

なりません。逆に、中途半端な理解で作成し

たクラスは、結局、再利用されることもなく

クラスとしての利点が生かされないこともあ

ります。

本書でも「クラスを作る」ことに関連した

ことには踏み込まず、既存のクラスをどう使

いこなすかに力点を置いています。

Visual Basic 2008とオブジェクト指向型のプログラミングCコラム

Page 37: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

第2章 時計とタイマの作成 21

Visual Basic 2008での開発Visual Basic 2008でWindowsアプリケーショ

ンを開発するときの基本的な用語を紹介します。

●クラスとオブジェクト(インスタンス)

「クラス」は特定の機能をまとめたもので、

.NET Frameworkにはクラスライブラリとい

う形でたくさんのクラスが用意されていま

す。

たとえば、Windowsアプリケーションを

起動したときに開かれるウィンドウは

「Form(フォーム)」というクラスによって

その機能が実現されています。ちなみに、プ

ログラムによってある機能を実現することを

「実装する」といいます。Visual Basic 2008

でのプログラム開発は、自分のアプリケーシ

ョンで使うフォームに、コードを記述すると

いう形になります。

クラスはあくまでも機能をモデル化した設

計図のようなものなので、実際にプログラム

として機能するためには、それを実体化する

必要があります。もっと具体的にいうと、コ

ンピュータのメモリ上に割り当てるというこ

とです。そして、クラスを具体的にしたもの

が「オブジェクト」です。オブジェクトはイ

ンスタンスとも呼ばれ、どちらの用語も同じ

ように使われます。

プログラム開発は、使いたいクラスのオブ

ジェクトを作成し、そのオブジェクトに備わ

っているクラスの機能(または値)を使って

いくことになります。クラスに備えられてい

るものをクラスの「メンバ」といいます。

オブジェクトのメンバを使うときは、「オ

ブジェクト名.メンバ」のように「.」(ピリ

オド)でつなげて指定します。メンバにはい

ろいろな種類がありますが、クラスを使うと

きに重要なものをいくつか説明します。

●プロパティ

そのクラスに設定されている属性で、その

値を設定したり参照できます。たとえば、フ

ォームの横幅はWidthというプロパティで設

定したり参照することができます。

●メソッド

そのクラスに用意されている動作で、たと

えばフォームのCloseというメソッドを実行

すると、フォームが閉じられます。

●イベント

そのクラスのオブジェクトに関係する何か

が起きたとき、それが起きたことを知らせる

仕組みです。説明だけだと複雑ですが、たと

えばマウスのボタンがクリックされると、そ

のボタンオブジェクトは、クリックされたと

いうイベント(Click)を発生します。

プログラムでは、特定のイベントが発生し

たときに実行するためのイベントプロシージ

ャを用意しておくことで、イベントが発生し

たときに反応して実行される処理を記述でき

ます。

メンバとしては、ほかにクラスに特定の値を

持たせるためのフィールドもありますが、「ク

ラスを使う」ということでは、上記の3つのメ

ンバを中心に考えればいいでしょう。

なお、イベントプロシージャの「プロシージ

ャ」というのは、ある処理のまとまりのことで

す。プログラム全体からすると、小さなまとま

りなのでサブプロシージャといいます(サブル

ーチンというのも同義です)。たとえば「画像

を表示するためのサブプロシージャを記述す

る」というように使います。

以上、概観だけをまとめましたが、実際にプ

ログラムを学習していく過程で、整理が必要に

なったときは、あらためて、ここで解説した基

本を確認するといいでしょう。

Page 38: テキストエディタの 作成 第章download.microsoft.com/.../hitome_vbasic_app.pdf前の章で作成したプログラムを土台として、これ以降の章で追加していく機能のために、この章で

ひと目でわかるMicrosoft Visual Basic 2008 アプリケーション開発入門130

ファイルを扱うプログラムでは、ファイルの

さまざまな情報を参照する必要が出てくるのも

のです。その場合に便利なのが、

My.Computer.FileSystem.GetFileInfo(パス

名)

です。これはFileInfoクラスのオブジェクト

を返します。次にさまざまな情報を変数にセッ

トするコードの例を示します。

●ファイルやパスの名前

Dim finfo As System.IO.FileInfoDim f1,f2,f3,f4 As String

finfo = My.Computer.FileSystem.➔

GetFileInfo("c:¥test.txt")'ファイルの名前f1 = finfo.Name 'パス名f2 = finfo.DirectoryName 'フルパス(パスとファイル名)f3 = finfo.FullName'ファイルの拡張子f4 = finfo.Extention

●ファイルの日付時刻情報

Dim finfo As System.IO.FileInfoDim f1,f2,f3 As DateTime

finfo = My.Computer.FileSystem.➔

GetFileInfo("c:¥test.txt")'作成日時f1 = finfo.CreationTime '最終更新日時f2 = finfo.LastWriteTime '最終アクセス日時f3 = finfo.LastAccessTime

●ファイルのサイズ

Dim finfo As System.IO.FileInfoDim f1 As Long

finfo = My.Computer.FileSystem.➔

GetFileInfo("c:¥test.txt")' ファイルサイズ(バイト)f1 = finfo.Length

●ファイルの存在確認

Dim finfo As System.IO.FileInfoDim f1 As Boolean

finfo = My.Computer.FileSystem.➔

GetFileInfo("c:¥test.txt")' ファイルが存在していればTruef1 = finfo.Exists

ファイルのさまざまな情報を得るにはCコラム