第38講 データベースソフト(住所録)の制作=並列処理の練習☆☆
第4話 何人でもデータを入れられるようにソフトを改良する
Form1コード例
#pragma once
#include"stdafx.h"
#include"Form2.h"
namespace 住所録 {
        ・
        ・
        ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          int i;
          if(n>m){
            for(i=0;i<n-m;i++){
              dataGridView1->Rows->Add();
            }
          }
          for(i=0;i<n;i++){
            dataGridView1[0,i]->Value=(i+1).ToString();
            dataGridView1[1,i]->Value=marshal_as<String^>(u[i][0]);
            dataGridView1[2,i]->Value=marshal_as<String^>(u[i][1]);
            dataGridView1[4,i]->Value=marshal_as<String^>(u[i][2]);
            dataGridView1[3,i]->Value=marshal_as<String^>(u[i][3]);
            dataGridView1[5,i]->Value=marshal_as<String^>(u[i][4]);
            dataGridView1[6,i]->Value=marshal_as<String^>(u[i][5]);
            dataGridView1[7,i]->Value=marshal_as<String^>(u[i][6]);
            dataGridView1[8,i]->Value=marshal_as<String^>(u[i][7]);
            dataGridView1[9,i]->Value=marshal_as<String^>(u[i][8]);
            dataGridView1[10,i]->Value=marshal_as<String^>(u[i][9]);
            dataGridView1[11,i]->Value=marshal_as<String^>(u[i][10]);
            dataGridView1[12,i]->Value=marshal_as<String^>(u[i][11]);
            dataGridView1[13,i]->Value=marshal_as<String^>(u[i][12]);
            dataGridView1[14,i]->Value=marshal_as<String^>(u[i][13]);
            dataGridView1[15,i]->Value=marshal_as<String^>(u[i][14]);
            dataGridView1[16,i]->Value=marshal_as<String^>(u[i][15]);
            dataGridView1[17,i]->Value=marshal_as<String^>(u[i][16]);
          }
          if(n>m)m=n;
        }

  private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
           Thread^ t=gcnew Thread(gcnew ThreadStart(f));
           t->Start();
        }
        static void f(){
           Application::Run(gcnew Form2());
        }

};
}

