質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3275閲覧

CLRにて作成したForm上のListBoxに、別クラスからitemを追加したいです。

mypace

総合スコア45

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/04/11 09:46

VisualStudio 2017
Windows10 を使用しております。

C++ CLRアプリケーションで作成したForm上のListBoxに、
別クラスからItemを追加したいと考えております。

Webなど調べているのですが、方法がわからず質問いたしました。

アドバイスや、参考となるwebページ等ございましたら
教えていただけないでしょうか?
よろしくお願いいたします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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 CTestref class CTestになります。その場合、参照クラスに対してnewdeleteは使えなくなったり、標準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
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mypace

2019/04/12 03:56

丁寧な解説と意見をいただきありがとうございます。 C#との運用について検討したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問