• 検索結果がありません。

何時何処で誰が

N/A
N/A
Protected

Academic year: 2021

シェア "何時何処で誰が"

Copied!
11
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラムの概要

表示タブでは、表示ボタンをクリッ クする度に、各文節がランダムに選 択されて表示される。 編集タブでは、新たに文章を入力し て追加したり、既存の文章を訂正し て更新したり、不要の文章を削除し たりする事が出来る。 亦、先頭や末尾、1つ前や1つ後の レコードに移動する為のボタンも 用意する。 今回は、ファイルアクセスの基礎と 成るシーケンシャルファイルの入 出力全般に付いて学習します。

何時何処で誰が

VB 2005 ② □ 単純変数・配列変数の宣言(Private、Dim) □ 構造体(ユーザー定義型)の宣言(Structure) □ 標準コントロール・コントロール配列の利用(TabControl、Label、TextBox、Button) □ プロパティの値の取得と設定(StartupPath、Tag、Text、Enabled) □ イベントの利用(Load、Click)

□ ステートメントの利用(Structure 、Call、End、Exit Sub) □ 組込関数の利用(Randomize、Rnd、Dir、Int、Trim、CStr)

□ 演算子(代入演算子、算術演算子、比較演算子、論理演算子、結合演算子)

□ 制御構造構文(条件分岐 If ~ Then、Select Case、ループ処理 For ~ Next、Do ~ Loop) □ コンテナコントロールの利用(タブコントロール) □ ファイル入出力(シーケンシャルファイルの入出力 FileOpen、FileClose、PrintLine、Input) 今回の課題項目 □ シーケンシャルファイルの入出力(FileOpen、Input、PrintLine、FileClose) 今回の重点項目 □ パスワードも保存して登録者以外は訂正・削除出来ない様に改良する。 □ データの検索機能と一覧表示機能を付加してデータベース化する。 今回の応用項目

(2)

■ オブジェクト・プロパティ一覧 ① ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name Form1 Text 何時何処で誰がゲーム タブコントロール Name tabStage Text 表示(TabPage1) 編集(TabPage2) ラベル1 Name lblWhenD Text 何時 ラベル2 Name lblWhereD Text 何処で ラベル3 Name lblWhoD Text 誰が ラベル4 Name lblWhatD Text 何をした テキストボックス1 Name txtWhenD Text 空白 テキストボックス2 Name txtWhereD Text 空白 テキストボックス3 Name txtWhoD Text 空白 テキストボックス4 Name txtWhatD Text 空白 ボタン1 Name btnDisp Text 表示 ボタン2 Name btnLoad Text 読込 ボタン3 Name btnFinish Text 終了 ラベル1 ラベル2 ラベル3 ラベル4 テキスト1 テキスト2 テキスト3 テキスト4 タブコントロール ボタン1 ボタン3 ボタン2 TabPages 属性で設定

(3)

■ オブジェクト・プロパティ一覧 ② ■ コントロールの種類 プロパティ プロパティの設定値 ラベル5 Name lblWhenE Text 何時 ラベル6 Name lblWhereE Text 何処で ラベル7 Name lblWhoE Text 誰が ラベル8 Name lblWhatE Text 何をした ラベル9 Name lblNumber AutoSize False Text、TextAlign 空白、MiddleCenter テキストボックス5 Name txtWhenE Text 空白 テキストボックス6 Name txtWhereE Text 空白 テキストボックス7 Name txtWhoE Text 空白 テキストボックス8 Name txtWhatE Text 空白 ボタン4 Name btnInsert Text 追加 Tag 1 ボタン5 Name btnUpdate Text 訂正 Tag 2 ボタン6 Name btnDelete Text 削除 Tag 3 ボタン10 ボタン4 ラベル9 ラベル5 ラベル6 ラベル7 ラベル8 テキスト5 テキスト6 テキスト7 テキスト8 ボタン5 ボタン6 ボタン9 ボタン8 ボタン7

