Windows APIを使ったプログラム

Springfield > Windows API

● Visual Studio .NET C++のダイアログ

ファイル > 新規作成 > プロジェクト
Visual C++プロジェクト > Windowsフォームアプリケーション
プロジェクト名:CardReader01
場所:D:\takase\Control
新しいソリューション名:CardReader01
[ OK ]

フォームのサイズ変更
フォームをクリックしてハンドルをドラッグして大きさを調整する。

メニューの配置
ツールボックスの[MainMenu]を選択してフォームへドロップ

ラベルの配置
ツールボックスの[Label]を選択してフォームへドロップ

テキストボックスの配置
ツールボックスの[TextBox]を選択してフォームへドロップ

リストボックスの配置
ツールボックスの[ListBox]を選択してフォームへドロップ、大きさをハンドルで調整する。

●オブジェクトの名前
フォーム、ラベルなどのコントロール・オブジェクトを選択し、右下のプロパティウィンドウを使ってオブジェクト名とプロパティを以下のように変更する。

コントロール オブジェクト名 Textプロパティ
フォーム
Form1
カードリーダ
ラベル
label1
カードデータ
テクストボックス
textBox1
(空白)
リストボックス
listBox1

●メニューの作成
[ファイル]メニューを次のようにして作成する。

フォームを選択する

プロパティウィンドウ
Menuプロパティの▼をクリックし、[mainMenu1]を選択する。

コンポーネントトレイの[mainMenu1]を選択する。

フォームに表示された「ここへ入力」をクリック
ファイル(&F)と入力する
同様に下のサブメニュー項目を以下のように入力する。
開く(&O)
上書き保存(&S)
名前を付けて保存(&A)
閉じる(&C)

●ビルドと動作確認
ビルド > ソリューションのビルド
デバッグ > デバッグなしで開始

エラーなくビルドされ実行すると作成したフォームが表示されれば成功です。

■イベントへの対応
●データの読み込み
フォームに設定した[ファイル]メニューの[開く]を選択する。

プロパティウィンドウで、オブジェクト名(Name)の値をmenuOpenFileに変更する。

●メニューイベントの作成
●ファイルからの読み込み
Visual C++ .NETでは、出力ストリームにはSystem::IO::StreamWriterクラス、入力ストリームにはSystem::IO::StreamReaderクラスを使用します。プログラムでは、ファイルをオープンする、ファイルからデータを読み込む、ファイルをクローズする、の順番でファイルを操作します。

フォームデザイナで[ファイル]メニューの[開く]をダブルクリックする。
コードエディタに切り替わる。
自動的にmenuOpenFile_Clickメソッドが追加されるので以下のように編集する。

Form1.hファイルの先頭部分にnamespaceが記述してあります。ここに
using namespace System::IO;
を追加します。

private: System::Void menuOpenFile_Click(System::Object * sender, System::EventArgs * e)
{
  // ファイルをオープン
  StreamReader *reader = new StreamReader("sample.txt");
  // ファイルから読み込む
  String *data = reader->ReadLine();
  // ファイルをクローズ
  reader->Close();

  MessageBox::Show(data);
}

●実行してみる
テキストエディタで簡単な文を書き(StudentID: a5010など)、sample.txtというファイル名でこのプロジェクトフォルダ内に保存する。

ビルド > ソリューションのビルド
デバッグ > デバッグなしで開始

ファイル > 開く
MessageBoxにファイルの文が表示される。

● フォームのテキスト・ボックスにデータを表示

メッセージボックスに表示する代わりに、フォームに配置したテキストボックスに表示してみましょう。
// MessageBox::Show(data);とコメントにして、その下に
textBox1->Text = data;
と追加するだけです。

[ プログラムのソースコード詳細 ]

● ファイル名を指定した読み込み

ファイル名を指定して開くには、OpenFileDialogクラスを使用します。まず、そのインスタンスを作成します。次にメンバ変数でファイル形式を指定します。そして、[開く]ボタンをクリックした場合は上記の処理と同じファイルのオープン操作を実行し、[キャンセル]ボタンをクリックした場合は何もしないでダイアログを消します。ソース部分は以下のとおりです。ただし、指定したファイルがない場合に発生する例外処理は行っていません。

private: System::Void menuOpenFile_Click(System::Object * sender, System::EventArgs * e)
{
  // 開くダイアログを表示
  OpenFileDialog *dlg = new OpenFileDialog();
  dlg->Filter = "Text形式(*.txt)|*.txt|すべてのファイル(*.*)|*.*";
  if (dlg->ShowDialog() != DialogResult::OK)
  {
    return;
  }
  // ファイルをオープン
  StreamReader *reader = new StreamReader(dlg->FileName);
  // ファイルから読み込む
  String *data = reader->ReadLine();
  // ファイルをクローズ
  reader->Close();

  textBox1->Text = data;
}

● フォームのリストボックスの項目にデータを表示

リストボックスにデータを表示すると、上の行から下の行に次々とデータが追加されていきます。データの表示方法はテキストボックスと似ています。テキストボックスに表示する行の下に次の行を追加すれば、テキストボックスとリストボックスの両方に表示されます。

  listBox1->Items->Add(data);

● フォームのリストボックスからの項目の削除

テキストボックスの文字は選択して簡単に削除できます。リストボックスの場合はそれが出来ません。ファイルを開くごとにリストボックスに項目が追加されますが、このままでは不要な項目を削除できません。[削除]ボタンをクリックすれば削除できるようにしてみましょう。

Buttonの配置
ツールボックスの[Button]を選択してフォームへドロップ

Buttonを選択し、右下のプロパティウィンドウを使ってTextプロパティを「削除」に変更する。

[削除]ボタンをダブルクリックする。コードエディタに切り替わり、buttonDelete_Clickメソッドが自動的に表示される。次のようにソースコードを追加する。

private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
  // 選択している項目を取得
  int index = listBox1->SelectedIndex;
  // 項目を削除
  listBox1->Items->RemoveAt(index);
}

--------------------------------------------------------------------------------------------------------

Springfield > Windows API

Copy right y.takase since 2006