C++/CLIで外部関数からForm1の要素にアクセスする方法

このQ&Aのポイント
  • C++/CLIにてForm1の要素に外部の関数からアクセスする方法について説明します。
  • この記事では、Windows7とVisual Studio2010を使用してC++/CLIでフォームアプリケーションを作成している場合を想定しています。
  • Form1クラスの要素に対し、Form1.h以外の場所にある外部の自作の関数からアクセスする方法について解説します。
回答を見る
  • ベストアンサー

C++/CLIにてForm1の要素に外部から

C++/CLIにてForm1の要素に外部の関数からアクセスしたいです。 Windows7、Visual Studio2010にてC++/CLIで 簡単なフォームアプリケーションを作成しています。 仮に新規作成し、とりあえずテキストボックスを貼りつけたとします。 この際「Form1.h」が自動的に作成され、Form1クラスの中に textBox1などの要素が自動的に作成されるかと思います。 Form1クラスのメソッドの中からそれにアクセスするには this->textBox1->Text = L"変更"; みたいにするだけで良いですが、 こうしたForm1クラスの要素に対し、 Form1.h以外の場所にある外部の自作の関数から アクセスを行うにはどのようにすれば良いのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> Form1はこのApplication::Runの中で一時的に作成されているのみということなのでしょうか。 そういうことです。 ですから、外部に対してなんらかの形でフォームのオブジェクトを渡す必要があります。 まぁそこの部分を書き換えてもいいんですが、自動生成される部分にはなるべく手を加えない方がスマートです。 あと、外部関数ということはフォームとは別のスレッドからの制御になると思いますが、その場合単純に書き換えようとすると例外になります。 http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html

RockmanX
質問者

お礼

返事が遅くなってしまいました。とても助かりました。どうもありがとうございます。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

Form1クラスに変更を行うメソッドを作り、自作関数からそのメソッドを呼び出しましょう。

RockmanX
質問者

補足

実はそういったアクセス用のメソッド自体は作成していたのですが、 外部のファイルや関数からForm1のメソッドを呼び出す方法が分からずにいました。 仮にForm1にvoid test()というメソッドがあったとした場合、 違うファイルからそのtest関数を呼び出すにはどのようにすれば良いのでしょうか。 というのも、Form1がどこで宣言されているのかもよく分からないのです。 main関数を見れば int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; } などとなっていましたが、Form1はこのApplication::Runの中で一時的に 作成されているのみということなのでしょうか。