(4)

コントロールの種類 プロパティ プロパティの設定値 ボタン7 Name btnFirst Text 空白 tag 1 Image first.gif ボタン8 Name btnPrev Text 空白 tag 2 Image prev.gif ボタン9 Name btnNext Text 空白 tag 3 Image next.gif ボタン10 Name btnLast Text 空白 tag 4 Image last.gif (Font、ForeColor、BackColor 等のプロパティは任意に設定して下さい) ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したりす る事は出来ない。 テキストボックス テキストの入力や表示を行うコントロール。此のテキストは、ユーザーが直接入力したり変更 したりする事が出来る。 ボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OKボタンや実行ボタ ン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールです。 タブコントロール 複数のタブを表示するコントロール。各タブは、他のコントロールのコンテナと仕て機能し、 アクティブなタブに配置されたコントロールだけが表示される。

(5)

■ プログラムリスト ■

Public Class Form1

' フォームレベルでグローバルな構造体の宣言 Private Structure WordData

Dim ItemWhen As String Dim ItemWhere As String Dim ItemWho As String Dim ItemWhat As String End Structure

' フォームレベルでグローバルな定数の宣言 Private Const MAX As Integer = 100

' フォームレベルでグローバルな変数の宣言 Private SD As String

Private WD(MAX) As WordData Private CNT As Integer Private PTR As Integer

' フォームが読み込まれた時の処理

Private Sub Form1_Load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load

SD = Application.StartupPath : If Not SD.EndsWith("¥") Then SD &= "¥" Randomize( ) : Call DataLoad( )

End Sub

' ボタン(表示)がクリックされた時の処理

Private Sub btnDisp_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnDisp.Click

Dim R As Integer

R = Int( Rnd( ) * CNT + 1 ) : txtWhenD.Text = WD( R ).ItemWhen R = Int( Rnd( ) * CNT + 1 ) : txtWhereD.Text = WD( R ).ItemWhere R = Int( Rnd( ) * CNT + 1 ) : txtWhoD.Text = WD( R ).ItemWho R = Int( Rnd( ) * CNT + 1 ) : txtWhatD.Text = WD( R ).ItemWhat End Sub

' ボタン(読込)がクリックされた時の処理

Private Sub btnLoad_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnLoad.Click Call DataLoad( ) End Sub Structure ステートメントは、1 個、又は、複数の要素を持つデー タ型を宣言する。 レコード内のフィールドを定義す るのに用いられる。 定数を使用すると、プログラムの 可読性が高まり、修正が容易に成 る。定数は、変数とは異なり、プ ログラムの実行中に値を変更する 事は出来ない。 此処で宣言した変数は同じフォー ム内の総てのサブプロシージャで 値の参照と設定を行う事が出来 る。 Application.StartupPath には起 動したアプリケーションのパスが 格納されて居る。 Rnd 関数は0以上、1 未満の範囲の単精度浮 動小数点型の乱数を返 す。亦、Int 関数は、引 数を超え無い最大の整 数を返す。此処では、 配列の範囲内の数値 1 からCNT を得て居る。

(6)

' ボタン(追加、訂正、削除)がクリックされた時の処理

Private Sub btnInsert_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnInsert.Click, btnUpdate.Click, btnDelete.Click

Dim I As Integer Select Case sender.tag Case 1

If CNT + 1 > MAX Then Exit Sub CNT += 1

WD( CNT ).ItemWhen = txtWhenE.Text WD( CNT ).ItemWhere = txtWhereE.Text WD( CNT ).ItemWho = txtWhoE.Text WD( CNT ).ItemWhat = txtWhatE.Text