Form2コード例
#pragma endregion
  private: System::Void Form2_Load(System::Object^ sender, System::EventArgs^ e) {  //これは本講義初めての登場です。
           n=m;                                             //詳しくは次話で解説しますが、
           textBox15->Text=(n+1).ToString();                          //Form2本体をダブルクリックするとでてきます。
           textBox1->Text=marshal_as<String^>(u[n][1]);                  //Form2本体の意味は、まな板の材料であるボタンなどでなく、
           textBox2->Text=marshal_as<String^>(u[n][3]);                  //材料を載せているまな板そのものという意味です。
           textBox3->Text=marshal_as<String^>(u[n][4]);
           textBox4->Text=marshal_as<String^>(u[n][5]);
           textBox5->Text=marshal_as<String^>(u[n][6]);
           textBox6->Text=marshal_as<String^>(u[n][7]);
           textBox7->Text=marshal_as<String^>(u[n][8]);
           textBox8->Text=marshal_as<String^>(u[n][9]);
           textBox9->Text=marshal_as<String^>(u[n][10]);
           textBox10->Text=marshal_as<String^>(u[n][11]);
           textBox11->Text=marshal_as<String^>(u[n][12]);
           textBox12->Text=marshal_as<String^>(u[n][13]);
           textBox13->Text=marshal_as<String^>(u[n][14]);
           textBox14->Text=marshal_as<String^>(u[n][15]);
           comboBox1->Text=marshal_as<String^>(u[n][0]);
           comboBox2->Text=marshal_as<String^>(u[n][2]);
           comboBox3->Text=marshal_as<String^>(u[n][4]);
        }
  private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
           String^ w;
           w=comboBox1->Text;
           marshal_context^ c=gcnew marshal_context();
           string s=c->marshal_as<string>(w);
           u[n][0]=s;
           w=textBox1->Text;
           s=c->marshal_as<string>(w);
           u[n][1]=s;
           w=comboBox2->Text;
           s=c->marshal_as<string>(w);
           u[n][2]=s;
           w=textBox2->Text;
           s=c->marshal_as<string>(w);
           u[n][3]=s;
           w=comboBox3->Text;
           s=c->marshal_as<string>(w);
           u[n][4]=s;
           w=textBox3->Text;
           s=c->marshal_as<string>(w);
           u[n][5]=s;
           w=textBox4->Text;
           s=c->marshal_as<string>(w);
           u[n][6]=s;
           w=textBox5->Text;
           s=c->marshal_as<string>(w);
           u[n][7]=s;
           w=textBox6->Text;
           s=c->marshal_as<string>(w);
           u[n][8]=s;
           w=textBox7->Text;
           s=c->marshal_as<string>(w);
           u[n][9]=s;
           w=textBox8->Text;
           s=c->marshal_as<string>(w);
           u[n][10]=s;
           w=textBox9->Text;
           s=c->marshal_as<string>(w);
           u[n][11]=s;
           w=textBox10->Text;
           s=c->marshal_as<string>(w);
           u[n][12]=s;
           w=textBox11->Text;
           s=c->marshal_as<string>(w);
           u[n][13]=s;
           w=textBox12->Text;
           s=c->marshal_as<string>(w);
           u[n][14]=s;
           w=textBox13->Text;
           s=c->marshal_as<string>(w);
           u[n][15]=s;
           w=textBox14->Text;
           s=c->marshal_as<string>(w);
           u[n][16]=s;
           delete c;
           n++;
           textBox15->Text=(n+1).ToString();
           textBox1->Text=marshal_as<String^>(u[n][1]);
           textBox2->Text=marshal_as<String^>(u[n][3]);
           textBox3->Text=marshal_as<String^>(u[n][4]);
           textBox4->Text=marshal_as<String^>(u[n][5]);
           textBox5->Text=marshal_as<String^>(u[n][6]);
           textBox6->Text=marshal_as<String^>(u[n][7]);
           textBox7->Text=marshal_as<String^>(u[n][8]);
           textBox8->Text=marshal_as<String^>(u[n][9]);
           textBox9->Text=marshal_as<String^>(u[n][10]);
           textBox10->Text=marshal_as<String^>(u[n][11]);
           textBox11->Text=marshal_as<String^>(u[n][12]);
           textBox12->Text=marshal_as<String^>(u[n][13]);
           textBox13->Text=marshal_as<String^>(u[n][14]);
           textBox14->Text=marshal_as<String^>(u[n][15]);
           comboBox1->Text=marshal_as<String^>(u[n][0]);
           comboBox2->Text=marshal_as<String^>(u[n][2]);
           comboBox3->Text=marshal_as<String^>(u[n][4]);
        }
  private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {
           Close();
        }
  private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
           n--;
           textBox15->Text=(n+1).ToString();
           textBox1->Text=marshal_as<String^>(u[n][1]);
           textBox2->Text=marshal_as<String^>(u[n][3]);
           textBox3->Text=marshal_as<String^>(u[n][4]);
           textBox4->Text=marshal_as<String^>(u[n][5]);
           textBox5->Text=marshal_as<String^>(u[n][6]);
           textBox6->Text=marshal_as<String^>(u[n][7]);
           textBox7->Text=marshal_as<String^>(u[n][8]);
           textBox8->Text=marshal_as<String^>(u[n][9]);
           textBox9->Text=marshal_as<String^>(u[n][10]);
           textBox10->Text=marshal_as<String^>(u[n][11]);
           textBox11->Text=marshal_as<String^>(u[n][12]);
           textBox12->Text=marshal_as<String^>(u[n][13]);
           textBox13->Text=marshal_as<String^>(u[n][14]);
           textBox14->Text=marshal_as<String^>(u[n][15]);
           comboBox1->Text=marshal_as<String^>(u[n][0]);
           comboBox2->Text=marshal_as<String^>(u[n][2]);
           comboBox3->Text=marshal_as<String^>(u[n][4]);
        }
  private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
           n++;
           textBox15->Text=(n+1).ToString();
           textBox1->Text=marshal_as<String^>(u[n][1]);
           textBox2->Text=marshal_as<String^>(u[n][3]);
           textBox3->Text=marshal_as<String^>(u[n][4]);
           textBox4->Text=marshal_as<String^>(u[n][5]);
           textBox5->Text=marshal_as<String^>(u[n][6]);
           textBox6->Text=marshal_as<String^>(u[n][7]);
           textBox7->Text=marshal_as<String^>(u[n][8]);
           textBox8->Text=marshal_as<String^>(u[n][9]);
           textBox9->Text=marshal_as<String^>(u[n][10]);
           textBox10->Text=marshal_as<String^>(u[n][11]);
           textBox11->Text=marshal_as<String^>(u[n][12]);
           textBox12->Text=marshal_as<String^>(u[n][13]);
           textBox13->Text=marshal_as<String^>(u[n][14]);
           textBox14->Text=marshal_as<String^>(u[n][15]);
           comboBox1->Text=marshal_as<String^>(u[n][0]);
           comboBox2->Text=marshal_as<String^>(u[n][2]);
           comboBox3->Text=marshal_as<String^>(u[n][4]);
        }

};
}
Fom2[デザイン]
ファイル
stdafx.hコード例
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
#pragma once
#include<string>
#include<msclr/marshal.h>
#include<msclr/marshal_cppstd.h>
#include<string>
using namespace std;
static string u[1000][100];
static int n,m=0;
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。

結構コードが複雑になってしまいましたので、次話以降何話かに渡って解説をします。
解説が終わった後、Windows版マルチスレッド対応の数独問題作成ソフトVer.1のように
データの保存データを開く、名前を付けて保存などができるようにさらにソフトを改良していきます。


現時点での『データベスソフト(住所録)』(ダウンロード用参考EXEファイル)
データベスソフト(住所録には間違いがありました。しかし、完成ソフトにおいては間違いが訂正されています。
動作テストをした範囲では正常に動いていますのでVer.1の完成を宣言したと思います。
動作に何か不良が発見された場合連絡していただけるとありがたいです。
ソフト開発にはバグはつきものです。
データベスソフト(住所録)の間違いについては読者の皆さんがよく考えて直していただければと思います。)
目標完成ソフト『住所録Ver.1』(ダウンロード用参考EXEファイル)

言い忘れていたかもしれませんね。
自分が作ったソフトを配布するときは、ビルドしたときにできるEXEファイル(実行ファイル=拡張子が.exeのファイル)を
USBメモリーなどのメディアにコピペして、渡せばよいのです。
もちろん、EXEファイルをメールに添付して送ってもよいのです。

製品版のVC++なら、インストローラをVC++から作ることができるので、
それを配布すればよいのですが、無料のVC++ではインストローラを作ることはできません。
それに、この入門講義で作っているソフトならEXEファイルだけで充分です。
Wordや一太郎のような複雑なソフトである場合は、EXEファイルだけではだめでインストローラが必要になってきます。
複雑なソフトでは、実行ファイルがいろいろなファイルを参照して動いているからです。
ですが、本講義で作っているソフトはすべて実行ファイル単体で動くソフトですから、
インストローラは不要なわけです。

第3話へ 第5話へ

戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)