○Managed C++


■デバッグ出力

System::Diagnostics::Debug::WriteLine("Debug WriteLine");

■ガベージコレクトされるクラスの宣言

ガーベジコレクション対象のヒープ上に配置されます

__gc class ****{......}

■ガベージコレクタの強制実行

System::GC::Collect();

■例外処理

class inabaException{};//例外クラス

int _tmain()
{
	try{
		throw new inabaException();//例外をスロー
	}catch(Exception* err){
		Console::WriteLine("catch");
	}__finally{
		Console::WriteLine("__finally");
	}
}


■文字列操作

▽文字列の複製

String*str="aaa";
String*str2=String::Copy(str);
str="ccc";
Console::WriteLine(str2);

処理結果
aaa

▽文字列の比較

String*str="aaa";
String*str2="aaa";
if(str->Equals(str2)){
	Console::WriteLine("同じです");
}else{
	Console::WriteLine("違います");
}

処理結果
同じです

▽文字列の大小関係の比較(Excelの文字列のソートのような比較)

String*str="azzzzz";
String*str2="b";
int i=String::Compare(str,str2);

//0以上:1番目が大きい
//0以下:2番目が大きい
//0  :等しい

if(i>0){
	Console::WriteLine("1番目が大きい");
}else if(i<0){
	Console::WriteLine("2番目が大きい");
}else{
	Console::WriteLine("等しい");
}

処理結果
2番目が大きい

▽文字列連結

String*str1="今日";
String*str2="晴天";
str1=String::Concat(str1,"は",str2,"なり");
Console::WriteLine(str1);

処理結果
今日は晴天なり

▽文字列の切り出し

String*str="abcdefg";
Console::WriteLine(str->Substring(1,3));

処理結果
bcd

▽指定した文字列が最初に見つかった位置を返す

String*str="abcdefg";
Console::WriteLine((str->IndexOf((String*)"cde")).ToString());

処理結果
2

▽指定位置の文字取得

String*str="abcdefg";
Char c=str->get_Chars(2);
Console::WriteLine(c.ToString());

処理結果
c

▽前後のスペースを削除

String*str=" abcdefg ";
Console::WriteLine(str->Trim());

処理結果
abcdefg

▽出現する文字列を指定文字に置き換え

String*str="a??b??c??d??e??f??g";
Console::WriteLine(str->Replace((String*)"??",(String*)"-"));

処理結果
a-b-c-d-e-f-g

▽配列要素間に区切り文字を入れて配列を連結

String*sar[]={"a","b","c","d","e","f"};
Console::WriteLine(String::Join((String*)"-",sar));

処理結果
a-b-c-d-e-f

▽大文字、小文字に変換

String*str="aBcDeF";
Console::WriteLine(str->ToUpper());//大文字に変換
Console::WriteLine(str->ToLower());//小文字に変換

処理結果
ABCDEF
abcdef

■Stringの変換

▽String→char

String*str;
str="testいなば";
char* c=(char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str).ToPointer();

▽char→String

String*str;
char*c="testいなば";
str=c;
Console::WriteLine(str);

▽int→String

String*str;
int i=10;
str=i.ToString();
Console::WriteLine(str);

▽String→int

String*str="10";
int i=Int32::Parse(str);
Console::WriteLine(i.ToString());

■コントロールの動的配置とイベントの登録

//変数を作成します
private: System::Windows::Forms::Button*TestButton;

//画面への追加とイベントのメソッドを指定

this->TestButton =new System::Windows::Forms::Button();
this->Controls->Add(TestButton);
this->TestButton->Click += new System::EventHandler(this,TestButton_Click);

//イベントのメソッドを書く
private: System::Void TestButton_Click(System::Object *  sender, System::EventArgs *  e)
 {

 }

■子フォームを作成

新規クラスにてフォームを追加します
先頭で子フォームのヘッダーをインクルード #include "Form2.h" します

▽モーダル

MyClass::Form2*form2=new MyClass::Form2();
form2->ShowDialog(this);

▽モードレス

MyClass::Form2*form2=new MyClass::Form2();
form2->Show();

▽フォームのオブジェクトを破棄するには、

破棄されるフォーム内にて Closed イベントを取得して、this->Dispose(true);のように
自分を破棄するメソッドが必要になります。
もしくは、
protected:で宣言されているDisposeメソッドを外部に公開して、外から破棄します。

■メッセージボックス

//OKボタンのみのメッセージボックス
System::Windows::Forms::MessageBox::Show((String*)"内容",(String*)"題名");