FileOpen( 1, SD & "5w1h.dat", OpenMode.Append ) Call DataSave( CNT ) FileClose( 1 ) PTR = CNT : Call DataDisp( ) Case 2 WD( PTR ).ItemWhen = txtWhenE.Text WD( PTR ).ItemWhere = txtWhereE.Text WD( PTR ).ItemWho = txtWhoE.Text WD( PTR ).ItemWhat = txtWhatE.Text

FileOpen( 1, SD & "5w1h.dat", OpenMode.Output ) For I = 1 To CNT : Call DataSave( I ) : Next I FileClose( 1 )

Case 3

For I = PTR To ( CNT – 1 ): WD( I ) = WD( I + 1 ): Next CNT -= 1

FileOpen( 1, SD & "5w1h.dat", OpenMode.Output ) For I = 1 To CNT : Call DataSave( I ) : Next I FileClose( 1 ) If PTR > CNT Then PTR = CNT Call DataDisp( ) End Select End Sub ' ボタン(|<、<、>、>|)がクリックされた時の処理

Private Sub btnFirst_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnFirst.Click, btnPrev.Click, btnNext.Click, btnLast.Click

Select Case sender.tag Case 1 : PTR = 1

Case 2 : If PTR = 1 Then PTR = CNT Else PTR -= 1 Case 3 : If PTR = CNT Then PTR = 1 Else PTR += 1 Case 4 : PTR = CNT End Select Call DataDisp( ) End Sub 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 Exit Sub ステートメントは、以降 のコードを実行せずに、直ちに Sub プロシージャを抜ける命令で 有る。 Call は Sub プロシージャ等に制 御を渡すステートメントで有る。 必要が有れば、引数を指定する事 で、変数、配列、式の孰れかをプ ロシージャに引き渡す事が出来 る。 文が短い場合には、コロンで区切 り、1行に複数の文を記述する事 が出来る。此れをマルチステート メントと謂う。 ユーザー定義型を構成する各要素 に値を代入する。 各要素は、ユーザー定義型変数の 後にドットで区切り要素名を記述 する。 此処では、削除したデータ以降の データを1個宛前に移動して居 る。

(7)

' ボタン(終了)がクリックされた時の処理

Private Sub btnFinish_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnFinish.Click

Me.Dispose( ) : End End Sub

' データを書き込むジェネラルプロシージャ Private Sub DataSave( ByVal P As Integer ) Dim S As String

S = WD( P ).ItemWhen & "," & WD( P ).ItemWhere & "," S &= WD( P ).ItemWho & "," & WD( P ).ItemWhat

PrintLine( 1, S ) End Sub

' データを読み込むジェネラルプロシージャ Private Sub DataLoad( )

If Not Dir( SD & "5w1h.dat", FileAttribute.Normal ) = "" Then FileOpen( 1, SD & "5w1h.dat", OpenMode.Input )

CNT = 0

Do While Not EOF( 1 ) CNT += 1 Input( 1, WD( CNT ).ItemWhen ) Input( 1, WD( CNT ).ItemWhere ) Input( 1, WD( CNT ).ItemWho ) Input( 1, WD( CNT ).ItemWhat ) Loop FileClose( 1 ) PTR = 1 : Call DataDisp( ) btnDisp.Enabled = True Else btnDisp.Enabled = False End If End Sub ' データを表示するジェネラルプロシージャ Private Sub DataDisp( )

txtWhenE.Text = WD( PTR ).ItemWhen txtWhereE.Text = WD( PTR ).ItemWhere txtWhoE.Text = WD( PTR ).ItemWho txtWhatE.Text = WD( PTR ).ItemWhat

lblNumber.Text = CStr( PTR ) & "/" & CStr( CNT ) End Sub End Class アプリケーションを終了する場 合、Dispose メソッドで、正しく プログラムをメモリから消去して 終了する事が望ましい。 此処ではファイルの有無をDir 関 数を用いて調べて居る。入力モー ドでファイルを開いた場合、指定 したファイルが存在し無いと、エ ラーが発生する為、先ずファイル の存在を確認してから、ファイル を開く事が望ましい。 猶、Dir 関数は、指定したファイ ルが存在し無いと、ヌルストリン グを返す。 Not は否定を意味し、論理式が真 の場合は偽に、偽の場合は真に成 る。 頻繁に行う処理は、名前を付け、 一纏めに仕て置き、其の処理を必 要とする箇所よりコール(呼出) する事で、対象のコードを実行す る事が出来る。

