元野良猫のタキシードねこ「るひ・ルヒ・RUHI」との日々の生活

④JRA-VAN用競馬ソフトを作る

CATEGORYJRA-VAN
3.Microsoft Visual Basic 2010 Expressの言語としての文法や概念等の決まりごとの確認

ま~わからないことだらけ^^;
●フォームって何?
 フォームとはプログラムが表示するウィンドウの事かな!webで言うページみたいなもの!
 (「ボタン」やら「テキスト入力エリア」等を張り付けて視覚的(グラフィカル)にユーザーとのやり取りをする場所=GUI)

●オブジェクトって何?
 オブジェクトとは処理毎に分かれたプログラムコード(フォームやボタンなどのコントロールや外部プログラム)

●オブジェクト指向って何?
 オブジェクト指向とは、分かれて存在する<オブジェクト>同士が<やりとり>を行うことで、何らかの行為が実現するという世界観を、プログラミングの世界に持ち込むことを指向する(=目指す)こと

 「オブジェクト」は「クラス(class)」として、「オブジェクトを分類するための境界線」は「名前空間(namespace)」として、それぞれ定義される


●クラスって何?
 クラストとはオブジェクト(処理毎のプログラムコード=モジュール化されたサブプログラム)
 名前空間は分類=クラス(オブジェクト)のグループ(Windowsのフォルダ階層のようなもの、モジュールをグループ分けしたもの)
 (プロジェクトを例えば数を処理するオブジェクトと文字を処理するオブジェクトをグループ化(プロジェクト)し名前空間で分けるとかかな?)


●インスタンスって何?
 インスタンスとは、クラスのコードという設計図に基づいて実体が生成されたもの(クラスのインスタンスとして生成されたものが「オブジェクト」)
 クラスの中身をコーディングした内容をインスタンスと言い、ビルドしたものをオブジェクトと言うのか!?


●メソッドってなに?(コンストラクターメソッド・デストラクタメソッド)
 メソッドとは、簡単にいうと、右から入力を受け取り、左へ出力するための、変換機のようなもの。
 (表示したら、クリックしたらなどのオブジェクトに対しての動作時など)

 コンストラクターメソッド=新たにオブジェクトが 生成される度に呼び出される
 デストラクタメソッド=インスタンスが消滅する際に呼び出されるメソッド、または呼び出される機会は与えられるがいつ呼び出されるかわからない

要は階層構造という事か・・・
 名前空間 ―― クラス
       └ クラス ―メソッド

●プログラムコードの記述は、
属性の宣言
名前空間の宣言
{  ←で名前空間の始まり

   クラスの宣言を書く
   {  ←でクラスの始まり
     クラスのコードを書く
     またはメソッドの呼び出し
   } ←でクラスを終わる

} ←で名前空間を終わる

メソッドの宣言を書く
{  ←メソッドの始まり
  メソッドのコードを書く
} ←でメソッドを終わる

※理解の仕方が違うかもしれない^^;





  Insider.NET > 連載:簡単! Visual Studio 2015入門
上記サイトはVisual Basicのバージョンは違うが、言語特有の基礎知識を知ることができるのでおすすめです

当然上記サイトの全内容を購読し理解する必要があるが、
特に私に必要な内容を下記にInsider.NETから抜粋引用させて頂く

1.ソリューションとオブジェクトの違い
 一つのプログラムを作成するには、一つのプロジェクトが必要である。
よって、複数のプログラムを含んだアプリの場合には、
「.EXEファイル(メインプログラム)を作成するプロジェクト」
「メインプログラムで使われる.DLLファイルを作成するプロジェクト」
など複数のプロジェクトが必要ということになる。
しかし、それらのプロジェクトをばらばらにしておくと、アプリ全体を管理しにくい。そこで、プロジェクトをまとめて管理するためのフォルダーのようなもの(「コンテナー」と呼ばれる)が必要になる。この複数のプロジェクトをまとめるコンテナーが「ソリューション」。

 実際の開発では、一つのソリューションで、アプリ全体を管理することが一般的。つまり、「ソリューション=実際のアプリ」というケースがほとんど、「ソリューション」や「プロジェクト」という構成概念が、そのまま「ソリューションフォルダー」や「プロジェクトフォルダー」という物理構成となって、ファイルシステム上に作成されている。

 プロジェクトフォルダーの中にはプロジェクトファイル(.csprojファイルもしくは.vbprojファイル)がある*1。
