Managed C++
○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++