(8)

Structure ステートメントに依る独自のデータ型の作成 構造体(旧称:ユーザー定義型)を作成するステートメント Structure 構造体名 Public|Private 要素名1 As データ型 Public|Private 要素名2 As データ型 … End Structure Visual Basic がサポートする複数のデータ型を組み合わせて、独自のデータ型を作成する。 構造体は、ランダムファイルアクセスやAPI 関数呼出用構造体定義等、データ型の異なる多数の関連す る要素で構成されるデータレコードで良く使用される。亦、各要素には、配列を指定する事も出来、静 的配列と動的配列の孰れも使用する事が出来る。猶、データ型は、Option Strict が On に成って居る場 合、必ず指定し、省略する事は出来ない。 Structure ステートメントを記述する事が出来るのは、モジュール、名前空間、又は、ファイルレベル 丈で有る。詰まり、構造体は、ソースファイル内、又は、モジュール、インターフェイス、クラスの中 では宣言する事が出来るが、プロシージャの中では宣言する事は出来ない。亦、構造体の内部で別の構 造体を定義する事が出来るが、外側の構造体を通して内側の構造体のメンバにアクセスする事は出来な い。内側の構造体のメンバにアクセスするには、内側の構造体のデータ型の変数を宣言する必要が有る。 構造体には、構造体が宣言されたモジュールやクラスの何処からでもアクセスする事が出来る。構造体 のアクセシビリティ(有効範囲)は、既定で Friend に成る。構造体のアクセシビリティを詳細に指定 するには、Public、Protected、Friend、Protected Friend、Private の各キーワードを Structure ステ ートメントに指定する。 宣言した構造体は、Visual Basic の他のデータ型と粗同様に使用する事が出来る。即ち、構造体を作成 すれば、其の型でプロシージャレベルの変数、及び、モジュールレベルの変数を宣言する事が出来る。 Public|Private|Dim 変数名 As 構造体名 ※ クラスやモジュールでは、Dim ステートメントを使用して宣言された構造体のアクセシビリティは 既定でPublic に成る。構造体をプライベートにする場合は、Private キーワードを使用して宣言する。 構造体で宣言された変数は、複数の要素(データメンバ=フィールド)を持つ事に成り、各要素の参照 は、変数名の後ろにピリオドに続き要素名を記述する。 代入変数|プロパティ = 構造体型変数名.要素名 両方の変数の構造体が同じ型の場合は、或る変数を別の変数に代入する事が出来る。此の場合は、一方 の構造体の総ての要素が他方の構造体の対応する要素にコピーされる。 ※ 構造体の宣言で構造体のメンバを初期化する事は出来ない。構造体型の変数を宣言する時は、変数 を通してメンバにアクセスする事に依り、メンバに値を代入する。 ※ 以前のバージョンの Visual Basic(VB6)でサポートされて居たユーザー定義型(User-Defined Type)は、Visual Basic.NET 以降では構造体に統合された。 機 能 書 式 解 説

(9)

