第38講 データベースソフト(住所録)の制作=並列処理の練習☆☆
第15話 ファイルの各サブメニューのコードの解説その6(関数bool dco(String^ d)の役割その2)
コード再掲
bool dco(String^ d){
  dataGridView1->Rows->Clear();
  StreamReader^ r=gcnew StreamReader(d);
  marshal_context^ c=gcnew marshal_context();
  String^ mh;
  char i=0,j=0;
  while(1){
    mh=r->ReadLine();
    if(mh!=L"System.IO.StreamWriter"){
      u[j][i]=c->marshal_as<string>(mh);
      i++;
      if(i==18){
        i=0;
        j++;
      }
    }
    else
      break;
  }
  for(i=0;i<j;i++){
     dataGridView1->Rows->Add();
     dataGridView1[0,i]->Value=marshal_as<String^>(u[i][17]);
     if(u[i][0]=="1")dataGridView1[1,i]->Value=L"自宅";
     if(u[i][0]=="2")dataGridView1[1,i]->Value=L"会社";
     dataGridView1[2,i]->Value=marshal_as<String^>(u[i][1]);
     if(u[i][2]=="1")dataGridView1[4,i]->Value=L"様";
     if(u[i][2]=="2")dataGridView1[4,i]->Value=L"殿";
     if(u[i][2]=="3")dataGridView1[4,i]->Value=L"御中";
     if(u[i][2]=="4")dataGridView1[4,i]->Value=L"行";
     if(u[i][2]=="5")dataGridView1[4,i]->Value=L"宛";
     if(u[i][2]=="6")dataGridView1[4,i]->Value=L"係";
     if(u[i][2]=="7")dataGridView1[4,i]->Value=L"気付";
     dataGridView1[3,i]->Value=marshal_as<String^>(u[i][3]);
     if(u[i][4]=="1")dataGridView1[5,i]->Value=L"友人";
     if(u[i][4]=="2")dataGridView1[5,i]->Value=L"知人";
     if(u[i][4]=="3")dataGridView1[5,i]->Value=L"親類";
     if(u[i][4]=="4")dataGridView1[5,i]->Value=L"上司";
     if(u[i][4]=="5")dataGridView1[5,i]->Value=L"部下";
     if(u[i][4]=="6")dataGridView1[5,i]->Value=L"同僚";
     if(u[i][4]=="7")dataGridView1[5,i]->Value=L"取引先";
     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]);
  }
  m=j-1;
  r->Close();
  return(true);
}

コード解説
ファイルストリーム
入門  
  while(1){
    mh=r->ReadLine();
    if(mh!=L"System.IO.StreamWriter"){
      u[j][i]=c->marshal_as<string>(mh);
      i++;
      if(i==18){
        i=0;
        j++;
      }
    }
    else
      break;
  }
では前半c++の部分を担当し、
  for(i=0;i<j;i++){
     dataGridView1->Rows->Add();
     dataGridView1[0,i]->Value=marshal_as<String^>(u[i][17]);
     if(u[i][0]=="1")dataGridView1[1,i]->Value=L"自宅";
     if(u[i][0]=="2")dataGridView1[1,i]->Value=L"会社";
     dataGridView1[2,i]->Value=marshal_as<String^>(u[i][1]);
     if(u[i][2]=="1")dataGridView1[4,i]->Value=L"様";
     if(u[i][2]=="2")dataGridView1[4,i]->Value=L"殿";
     if(u[i][2]=="3")dataGridView1[4,i]->Value=L"御中";
     if(u[i][2]=="4")dataGridView1[4,i]->Value=L"行";
     if(u[i][2]=="5")dataGridView1[4,i]->Value=L"宛";
     if(u[i][2]=="6")dataGridView1[4,i]->Value=L"係";
     if(u[i][2]=="7")dataGridView1[4,i]->Value=L"気付";
     dataGridView1[3,i]->Value=marshal_as<String^>(u[i][3]);
     if(u[i][4]=="1")dataGridView1[5,i]->Value=L"友人";
     if(u[i][4]=="2")dataGridView1[5,i]->Value=L"知人";
     if(u[i][4]=="3")dataGridView1[5,i]->Value=L"親類";
     if(u[i][4]=="4")dataGridView1[5,i]->Value=L"上司";
     if(u[i][4]=="5")dataGridView1[5,i]->Value=L"部下";
     if(u[i][4]=="6")dataGridView1[5,i]->Value=L"同僚";
     if(u[i][4]=="7")dataGridView1[5,i]->Value=L"取引先";
     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]);
  }