//OKとCancelボタンのメッセージボックス
int i=System::Windows::Forms::MessageBox::Show((String*)"内容",(String*)"題名",System::Windows::Forms::MessageBoxButtons::OKCancel);

■スレッド

▽スリープ
System::Threading::Thread::Sleep(1000);

▽スレッドの生成

__gc class Class1
{
public:
	void Thread1();
	Class1(){
		System::Threading::Thread *t1 =
			new System::Threading::Thread(
			new System::Threading::ThreadStart(
			this,&Class1::Thread1));//スレッドとして実行する関数のアドレスを渡す
		t1->Start();//スレッドの開始
	}
    
};

void Class1::Thread1(){

}

int wmain(void)
{
    Class1 *obj=new Class1();//スレッドを作成するにはクラスが必要
    return 0;
}

▽シンクロナイズ

以下のプログラムではスレッドの排他処理しています
排他処理をしないと、変な値になってしまいます。

__gc class Class1
{
public:
	void Thread1();
	void add(int a,int b);
	Class1(){
		System::Threading::Thread *t1 =
			new System::Threading::Thread(
			new System::Threading::ThreadStart(
			this,&Class1::Thread1));//スレッドとして実行する関数のアドレスを渡す
		t1->Start();//スレッドの開始
		while(1){
			add(0,1);
		}
	}
    
};

void Class1::Thread1(){
	while(1){
		add(1,0);
	}
}

int c;
void Class1::add(int a,int b){
	System::Threading::Monitor::Enter(this);//指定したオブジェクトの排他ロックを取得

	c=b;
	System::Threading::Thread::Sleep(100);
	Console::WriteLine((a+c).ToString());

	System::Threading::Monitor::Exit(this);//指定したオブジェクトの排他ロックを解放
}

int wmain(void)
{
    Class1 *obj=new Class1();//スレッドを作成するにはクラスが必要
    return 0;
}

■ファイル処理

▽テキストのファイル書き込み

//Shift JISでファイルに書き込む
//ファイルが存在したら上書き、無ければ新規作成
System::IO::StreamWriter*sw=new System::IO::StreamWriter((String*)"test.txt",false,System::Text::Encoding::GetEncoding(932));
sw->WriteLine((String*)"testいなば");//1行づつ書き込み
sw->WriteLine((String*)"2行目");
sw->Close();

▽テキストファイルの読み込み

//Shift JISでファイルを読み込み
System::IO::StreamReader*sr=new System::IO::StreamReader((String*)"test.txt",System::Text::Encoding::GetEncoding(932));
String*str1=sr->ReadLine();//1行づつ読み込み
String*str2=sr->ReadLine();//2行目
sr->Close();

■区切り文字による切り出し

int wmain(void)
{
	String*str="a,b,c,d,e,f,g";

	String*data[]=str->Split(((String*)",")->ToCharArray());

	Console::WriteLine(data[0]);
	Console::WriteLine(data[1]);
	Console::WriteLine(data[2]);
	Console::WriteLine(data[3]);
	Console::WriteLine(data[4]);
	Console::WriteLine(data[5]);
	Console::WriteLine(data[6]);

	////数が不明の場合
	//System::Collections::IEnumerator* myEnum = data->GetEnumerator();
	//while (myEnum->MoveNext()) {
	//	String* s = __try_cast(myEnum->Current);
	//	if (!s->Trim()->Equals(S"")) Console::WriteLine(s);
	//}

    return 0;
}

処理結果

a
b
c
d
e
f
g

■二重起動の抑制
Mutixオブジェクトの所有権により、識別します

__gc class test{
public:
	System::Threading::Mutex*MutexObj;
	test(){
		MutexObj=new System::Threading::Mutex(false,(String*)"inabaApp1");
		if (MutexObj->WaitOne(0, false) == false) {
			Console::WriteLine((String*)"二重起動をしています");
			//終了処理
		}
	}
};


int wmain(void)
{
	test*obj=new test();
	return 0;
}

■TCP/IPクライアント

System::Net::Sockets::TcpClient*client=new System::Net::Sockets::TcpClient((String*)"localhost",1000);
System::Net::Sockets::NetworkStream*ns=client->GetStream();

//文字列を送信
System::Byte sendWord[]=System::Text::Encoding::Default->GetBytes((String*)"てすとtest");
ns->Write(sendWord,0,sendWord->Length);

//文字列を受信
System::Byte readWord[]=new System::Byte[1024];
int readLen = ns->Read(readWord,0,readWord->Length);
String*str=System::Text::Encoding::Default->GetString(readWord,0,readLen);
System::Diagnostics::Debug::WriteLine(str);

ns->Close();
client->Close();




▲トップページ > Windows と C++