このプロジェクトファイルは、ソリューションファイル(.slnファイル)と混同しやすいので注意が必要だ。

*1 これらのファイルからも分かるように、一つのプロジェクト内では複数の異なる開発言語を混在して使用することはできない。しかし、一つのソリューションにC#のプロジェクトとVBのプロジェクトを含めることは可能だ。


2.ひな形コードの名前空間とクラス
 名前空間とクラスには、始まり(=開始地点)と終わり(=終了地点)がある。
この始まりと終わりの間は「スコープ」(=範囲)と呼ばれ、C#の名前空間やクラスではスコープの始まりは「{」で表し、終わりは「}」で表す(VBの名前空間やクラスでは、スコープの終わりに「End Namespace」や「End Class」を記述することで、それぞれのスコープを確定する)。

 名前空間のスコープの中では、各行の左端に余白(「インデント」と呼ばれる)が作られているが、これは他の行と開始文字の位置をずらすことで、名前空間のスコープ内であることを明確に表現するためのものである。

*1 ただし、VBでは、「WindowsApplication1」という名前空間はWindowsフォームを定義するファイル(この場合はForm1.vbファイル)には現れないようになっているので注意しよう。ソリューションエクスプローラーの[My Project]をダブルクリックすると表示されるウィンドウの[アプリケーション]タブにある[ルート名前空間]でこの名前空間になっていることを確認できる。


「名前空間」と「クラス」の基本的な書き方(構文)
 C#での名前空間(=クラスを分類してグループ化するための境界線)の基本的な書き方は、次の通りだ。
namespace <名前空間の名称>
{
……中略(ここにクラスを書く)……
}