では後半マルチスレッドを担当しています。

  while(1){
    mh=r->ReadLine();
    if(mh!=L"System.IO.StreamWriter"){
      u[j][i]=c->marshal_as<string>(mh);
      i++;
      if(i==18){
        i=0;
        j++;
      }
    }
    else
      break;
  }
の"System.IO.StreamWriter"はデータの終了の印です。
データの終了の印でない限り、CSV形式のデータ『会社,井上 花子,様,イノウエ ハナコ,・・・,自宅,上井 一太郎,殿,ウエイ イチタロウ,・・・』
を読み込みを続けなさい、ということです。

  for(i=0;i<j;i++){
     dataGridView1->Rows->Add();
     dataGridView1[0,i]->Value=marshal_as<String^>(u[i][17]);
     if(u[i][0]=="1")dataGridView1[1,i]->Value=L"自宅";
     if(u[i][0]=="2")dataGridView1[1,i]->Value=L"会社";
     dataGridView1[2,i]->Value=marshal_as<String^>(u[i][1]);
     if(u[i][2]=="1")dataGridView1[4,i]->Value=L"様";
     if(u[i][2]=="2")dataGridView1[4,i]->Value=L"殿";
     if(u[i][2]=="3")dataGridView1[4,i]->Value=L"御中";
     if(u[i][2]=="4")dataGridView1[4,i]->Value=L"行";
     if(u[i][2]=="5")dataGridView1[4,i]->Value=L"宛";
     if(u[i][2]=="6")dataGridView1[4,i]->Value=L"係";
     if(u[i][2]=="7")dataGridView1[4,i]->Value=L"気付";
     dataGridView1[3,i]->Value=marshal_as<String^>(u[i][3]);
     if(u[i][4]=="1")dataGridView1[5,i]->Value=L"友人";
     if(u[i][4]=="2")dataGridView1[5,i]->Value=L"知人";
     if(u[i][4]=="3")dataGridView1[5,i]->Value=L"親類";
     if(u[i][4]=="4")dataGridView1[5,i]->Value=L"上司";
     if(u[i][4]=="5")dataGridView1[5,i]->Value=L"部下";
     if(u[i][4]=="6")dataGridView1[5,i]->Value=L"同僚";
     if(u[i][4]=="7")dataGridView1[5,i]->Value=L"取引先";
     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]);
  }
のdataGridView1[1,i]などのiは行数を示します。
並列処理
番号や氏名はデータをそのものを入れますが、
宛先や敬称などは選択になっていますので
     if(u[i][0]=="1")dataGridView1[1,i]->Value=L"自宅";
     if(u[i][0]=="2")dataGridView1[1,i]->Value=L"会社";
     
     if(u[i][2]=="1")dataGridView1[4,i]->Value=L"様";
     if(u[i][2]=="2")dataGridView1[4,i]->Value=L"殿";
     if(u[i][2]=="3")dataGridView1[4,i]->Value=L"御中";
     if(u[i][2]=="4")dataGridView1[4,i]->Value=L"行";
     if(u[i][2]=="5")dataGridView1[4,i]->Value=L"宛";
     if(u[i][2]=="6")dataGridView1[4,i]->Value=L"係";
     if(u[i][2]=="7")dataGridView1[4,i]->Value=L"気付";
となっています。

m=j-1;によって、一番最後の行数を記録しておきます。
これがどうして必要かと申しますと
初心者
この状態でカード編集型へのボタンを押したとき
基礎とするためです。

第14話へ 第16話へ

戻る

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