第38講 データベースソフト(住所録)の制作=並列処理の練習☆☆
第3話 データベースソフトのコード内容
Form1コード例
#pragma once
#include"stdafx.h"
#include"Form2.h"
namespace 住所録 {
        ・
        ・
        ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           dataGridView1[0,0]->Value=marshal_as<String^>(u[0]);
           dataGridView1[1,0]->Value=marshal_as<String^>(u[1]);
           dataGridView1[3,0]->Value=marshal_as<String^>(u[2]);
           dataGridView1[2,0]->Value=marshal_as<String^>(u[3]);
           dataGridView1[4,0]->Value=marshal_as<String^>(u[4]);
           dataGridView1[5,0]->Value=marshal_as<String^>(u[5]);
           dataGridView1[6,0]->Value=marshal_as<String^>(u[6]);
           dataGridView1[7,0]->Value=marshal_as<String^>(u[7]);
           dataGridView1[8,0]->Value=marshal_as<String^>(u[8]);
           dataGridView1[9,0]->Value=marshal_as<String^>(u[9]);
           dataGridView1[10,0]->Value=marshal_as<String^>(u[10]);
           dataGridView1[11,0]->Value=marshal_as<String^>(u[11]);
           dataGridView1[12,0]->Value=marshal_as<String^>(u[12]);
           dataGridView1[13,0]->Value=marshal_as<String^>(u[13]);
           dataGridView1[14,0]->Value=marshal_as<String^>(u[14]);
           dataGridView1[15,0]->Value=marshal_as<String^>(u[15]);
           dataGridView1[16,0]->Value=marshal_as<String^>(u[16]);
        }

  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 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[0]=s;
          w=textBox1->Text;
          s=c->marshal_as<string>(w);
          u[1]=s;
          w=comboBox2->Text;
          s=c->marshal_as<string>(w);
          u[2]=s;
          w=textBox2->Text;
          s=c->marshal_as<string>(w);
          u[3]=s;
          w=comboBox3->Text;
          s=c->marshal_as<string>(w);
          u[4]=s;
          w=textBox3->Text;
          s=c->marshal_as<string>(w);
          u[5]=s;
          w=textBox4->Text;
          s=c->marshal_as<string>(w);
          u[6]=s;
          w=textBox5->Text;
          s=c->marshal_as<string>(w);
          u[7]=s;
          w=textBox6->Text;
          s=c->marshal_as<string>(w);
          u[8]=s;
          w=textBox7->Text;
          s=c->marshal_as<string>(w);
          u[9]=s;
          w=textBox8->Text;
          s=c->marshal_as<string>(w);
          u[10]=s;
          w=textBox9->Text;
          s=c->marshal_as<string>(w);
          u[11]=s;
          w=textBox10->Text;
          s=c->marshal_as<string>(w);
          u[12]=s;
          w=textBox11->Text;
          s=c->marshal_as<string>(w);
          u[13]=s;
          w=textBox12->Text;
          s=c->marshal_as<string>(w);
          u[14]=s;
          w=textBox13->Text;
          s=c->marshal_as<string>(w);
          u[15]=s;
          w=textBox14->Text;
          s=c->marshal_as<string>(w);
          u[16]=s;
          delete c;
       }

       private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {
         Close();
       }
};
}
並列処理ボタンを加えました。
Close();はFormを閉じる=ソフトを終了する、です。

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[100];
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。


それにしても
          String^ w;
          w=comboBox1->Text;
          marshal_context^ c=gcnew marshal_context();
          string s=c->marshal_as<string>(w);
はとても面倒ですね。Visual Basicの場合は、型にはルーズで神経を使う必要がありません。
textBoxなどのデータ型が文字であろうが、数字であろうが、
文字型変数は整数型変数などを用意すれば面倒な型変換入りません。
なぜ、VC++はこんなに面倒なのか。
それは、C→C++→VC++と次々に拡張したり、.NETと結合させたりと、
VC++自体が継ぎ接ぎ細工であるからです。
VC++自体がフランケンシュタインであるということです。
だから、文字型変数でも様々な型が用意されていて、
C言語の特徴で融通が利かないということでしょう。
型の違いを大切にするのは結構ですが、わかりやすさも優先させてもらいたいものです。
VC++の開発者、お願いしますよ。

では次の課題です。
今のコーティングでは、一覧表型の1行目にしかデータを送れません。
そこで、Form1とForm2を少し改良して、何人でもデータを入れられるようにしたいと思います。
改良内容は、データ番号を入れるということです。

マルチスレッドの方法
番号はわかりやすく1から入っていくという設定にしましょう。

第2話へ 第4話へ

戻る

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