名前空間の構文(C#)


 「……中略(ここにクラスを書く)……」の部分にクラスを書き込む。そのクラスの書き方は、次の通りだ。
public class <クラスの名称> : <基底クラスの名称>
{
……中略……
}

クラスの構文(C#)


 classの前にある「public」はアクセシビリティ(アクセス制御)を指定するための修飾子である。
このpublic修飾子(VBではPublic修飾子)で修飾されたclassは、「どのクラスからでもアクセス可能な状態」になる。
他にも、クラスがあるプロジェクト内(=アセンブリ内)からのみアクセス可能にするinternal修飾子(VBではFriend修飾子)がある。クラスに対してアクセシビリティを明示しない場合、自動的にinternal修飾子が付与される。
アクセシビリティは実際のプログラミングで必要になって初めてその価値が理解できると思う。よって、取りあえず現段階では、オブジェクト指向プログラミングではアクセシビリティを設定する必要があるということを知っておいてほしい。

 <クラスの名称>に続き「:」(コロン)で区切られて指定されたクラスは、基底クラス(Base Class)と呼ばれる(「基本クラス」「スーパークラス」「親クラス」とも呼ばれる)。
また、「:」の前にあるクラスは派生クラス(Derived Class)と呼ばれる(「サブクラス」「子クラス」とも呼ばれる)。

 基底クラスと派生クラスの記述は、新たに作成する派生クラスが基底クラスの全特徴を引き継ぐことを意味している。

public class Form1 : System.Windows.Forms.Form
{
……中略……
}

Form1クラスはSystem.Windows.Forms.Formクラスの全特徴を引き継ぐ
System.Windows.Forms.Formクラスには、Windowsフォームの基礎となる特徴(Windowsフォームアプリが持つ特性)がマイクロソフトによりあらかじめ作り込まれている。
この特徴を全て引き継ぐことで、プログラマーが同じこと(Windowsフォームアプリの基礎部分の作り込み)をしなくても済み、自分が作成するアプリで実現したいことだけに専念できるようになっているのだ。

 このように、ある基底クラスの全特徴を引き継いで新たなクラスを作成することを、オブジェクト指向では「継承」と呼ぶ。
 「継承」を現実世界で例えると、「人間」の全特徴を引き継ぎ、さらに「ボーっとしている」「博多ラーメンが好きである」などの独特な特徴(=個性)が付け加えられて、「山田」という人物が作成されることになる。
この例で分かるように、オブジェクト指向の継承は、基底クラスの全特徴を引き継ぎ、さらに何らかの特徴を付け加えて拡張した新たなクラスを作成するための機能である。

 なお、継承を使わずに新しいクラスを作成することもできる。その場合には、「: <基底クラスの名称>」の部分を省略すればよい(ちなみにソースコード(Program.csファイル)では、実際に基底クラスの記述が省略されたProgramクラスが定義されている)。

 先ほど示したコードにある基底クラスの「System.Windows.Forms.Form」は、名前空間とクラスを「.(ドット)」で連結した書き方で、「System.Windows.Forms名前空間のFormクラス」という意味になる。
名前空間の内容が「System.Windows.Forms」というように、「.」でさらに細かく分かれているが、このように名前空間は大分類/中分類/小分類のように階層的な分類を構成することが可能である。
これを現実世界の階層的な分類で置き換えるなら、「日本の東京の○○ソフト会社」(=名前空間)の「山田」(=クラス)と表現するのと同じである。

 ちなみに、言うまでもなく、このSystem.Windows.Forms名前空間のFormクラスは、.NETのクラスライブラリにあらかじめ用意されたクラスである。

 
Windowsアプリのひな型コードでは、System.Windows.Forms名前空間だけでなく、さまざまな名前空間が宣言されている。これらの名前空間とその内容を次の表にまとめた
名前空間 内容
System データ型、イベント、インターフェース、属性、処理例外を定義する基本的なクラスが含まれている名前空間
System.Collections.Generic リスト、キュー、ディクショナリなど、オブジェクトのさまざまなコレクションを定義するインターフェースとクラスが含まれている名前空間
System.ComponentModel コンポーネントとコントロールの実行時およびデザイン時の動作を実装するためのクラスが含まれている名前空間
System.Data データベースやXMLの処理を行うためのクラスが含まれている名前空間
System.Drawing グラフィックス機能を使うためのクラスが含まれている名前空間
System.Linq LINQ(Language-Integrated Query:統合言語クエリ)を使用した問い合わせ構文を記述するのに必要なクラスが含まれている名前空間
System.Text 文字列を操作するためのクラスが含まれている名前空間
System.Threading.Tasks 同時実行されるコードや非同期に実行されるコードを記述するのに役立つ型が含まれている名前空間
System.Windows.Forms Windowsアプリを作成するためのクラスが含まれている名前空間
usingディレクティブによってひな型コードに追加される名前空間




3.アプリのエントリポイント
クラスのインスタンスが生成されるきっかけとなる「エントリポイント」

 ひな型コード(プロジェクトの新規作成時のコード)には、WindowsFormsApplication1名前空間のForm1クラスという要素があることが分かった。
このForm1クラスは.NETプログラムのウィンドウの「元の姿」である。
つまりソースコードは、実体そのもの(=ウィンドウ)ではなく、実体を構築するための設計図(=元の姿)でしかない。

 例えば現実世界では、DNAという設計図に基づいて実体(=人間)が生まれる。
それと同じように、プログラミングの世界でも、クラスのコードという設計図に基づいて実体(=インスタンス)が生成されるのである(なお、「クラスのインスタンス」として生成されたものが「オブジェクト」なので、ここで覚えておいてほしい)。

 現実世界の人間を最初に創造したのは誰か分からないが、ここでは便宜上「創造者」としておこう。
プログラミングの世界では、この創造者が誰かということは、はっきりしている。
クラスという設計図からオブジェクトを作り出す創造者は、Windowsシステム(厳密には.NET Frameworkの実行エンジン)である。

 しかし、Windowsシステムが全てのオブジェクトを作り出すわけではない。
ただ単に、そのきっかけを作っているだけである。
きっかけが作られた後は、あるオブジェクトが次々に新しいオブジェクトを作成していき、最終的にそれらのオブジェクト同士の結び付きややりとりによってプログラム全体が実行されることになる。
これは現実世界で、人間が人間を生んでいき、最終的にそれらの人間同士の結び付きとやりとりによって社会全体が回っていくことに似ている。

 プログラミングの世界では、これらのオブジェクトが生誕する最初のきっかけとなる場所は、「エントリポイント」と呼ばれる。

アプリのメインエントリポイント「Mainメソッド」

 C#ではWindowsフォームアプリやコンソールアプリのエントリポイントは「Mainメソッド」である。
そのため、プログラム内に最低一つのMainメソッドが必要となる
(なおVBでは、このMainメソッドを省略できるが、その際には暗黙的にプログラム内にMainメソッドが作成される)。

 次のコードを見ると、確かにソースファイルの中にMainメソッドがあるのが確認できる。
MainメソッドがあるのはProgram.csファイルである

……前略……
namespace WindowsFormsApplication1
{
  static class Program
  {
   ……中略……
   ///
   /// アプリケーションのメイン エントリ ポイントです。
   ///

   [STAThread]
  static void Main()
   {
   ……中略……
   }
  }
}

ひな型ソースコードの中のエントリポイントであるMainメソッド
アプリには一つ以上のエントリポイントが必要である。

 Mainメソッドについて解説する前に、Programクラスと「///」で始まる行の意味について簡単に触れておこう。
 まずProgramクラスは次のように記述されている。

static class Program
{
……中略……
}

Programクラスの記述

 このコードではまずアクセシビリティが省略されている。
前述したように省略すると、自動的にinternal修飾子が付与されるため、「internal static class Program」と記述したのと等価になる。
 次に「static」という修飾子が付けられている。
static修飾子を付けたクラスは「静的クラス」と呼ばれ、先ほど説明したクラスのインスタンス化が不要になる
(※ちなみにVBには静的クラスという機能はないが、それに近いモジュール(Module)という機能が用意されている)。
静的クラスは、プログラムを実行すると、.NETの実行エンジンによって自動的に読み込まれるので、インスタンス化することなく、そのクラス内のメソッドが使えるようになる。

 またC#では、次のコードのように「//」や「///」(VBでは「'」)が記述されている行は「コメント」と呼ばれ、「//」から、その行の行末までの部分は最終的に生成されるプログラムには含まれない。

/// アプリケーションのメイン エントリ ポイントです。

コメント行
「//」(VBの場合は「'」)から行末までに書かれた内容はプログラムの動作には影響を及ぼさない。

 コメントを使えば、プログラムの内容説明や注意書きをソースコードの中に記述できる。また、既存のコードの先頭部分に「//」を記述すれば、そのコードをコメント化、つまりプログラムに含まれないようにできる(「コメントアウト」と呼ばれる)。

 上記コードのコメントの中にある「」や「」はコードコメントと呼ばれ、ソースコードからAPIリファレンスを作成するためのものだ

メソッドを定義するには?
メソッドとは、簡単にいうと、右から入力を受け取り、左へ出力するための、変換機のようなものだ。

 右の入力部分は「パラメーター(引数:ひきすう)」と呼ばれ、メソッドによってその数は変わる。
左の出力は「戻り値」と呼ばれ、必ず1個か0個になる。
戻り値が0個(=何も出力しない)の場合は、C#では「void」と表記すればよい(「なし」という意味。「ボイド」と発音する。
VBで「なし」の場合は戻り値を省略する)。
メソッドの実際の処理は、先ほどのクラスや名前空間と同じように {……} のスコープ内で行われる。

 Windowsアプリのひな型コードのMainメソッドは、「void Main()」となっているので、パラメーターは0個で(=省略されていて)、戻り値は「void」(=なし)である。

定義済みのメソッドを使用するには?
 次に定義済みのメソッドを使用する方法を簡単に紹介しておこう。といっても難しくはない。
メソッドの使用パターンは、次の図のパターン1のように「処理結果である戻り値を変数に代入するか」、
パターン2のように「戻り値を無視するか(=結果は不要で、メソッドの処理だけを実行するか)」の2通りしかない。

※メソッドの使用パターン1
 変数の型 変数 = DoSomeWork(パラメータ1、パラメータ2・・・);
※メソッドの使用パターン2
 DosomeWork(パラメータ1、パラメータ2・・・);

プログラミングの世界におけるメソッドの使用方法(C#)
定義済みのメソッドを使用する方法は、「処理結果である戻り値を変数に代入するか」、パターン2のように「戻り値を無視するか(=結果は不要で、メソッドの処理だけを実行するか)」の2通りしかない。

 変数の型とは、変数の種類(例えば、数値、文字例、Windowsフォーム、ボタンコントロールなどのクラスの種類)のことである。
また変数とは、値(=データ)を格納するための領域(=データを格納する箱のようなもの)である。
例えば「int num;」と記述した場合、int型(=数値型)のnum変数ということになる。

 「=」は代入するという意味なので、パターン1の「変数の型 変数 = DoSomeWork(パラメーター1, パラメーター2……)」は「パラメーター1、パラメーター2に入力を渡してDoSomeWorkメソッドの処理を行わせ、その処理結果を戻り値として受け取って(変数の型の)変数に代入する」という意味になる。

 メソッドの最後にある「;(セミコロン)」は、C#でプログラム上の1文(=1ステートメント)を区切るためのキーワードである。
つまり、1行に「;」を複数記述すれば、1行内に複数の文を記述できるし、複数行の最後に「;」を一つ記述すれば、複数行に一つの文を記述できる
(VBは、基本的に改行により1文を区切るため、通常は1行=1文となる。なお改行の最後に「_」を付加して連結すれば、VBでも複数行にまたがる1文を記述することは可能。さらにVB 2010以降では、改行だけで複数行にまたがる1文を記述できるようになっている)。



4.Mainメソッドの内容の理解
Windowsフォームアプリやコンソールアプリのエントリポイント(スタート位置)は「Mainメソッド」である

※Mainメソッドの書き方


[STAThread]
static void Main()
{
……中略……
}


上記のMainメソッドは、「STAThread属性を持つ静的なメソッドMainであり、戻り値はない」
メソッドの前に、[ …… ](角かっこ)で記述されるコードは「属性」と呼ばれる.NET言語特有の機能である
(VBの場合は、暗黙的にSTAThread属性が設定されるので、必ずしも記述する必要はない)

static = 実態無し静的メソッド?
 (VBではSharedキーワード)で修飾されたメソッドは静的メソッドと呼ばれ、クラスの実体(つまりオブジェクト)がなくても呼び出すことができる。
 一方、静的メソッド以外のメソッドを呼び出すためには、必ずそのメソッドが所属するクラスのオブジェクトが必要になる

 Mainメソッドは、オブジェクトを作成するためのきっかけとして呼ばれるもので、それが呼ばれる時点では、オブジェクトが一つも存在していない。よって、オブジェクトなしでメソッドへのアクセスを可能にするstaticキーワード(VBではSharedキーワード)が必要になるのである。

 staticキーワードの次に記述されている「void Main()」が実際のMainメソッドである。


5.Application.Runメソッドの理解
 Application.Runメソッドは、その英語のメソッド名を見れば分かるように、「アプリ(=Application)を実行する(=Run)」ための処理を行っている。
実際には、Application.Runメソッドでは、Windowsアプリの「メッセージループ(=メッセージポンプ)」処理が行われる。

 メッセージループとは、簡単にいえば、プログラムを終了するコードが呼び出されない限り、処理をずっと実行し続けるための仕組みである。
つまり、「Application.Run(new Form1());」というコードが実行するメッセージループ処理では、Form1が終了しない限り、Form1の処理をずっと実行し続けることになる。
もしForm1が終了すれば、それによりApplication.Runメソッド(=メッセージループ処理)が終了する。
Mainメソッド内には、他に実行するメソッドはないので、ここでアプリ自体が終了となる。

 Windowsアプリの実行を正しく理解するには、Windowsのメッセージループの仕組みについてもよく知っておく必要があるので、ここでもう少し詳しく解説しておこう。

 Windowsでは、アプリの実行はWindowsメッセージ(=処理実行の単位)を順次処理していくことで実現されている。
例えば次の三つのメッセージを順番に処理することで「アプリ画面の表示」という処理が実現できる
(説明の便宜上、メッセージ内容は簡略化している)。
1.アプリの画面を作成するためのメッセージ
2.作成された画面を表示するためのメッセージ
3.表示された画面を描画するためのメッセージ

 これら三つのメッセージは、メッセージキューと呼ばれるメッセージ処理の順番待ちリストに追加される。
メッセージループは、キューにたまったメッセージリストを定期的に参照して、メッセージがあれば古いものから順番に取り出して一つずつ処理する。
身近な例でいえば、WindowsメールやOutlook Expressなどのメーラーで、古いメールから1件ずつ読んでいくところを想像してみるとよいだろう。

 このようにWindowsのメッセージループでは、メッセージキューにたまる順番待ちのメッセージリストを、ループしながら(=一定間隔で)ひたすらチェックして、メッセージが来たら1件ずつそのメッセージを処理する。
このメッセージループ処理こそが、Windowsアプリを動作させる基盤となる仕組みである。



6.ひな形コード全体の流れ
 まとめとして、これまでの全ての処理の流れを、Mainメソッドから順番に追っていくことにしよう。

1.アプリのエントリポイントであるMainメソッドが、Windowsシステム(厳密には.NETの実行エンジン)によって呼び出される

2.呼び出されたMainメソッドは、Form1オブジェクトを生成し、そのForm1オブジェクトを使ってメッセージループを開始するためにApplication.Runメソッドを呼び出す。これによりForm1オブジェクト、すなわちWindowsフォーム画面が実行されることになる

3.Windowsフォームを初期化するために、コンストラクターのForm1メソッドが呼び出され、Form1メソッドからInitializeComponentメソッドが呼び出される
(実際には、2の「Form1オブジェクト生成」のタイミングで、これらの処理が行われる)

4.InitializeComponentメソッド内でForm1オブジェクト(=Windowsフォーム画面)の初期値などを設定する
(実際には、2の「Form1オブジェクト生成」のタイミングで、この処理が行われる)

5.Windowsフォーム画面が開かれ、ユーザーがフォーム画面を操作できるようになる
(実際には、2の「Application.Runメソッド呼び出し」中に、この処理が行われる)

6.実行中のプログラムの右上の[×]ボタンを押せばWindowsフォーム画面が閉じられる
(実際には、2の「Application.Runメソッド呼び出し」中に、この処理が行われる)

7.Form1オブジェクトのDisposeメソッドが呼ばれて、終了処理が行われる
(実際には、2の「Application.Runメソッド呼び出し」中に、この処理が行われる)

8.Application.Runメソッドが終了し、Mainメソッドの中の処理が全て完了するので、アプリ自体が終了する




※余談
Visual Basicと言う位なので視覚的で基本的で使いやすい!
のかと思いきや自分は低級言語のアセンブラ言語でプログラミングしていたので、
Visual Basicは高級言語の為、他人が決めた構文(文法・宣言の仕方等)や概念(オブジェクト指向・プラットフォーム等)を覚えなくてはならない。
頭の切り替えが中々できない!^^;

「高級言語」
高級言語とは、プログラミング言語のうち、より自然語に近く、人間にとって理解しやすい構文や概念を持った言語の総称である。
高級言語は、主に英単語や記号などを組み合わせて命令を記述し、コンパイラやインタープリタなどで機械語に変換され、実行される。より機械語に近い言語で記述を行う低級言語(低水準言語)と比べて、言語の理解がしやすく、また汎用性が高いという利点がある。
代表的な高級言語の種類としては、BASIC、FORTRAN、COBOL、C言語、C++、Java、Pascal、Lisp、Prolog、Smalltalkなどがある。現在行われているプログラミング作業は、ほとんどが高級言語によって行われている  「weblio辞書」より引用

文法を覚えるには時間が掛かりすぎるため、サンプルプログラムやJRA-VANの開発支援を使った際、「やさしいVisual Basic文法 - VB ADO.NET サンプル」をその都度活用させていただく事にした。

COMMENTS

0 Comments

There are no comments yet.

REPLY

Leave a reply