関連するQ&A

  • c++/cli .NET Formアプリケーションの全画面の表示について

    現在visual studio 2008 Express Editionで、c++/cli .NET のFormアプリケーションを作成しています。 Bitmapクラスに格納した画像データを、全画面で背景を黒にして表示させたいのですが、やり方がわかりません。誰か教えてください!!

  • Form1のtextBoxにアクセスしたいのですが

    WindowsフォームでForm1を作り、そこにtextBoxを貼り付けました。 自分で作ったKeisanクラスからtextBox.textの値を入力したいのですがどうやったら アクセスできるのでしょう。 自動生成されるInitializeComponent()をpublicに変えてみたりしたのですがダメでした。。 どなたかよろしくお願いします。

  • C#とC++/CLI間でポインタが指す内容が変わる

    現在、C++/CLIプログラムをC#で使う必要があり、 C++/CLIで定義したメソッドとクラスでC#側とやり取りする必要が生じております。 以下の書き方で、C++/CLIとC#間のクラスのやり取りはできたのですが、 C++/CLI側で定義されているメソッド内で、ポインタが指し示す値(*id.head)が変わってしまいます(文字化けみたいな感じになる)。 引き渡したポインタ変数の値は一致しているのですが、 どうすれば、C++/CLI側で値を正しく取得できるのでしょうか?。 【C++/CLI側で定義されているクラス】 public value class class1 { public : ULONG code; header    *head; }; typedef struct _header { CHAR achCHdrType[2]; CHAR achMsgLen[2]; } header ; 【C++/CLI側で定義されているメソッド】 ULONG session::open(class1& id) { return session_oepn(id.code, *id.head) } 【C#側でのメソッド参照】 class1 c1 = new class1(); uint status = session.open(&c1); よろしくお願いします。

  • C++/CLIのDLLをC#で使う

    C++/CLIのDLLをC#で使う ソリューションの中にC++/CLIでクラスを作成し、出力がDLLのプロジェクトと、 C#でGUI画面の処理のプロジェクトがあります。 このときC#側でC++/CLI側で作ったDLLを使用したいのですが、やり方がわかりません。 DLL自体はC#のDebugフォルダに入っており、参照設定で読み込んでいます。 ご教授のほど、よろしくお願いいたします。

  • c++/cliでのクラス作成方法について

    現在,VC++2008のC++/CLIを用いて以下のようなプログラムを作成しました。 String^ moji = textBox1->Text; Double num; Double const; Double kekka; Const = 10; Bool bRet2 = double::TryParse(moji,num); If (Const > num){ Kekka = num; } form上のtextBox1内の文字が数値に変換でき,且つ,10未満ならkekkaにその値をいれるというものです。 上記の処理をクラス化するためには,どのように記述すればよいでしょうか? C++の参考書などを読んで試してみたのですが,うまくいきませんでした... わかる方がいらっしゃいましたら,ご教授よろしくお願いいたします。

  • FORM1からFORM2にパラメータの引渡し

    Public class Form1 Private Sub Button1_Click(------------------) Dim textBox1 As String textBox1 = TextBox1.Text End Sub End Class Form1でボタンをクリックし、textBox1の値を モードレスで開いたForm2にtextBox1の値を渡したい と考えていますが、参考となるサイトがなく どのように書いたらいいのかわかりません…。 メソッド(textBox1) 'FORM1側 Public Sub メソッド(ByVal textBox1 As String) ' FORM2側 で出来ると思ったのですが、この場合モードレスで開いたとしても パラメータが渡せない?と思い…。 ヒントでもいいので、アドバイスをよろしくお願いします。

  • C++/CLIとC#の連携について

    いつも拝見させていただいております。 現在、C++/CLIとC#にて連携を行っているのですが、C++/CLIで作成したクラス配列 がC#側でどのようにすれば受け取れるのか方法がわかりません。 C++/CLIで作成しているクラス配列はSystem::Collections::Generic::Listを使用 して配列化しています。 下記がC++/CLIのソースになります。 List<testClass>^% testClass::GetList() { List<testClass>^ lpTestClassList = gcnew List<testClass>(); testClass^ lpTestClass; lpTestClass = gcnew testClass(); lpTestClassList->Add(lpWatchServiceMasterInfoWrapper); return lpTestClassList; } これをC#側で使用しようとすると下記エラーが発生します。  「この言語によってサポートされていません」 C++/CLI⇒C#間の連携ではListクラスを使用することは不可能なのでしょうか? クラスを配列にして引き渡したいだけなので、他の方法等含めて何か参考になることがありましたら ご教授ください。 よろしくお願い致します。 開発環境  C++/CLI ⇒ DLL(ネイティブなコードを参照するためのラッパー用DLL)  C# ⇒ アプリケーション

  • C++/CLIからC++の呼び出しで例外

    お世話になります。 C#からC++のNativeコード(unmanaged)を呼び出したいと思い、C++/CLIでラッパーを作りました。 そのラッパーのクラス内で、C++で書かれたNativeコードのクラスのインスタンスを作成する時に例外が発生してしまいます。 例外はこんな感じです。 System.Runtime.InteropServices.SEHException はハンドルされませんでした。 Message="外部コンポーネントが例外をスローしました。" Source="ManMovLib" ErrorCode=-2147467259(0x80004005) StackTrace: 場所 new(UInt32 ) C++/CLIは以下の様なコードで、コンストラクタ内でC++のクラスの実体を作っています。そして、このnewで例外が発生します。 AVSource::AVSource(void) {   m_pObj = new CAVSource; } C++側は、実は何もしていません。 CAVSource::CAVSource(void) { } そして、色々と試行錯誤をした結果、C++側のクラスにvirtual関数があると、例外が出てしまうという事実を突き止めました。 ただ、どこを調べても、virtual関数を用いてはいけないとは書いてありません。 実際、virtualを使ってはいけないという制約があるのでしょうか? また、何かNativeのコードを作成する際に注意点とかありますでしょうか? ちなみに、プロジェクトの設定で、Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。 よろしくお願いします。

  • FORM1の値を参照する場合について

    質問します。 FORM1を作成し、そこにTextbox1に値を何か入れた場合に、その値をチェック関数を新しいクラス(check.vb)にてチェックする場合にどのようにFORM1のTextbox1の値を参照すればよろしいのでしょうか? public function Check() AS Boolean Dim FORM AS NEW FORM1 Msgbox(FORM.Textbox1.text) end function 上記のようなチェック処理をしても空が表示されてしまいます。何方かご教授お願い致します。

  • Visual C#でFormに別のクラスからアクセスするには?

    現在Visual C# 2005 Expressで簡単なアプリケーションを作成しています。Formからフォルダを指定して、別のクラス内でFormで指定されたフォルダ内のファイルに対して様々な操作をするといったものです。 そこで質問なのですが、処理するファイルが多いので進行状況をForm上のテキストボックスやステータスバーなりに表示させて意図思い、Formとは別のクラス内に、 Form frm = new Form1(); frm.TextBox1.TEXT = count + "を処理中です。"といったような記述をしても、「静的なメンバが・・・」といったエラーが出てしまいます。 入門者の自分としては、いろいろと調べてみましたが解決できずに困っています。 このような場合、どのようにするとよいのかお力をお貸しください。

専門家に質問してみよう