VisualStudio 2017
Windows10 を使用しております。
C++ CLRアプリケーションで作成したForm上のListBoxに、
別クラスからItemを追加したいと考えております。
Webなど調べているのですが、方法がわからず質問いたしました。
アドバイスや、参考となるwebページ等ございましたら
教えていただけないでしょうか?
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
アンマネージドな標準のC++のクラスやメソッドから、マネージドなC++/CLIの参照クラス(ref class)と相互運用することはできないことも無いです。ただし、最終的にやりたいことを踏まえ、実行内容を充分に理解しない限りはお勧めできません。
以下は標準C++のCTest
クラスのメソッドから、Windows FormsのリストボックスであるSystem::Windows::Forms::ListBox
に要素を追加するコードの例です。フォームの子コントロールであるリストボックスの生存期間を考えると、その参照をCTestクラスにメンバー関数等で持たせることは適当ではなさそう、との判断からメンバー関数 CTest::TestFunc
への引数としています。
C++
1public class CTest{ 2private: 3 int num_; // 深い意味は無いが、当然メンバー変数も使えることの例示 4 5public: 6 CTest() : num_(0) {} 7 ~CTest() {} 8 9 // メンバー関数 10 void TestFunc(System::Windows::Forms::ListBox^ listBox) 11 { 12 System::String^ s = System::String::Format(L"CTest::TestFunc: num={0}", ++num_); 13 listBox->Items->Add(s); 14 15 System::Diagnostics::Debug::WriteLine(s); 16 } 17 18 // staticメンバー関数 19 static void TestFunc_STATIC(System::Windows::Forms::ListBox^ listBox) 20 { 21 listBox->Items->Add(L"CTest::TestFunc_STATIC"); 22 } 23};
ボタンクリックの時にリストボックスに要素を追加するのは、具体的なコード例としては以下のようになります。
C++
1CTest cTest; // 適切なところで宣言 2 3private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 4 // これは自Formから自分のListBoxへ追加するコード 5 this->listBox1->Items->Add("Item1"); 6 7 // CTestクラスのメンバー関数を介してListBoxへ追加するコード 8 cTest.TestFunc(listBox1); 9 CTest::TestFunc_STATIC(listBox1); 10}
状況によりますが、C++/CLIを使う場合(分かり易く言うと、.NET Frameworkのクラスも使う場合)は、一般的にはC++の標準クラスではなく、参照クラス(ref class
)を使うことが多いです。CTestクラスをもとにするとしたら、宣言のclass CTest
がref class CTest
になります。その場合、参照クラスに対してnew
やdelete
は使えなくなったり、標準C++でのint
等のプリミティブな型もSystem.Int32
型になったりするので注意が必要です。
C++
1// Managedな参照クラス ref class CTest のメンバー関数を介してListBoxへ追加するコード 2CTest^ ctest = gcnew CTest(); 3ctest->TestFunc(listBox1); 4CTest::TestFunc_STATIC(listBox1);
実際、これらのコードを適用してWindows 10で動作させると、下図のようにリストボックスに表示されます。Visual Studio 2010で作成したプロジェクトを最終的にVisual Studio 2017でビルドしたもので、Windows 7でも動作しています。
アドバイスや、参考となるwebページ等ございまかしたら教えていただけないでしょうか?
公式では例えば以下ですが、
Microsoft Docs - C++/CLI による .NET プログラミング
その他にも「C++/CLI Windows Forms」などと検索すると、色々ヒットしますので見てみると良いです。
本質問の内容に照らし合わせると、C++/CLIと.NET FrameworkのWindows Forms関係のクラスの使い方の問題になりますので、これらの情報を組み合わせて理解するかたちになるかと思います。
以下は個人的なものも含むいち意見です:
C++/CLIはECMAで標準化 (Standard ECMA-372 / C++/CLI Language Specification)されてはいるものの、今ではマイクロソフトもC++/CLI関連のアップデートは積極的にはせず、むしろ退行して消えつつあるのが現状です。例えばVisual Studio 2017でC++/CLI関連のプロジェクト作成テンプレートは極端に少ないですし、ネットで検索してヒットする記事も、5~10年以上前の古いものが多いです。
既存プロジェクトの保守や小さい機能追加などであれば仕方無い面はありますが、標準のC++とは区別して向き合った方が良いと思います。.NET Frameworkを使う機会が多いのであれば、プログラミング言語としてはC#を使ったコードとの相互運用を意識した方が将来性は高いと思います
teratailでも過去、何度かそのようなトピックで意見が述べられました。
投稿2019/04/12 03:38
編集2019/04/12 03:52総合スコア9183
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/12 03:56