FileOpen 関数に依るファイルのオープン(シーケンシャルアクセス) (再掲) 入出力を行う為にファイルを開く関数 Open( ファイル番号, ファイル名, モード ) ファイルを開いてファイルへのアクセス(入出力)が出来る様にする。 入出力処理を行う為には、其の対象と成るファイルを開く必要が有る。FileOpen 関数はファイルに入 出力の為のバッファを割り当て、バッファに対するアクセス モードを決定する。 引数のファイル番号には、其の時点でユニークなファイル番号を指定し、省略する事は出来ない。 引数のファイル名には、オープンするファイル名を指定し、省略する事は出来ない。 引数のモードには、シーケンシャルアクセスでは、下記のOpenMode 列挙型の孰れかを指定する。 1.OpenMode.Input : 入力モード(ファイルからデータを読み込む) 2.OpenMode.Output : 出力モード(ファイルにデータを書き込む/上書きする) 3.OpenMode.Append : 出力モード(ファイルにデータを書き込む/追加する) ファイル番号には、ファイルハンドラと成る1~511 の範囲の整数値を指定する。FreeFile 関数を使用 すると、次に使用可能なファイル番号を取得する事が出来る。 ファイル名には、ドライブ名やディレクトリ名(フォルダ名)を含める事が出来る。猶、VB エディタ 上でも正しく動作させる為に、ドライブ名からのフルパスで指定する事が望ましい。 Input 関数に依るデータの読込(シーケンシャルファイル) (再掲) シーケンシャル入力モードで開いたファイルよりデータを読み込む関数 Input( ファイル番号, 変数名 ) シーケンシャルファイルよりデータを読み込んで変数に格納する。 引数のファイル番号には、入力用と仕てオープンした時に使用したファイル番号を指定する。 引数の変数名には、読み込んだデータを格納する変数の名前を指定する。 猶、VB6 の様に、変数名をカンマ(,)で区切り、複数指定する事は出来ない。 ファイル内のデータ項目の順番は、引数で指定した変数の順番と一致して居る必要が有る。亦、ファイ ル内の各データ項目のデータ型は、対応する変数のデータ型と一致して居なければ成らない。通常、フ ァイルからデータを読み込む場合、文字列データは文字列型、数値データは数値データ型として格納さ れるが、変数が数値データ型で読み込むデータが数値データ型で無い場合、変数には0が代入される。 データを入力して居る時に、ファイルの末尾に達すると、EOF 関数の値が真(True)に設定されるの で、読み込み位置がファイルの末尾に達したか何うかを確かめる事が出来る。猶、ファイルの末尾に達 した後、入力を行うと、入力が終了し、エラーが発生する。 シーケンシャルファイル内の各データは、カンマ、又は、改行を区切り記号(デリミタ)として区切ら れる。文字列データを引用するダブルクォーテーション(”)は無視される。 機 能 書 式 解 説 機 能 書 式 解 説

(10)

Print、PrintLine 関数に依るデータの書込(シーケンシャルファイル) シーケンシャル出力モードで開いたファイルにデータを書き込む関数 Print( ファイル番号, 出力値 [, 出力値 … ] ) PrintLine( ファイル番号, 出力値 [, 出力値 … ] ) 出力値をシーケンシャルファイルに書き込む。 引数のファイル番号には、出力用と仕てオープンした時に使用したファイル番号を指定する。 引数の出力値には、ファイルに書き込むデータを数式、文字列式、変数名で指定する。 Print 関数には、行末にラインフィード(改行)が含まれないが、PrintLine 関数にはラインフィード が含まれる。即ち、Print 関数では、後続の出力は、最後の出力の直後から出力されるが、PrintLine 関数では、後続の出力は、次の行の先頭から出力される。 出力値に、複数の式をカンマで区切って指定する事が出来る。此の場合、各出力値は、タブ境界に合わ せて配置されるが、カンマとTAB が混在して居ると、結果が乱れる可能性が有る。 シーケンシャルファイル内の各データは、コンマ、又は、改行を区切り記号(デリミタ)として区切ら れる為、Print 関数や PrintLine 関数で複数のデータを書き込む為には、各データの区切りに、明示的 に、カンマ、又は、改行を出力して遣る必要が有る。即ち、1行内で複数の出力値を記述する時には、 各出力値の間に、”,” 又は Chr(44) を出力する。亦、カンマや改行を含む文字列を出力する場合は、出 力値をダブルコーテーション( " )又は Chr(34)で囲む様に出力する。 Print 関数や PrintLine 関数を使用して書き込んだデータは、総て国別情報(ロケール)に対応して居 り、書き込まれたデータは、適切な小数点記号を使用して書式設定される。複数のロケールで使用出来 る様にデータを出力するには、Write 関数や WriteLine 関数を使用する。 FileClose 関数に依るファイルのクローズ (再掲) ファイルを閉じるステートメント FileClose( ファイル番号 ) ファイル番号に対応するファイルを閉じる。 引数のファイル番号には、オープンした時に使用したファイル番号を指定する。 複数のファイルを開いて居る場合には、カンマで区切り、複数指定する事も出来る。亦、ファイル番号 を省略した時には、其の時点で開いて居る総てのファイルを閉じる。 Close ステートメントでファイルを閉じると、其のファイルに割り当てられて居たファイル番号は解放 され、再び使用する事が出来る様に成る。 シーケンシャル出力モード(Output 又は Append)で開いたファイルを閉じた時、出力バッファに残 存して居るデータは、其のファイルに対するオペレーティングシステムバッファに書き込まれ、閉じた ファイルが使用して居たバッファ領域は総て解放される。 機 能 書 式 解 説 機 能 書 式 解 説

(11)

ファイルの入出力 データをファイルから読み込んだり、ファイルに書き込む時は、対象に成るファイルをオープン してから処理を行い、其の後、ファイルをクローズすると言う手順が必要と成る。オープンした ファイルには、ファイル番号を付けて管理する。 シーケンシャルファイル データがファイルに書き込まれた順に保存されて居るファイルで、原則として先頭から順番に読 み書きする必要が有り、データの一部を変更する事は出来ない。 シーケンシャルファイル読込の処理手順

FileOpen( 1, “squid.dat”, OpenMode.Input )

Input( 1, D1 ) Input( 1, D2 ) Input( 1, D3 ) Input( 1, D4 ) FileClose( 1 ) シーケンシャルファイル書込の処理手順

FileOpen( 1, “squid.dat”, OpenMode.Output )

Print( 1, 123 ) Print( 1, “,” ) PrintLine( 1, “abc” ) FileClose( 1 )

aa,bb↲

cc,dd↲

squid.dat squid.dat Open aa が D1 に読み込まれる bb が D2 に読み込まれる cc が D3 に読み込まれる dd が D4 に読み込まれる 入力モードでファイルを開く 総てのデータを読み込んだ時点でEOF(1)が True に成る squid.dat 上書モードでファイルを開く

123,abc↲

squid.dat Open 数値123 が書き込まれる 文字列 abc が書き込まれる 末尾に ; が無いので 改行 ↲ も出力される 文字列 , が書き込まれる

参照

関連したドキュメント

上記⑴により期限内に意見を提出した利害関係者から追加意見書の提出の申出があり、やむ

把握率 全電源のCO 2 排出係数 0.505. (火力発電のCO 2

(火力発電のCO 2 排出係数) - 調整後CO 2 排出係数 0.521 全電源のCO 2 排出係数

理由:ボイラー MCR範囲内の 定格出力超過出 力は技術評価に て問題なしと確 認 済 み で あ る が、複数の火力

機排水口の放出管理目標値を示す。 画においては1号機排水口~4号機排水口の放出管理目標値を設定していない。.. 福島第二原子力発電所 )

Dual I/O リードコマンドは、SI/SIO0、SO/SIO1 のピン機能が入出力に切り替わり、アドレス入力 とデータ出力の両方を x2

(2)燃料GMは,定格熱出力一定運転にあたり,原子炉熱出力について運転管理目標を

(2,3 号機 O.P12,000)換気に要する時間は 1 号機 11 時間、 2,3 号機 13 時間である)。再 臨界時出力は保守的に最大値 414kW