none
テキストボックスに値を代入する RRS feed

  • 質問

  • フォームとは別なクラス(マネージコード)から値をフォームのテキストボックスに表示したいのですが、

    フォームとは別な名前空間:MyClass(){
     フォームのテキストボックス="設定したい値"; //この実装がうまくいかない部分



    みなさんはどのように、フォームとは別なクラスから対象のフォームのコントロールに値を設定されていますか?
    サンプルコードで教えてくださればありがたいです。

    2009年8月10日 0:30

すべての返信

  • フォームのインスタンスを特定できるのであれば、フォームとは別のクラスからであろうが、別の名前空間からであろうが、
    テキストボックスのプロパティに値を入れればいいように思うのですが。
    「この実装がうまくいかない」というのは、どのようにうまくいかないのでしょうか?(ビルドエラー?実行時エラー?)
    プロセスが別とか、スレッドが別とか、何か条件はありますか?
    2009年8月10日 1:47
  • ビルドエラーです。条件はありません。

    #include "Form1.h"

     using namespace System;
     using namespace System::Collections;
     using namespace System::Windows::Forms;

    using namespace global;
    using namespace TESTSANNSYOU;

    global::globalA(){};
    global::globalA(){
     Form1^ globalA = gcnew Form1;
     globalA::textBox1->Text;
     public:
      globalA();
    };

    ’;’が’{’の前にありません。 が表示されます。

    2009年8月10日 2:43
  • まず、言語のマニュアルを読みましょう。

    C++のソースとして意味が通る記述には見えませんので、コンパイルできない(ビルドエラーが出る)のが正常です。


    Kazuhiko Kikuchi
    2009年8月10日 3:04
  • コードを見る限り、テキストボックスとか関係なく、単にC++を理解していないだけのように見受けられます。
    2009年8月10日 3:06
  • C++/CLI とは云っても基本は C++ なので、Form1 のインスタンスを globalA という変数に入れたのであれば、
    メンバーアクセスの演算子(ここでは「->」)を使って Form1 のメンバーにアクセスします。
    globalA の後に「->」とタイプすると、アクセスできるメンバーが一覧されるはずです。(IntelliSense が ON のとき)
    2009年8月10日 4:26
  • 定義部分を以下のように作成しました。この段階で間違っているでしょうか?


    #pragma once
    #using <System.dll>
    #include "Form1.h"
    using namespace TESTSANNSYOU;

    namespace global{
     using namespace System;
     using namespace System::Windows::Forms;

     public ref class globalA : public Form
     {
       
     static Form1^ form(); //この記述がこの宣言でよいのでしょうか? Form1がインスタンス化されているのですか?

     public:
      globalA();

     };
    }


    インスタンスを作るのは、
    // TESTSANNSYOU.cpp : メイン プロジェクト ファイルです。

    #include "stdafx.h"
    #include "Form1.h"
    #include "global.h"

    using namespace global;

    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
     // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
     Application::EnableVisualStyles();
     Application::SetCompatibleTextRenderingDefault(false);

     // メイン ウィンドウを作成して、実行します
     Application::Run(gcnew Form1()); //この部分を変えて作る必要がありますか?

     return 0;
    }

    2009年8月10日 5:37
  • 定義部分を以下のように作成しました。この段階で間違っているでしょうか?


    #pragma once
    #using <System.dll>
    #include "Form1.h"
    using namespace TESTSANNSYOU;

    namespace global{
     using namespace System;
     using namespace System::Windows::Forms;

     public ref class globalA : public Form
     {
       
     static Form1^ form(); //この記述がこの宣言でよいのでしょうか? Form1がインスタンス化されているのですか?

     public:
      globalA();

     };
    }

    この定義ですと、
     ・「global」という名前空間の中に、
     ・「globalA」という Windows フォームを定義して、
     ・Form1 への参照を返す「form」という名前の private なクラス メソッドを定義したい
    と読めます。

    今のところスレッドの流れで分かっているところは、
     ・Form1 にある「textBox1」というテキスト ボックスに値を入れたい。
     ・Form1 の外側から値を入れるコードを書いたらコンパイル エラーになった。
     ・件のコードは C++ の文法的に間違っている。
    ということだけですので、このクラス定義が間違っているかどうかは第三者では判断できないと思います。
    2009年8月10日 6:11
  • 以下の部分で←で示した場所が原因でコンパイルエラーになります。

    エラー内容は、
    error C2143: 構文エラー : ';' が '^' の前にありません。
    error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません。


    回避策をおしえてください。よろしくお願いします。

    #pragma once

    #include "Form1.h"

    //#using <System.dll>

    using namespace System;
    using namespace System::Windows::Forms;
    //using namespace TESTSANNSYOU;
    namespace GLOBAL{

    public ref class global {
      public:
       static Form1^ form1;  ←
      public:
       global();
     };
    }

    2009年8月11日 9:06
  • Form1 の定義が提示されないと、第三者からは回避策を提示することはできないと思うのですけれども。
    Form1 が Windows フォームのクラスであると仮定して、namespace が GLOBAL でないとかではないですか?
    (想像でしかないので、ハズレていたらすみません。)

    ところで、今まで色々な方々からアドバイスを受けていると思いますが、それらについては解決しているのでしょうか?

    2009年8月11日 9:17
  • 残念ながら、具体的な解決には至っていません。

    Form1を提示します。

    後半にTESTSANNSYOU.cppを提示します。

    アドバイスよろしくお願いします。

    #pragma once
    #include "global.h"
    using namespace GLOBAL;
    namespace TESTSANNSYOU {

     using namespace System;
     using namespace System::ComponentModel;
     using namespace System::Collections;
     using namespace System::Windows::Forms;
     using namespace System::Data;
     using namespace System::Drawing;

     /// <summary>
     /// Form1 の概要
     ///
     /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
     ///          マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
     ///          変更する必要があります。この変更を行わないと、
     ///          デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
     ///          正しく相互に利用できなくなります。
     /// </summary>
     public ref class Form1 : public System::Windows::Forms::Form
     {

     public:
      static Form1^ form1();

     public:
      Form1(void)
      {
       InitializeComponent();
       //
       //TODO: ここにコンストラクタ コードを追加します
       //
       Form1^ form1 = gcnew Form1();

      }

     protected:
      /// <summary>
      /// 使用中のリソースをすべてクリーンアップします。
      /// </summary>
      ~Form1()
      {
       if (components)
       {
        delete components;
       }
      }
     public: System::Windows::Forms::TextBox^  textBox1;
     protected:

     private: System::Windows::Forms::Button^  button1;

     protected:

     private:
      /// <summary>
      /// 必要なデザイナ変数です。
      /// </summary>
      System::ComponentModel::Container ^components;

    #pragma region Windows Form Designer generated code
      /// <summary>
      /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
      /// コード エディタで変更しないでください。
      /// </summary>
      void InitializeComponent(void)
      {
       this->textBox1 = (gcnew System::Windows::Forms::TextBox());
       this->button1 = (gcnew System::Windows::Forms::Button());
       this->SuspendLayout();
       //
       // textBox1
       //
       this->textBox1->Location = System::Drawing::Point(117, 104);
       this->textBox1->Name = L"textBox1";
       this->textBox1->Size = System::Drawing::Size(100, 19);
       this->textBox1->TabIndex = 0;
       //
       // button1
       //
       this->button1->Location = System::Drawing::Point(177, 199);
       this->button1->Name = L"button1";
       this->button1->Size = System::Drawing::Size(75, 23);
       this->button1->TabIndex = 1;
       this->button1->Text = L"button1";
       this->button1->UseVisualStyleBackColor = true;
       this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
       //
       // Form1
       //
       this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
       this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
       this->ClientSize = System::Drawing::Size(292, 266);
       this->Controls->Add(this->button1);
       this->Controls->Add(this->textBox1);
       this->Name = L"Form1";
       this->Text = L"Form1";
       this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
       this->ResumeLayout(false);
       this->PerformLayout();

      }
    #pragma endregion
     private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
        }
     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
          
        //Form1^ Form = gcnew global;
        //globalA::textBox1->Text;
        // Form1^ Form = gcnew global::global(Form1^ form);
        //Form1^ MyFormIns = gcnew Form1(Form1^ Form1);
        //Form1^ MyFormIns = gcnew Form1();
        }
     };
    }

    // TESTSANNSYOU.cpp : メイン プロジェクト ファイルです。

    #include "stdafx.h"
    #include "Form1.h"
    #include "global.h"

    using namespace System;
    using namespace System::Windows::Forms;
    using namespace GLOBAL;

    using namespace TESTSANNSYOU;
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
     // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
     Application::EnableVisualStyles();
     Application::SetCompatibleTextRenderingDefault(false);

     // メイン ウィンドウを作成して、実行します
     //Application::Run(gcnew Form1());
     Form1^ form1 = gcnew Form1(); // [追加]
        Application::Run(form1); // [変更]

     return 0;
    }

    2009年8月11日 9:43
  • やはり
    Form1 が Windows フォームのクラスであると仮定して、namespace が GLOBAL でないとかではないですか?

    が原因だとおもうのですけれども。
    あえて
    //using namespace TESTSANNSYOU;

    とコメントアウトしたからには、Form1 を global クラスの中から参照するには、それなりのことをしないといけないと思うのですが。
    (一般的な C++ の文法の問題ですので、そのものズバリのコードは書かないでおきます。)
    2009年8月11日 9:52
  • > 回避策をおしえてください。よろしくお願いします。

    とりあえずの回避策でよければ
    該当行の先頭に // と入れればコンパイルエラーはでなくなりますよ。


    コメントアウトされているusing namespaceが…と思うのですが、
    まさか、Form1 は TESTSANNSYOU 名前空間に定義されているなんて事はないですよね。

    Kazuhiko Kikuchi
    2009年8月11日 10:01
  •   Form1(void)
      {
       InitializeComponent();
       //
       //TODO: ここにコンストラクタ コードを追加します
       //
       Form1^ form1 = gcnew Form1();

      }

    これ、何がしたいの?

    Form1 が作られる時に Form1 を作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る、んで作られる時に作る

    のどうどうめぐりをしたいと書いてますよ。


    Kazuhiko Kikuchi
    2009年8月11日 10:15
  • using namespace TESTSANNSYOU;は、
    自分のクラスの名前空間ではないが、Form1^はTESTSANNSYOUで作られている。
    using namespace TESTSANNSYOU;を生かすと、
    今度はerror C2871: 'TESTSANNSYOU' : この名前を指定された名前空間は存在しません。が発生する。
    一般的な C++ の文法の問題。。。

    「共通言語ランタイム サポート」という項目を「共通言語ランタイム サポート (/clr)」に設定してみたが、解決しません。

    global.hは
    #include "Form1.h"

    Form1.hは
    #include "global.h"
    これも、おかしい感じがする。

    2009年8月11日 10:23
  • Form1はTESTSANNSYOU名前空間に定義されています。
    なぜなら、最初にソリューションを作ったときに、TESTSANNSYOUにしたからです。
    これがいけないのでしょうか?
    2009年8月11日 10:30
  • global.hは
    #include "Form1.h"

    Form1.hは
    #include "global.h"
    これも、おかしい感じがする。

    いいところに来ています。global.h と Form1.h のそれぞれが相手の定義を必要としています。これを解消せねばなりません。
    2つのクラスの定義をするのに、お互いのクラスを参照しあうという問題は、C++ のあるあるだと思います。これを解消するには...
    2009年8月11日 10:38
  • がんばって返事しています。
    //でエラーがでなくなるのは。。。

    インクルードされていればインクルードしないで下さいのコードがかけたらいいのですね。

    #pragma once ですね。

    #ifndef _SAMPLE
    #define _SAMPLE
    
    // ヘッダファイルの中身
    // 関数宣言 defineなど...
    
    #endif // _SAMPLE
    もありましたが。

    また、インスタンスが欲しいから下のようにかいたんですが。。。
     Form1(void)
      {
       InitializeComponent();
       //
       //TODO: ここにコンストラクタ コードを追加します
       //
       Form1^ form1 = gcnew Form1();

      }

    まだ、エラーがとれないです。

    2009年8月11日 10:56
  • また、インスタンスが欲しいから下のようにかいたんですが。。。
     Form1(void)
      {
       InitializeComponent();
       //
       //TODO: ここにコンストラクタ コードを追加します
       //
       Form1^ form1 = gcnew Form1(); 
      }
    まだ、エラーがとれないです。
    そのコードの意味を理解して書いているのでしょうか?
    他人に説明できない状況であれば問題です。ソースコードは適当に書いて良いものではありません。
    きっちりと意味を理解して、正しくなるように修正していけるようになることが必要です。

    今のコードは Form1 のインスタンスを作ろうとして、そのコンストラクタでさらに Form1 を作ろうとしての無限ループになりますよ。


    まだ、エラーがとれないです。
    厳しいことを言いますが、この一文では答えようがありません。
    エラーが出たのであればどのエラーが出たのか、例外が出たのであればどの例外が出たのかきっちりと明示して下さい。

    「エラーが出た」だけの一文は、どのようなものか推測できないため、役立ちません。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月11日 11:46
    モデレータ
  • また、インスタンスが欲しいから下のようにかいたんですが。。。
     Form1(void)
      {
       InitializeComponent();
       //
       //TODO: ここにコンストラクタ コードを追加します
       //
       Form1^ form1 = gcnew Form1();

      }

    まだ、エラーがとれないです。

    うーん、静観していましたが。
    ズバリお聞きしますが、C++/CLIに関する文法の知識はどの程度お持ちなんでしょう。
    基本的な文法の知識は、サンプルコードを丸写しでコードのパターンを覚えるような勉強方法では
    身につかないです。文法の勉強をするならちゃんと文法の入門書が必要です。

    アプリを作りながら文法の勉強が出来るほど簡単話では無いと思うので
    文法に関する知識が足りないのであれば、ちゃんと腰をすえて文法の勉強をする事をお勧めします。

    例えばですが、上記のForm1(void)がC++/CLIでいうなんと言う関数だか分かりますか?
    その関数はどういう時に呼ばれるのでしょうか?

    Form1^ form1 = gcnew Form1(); という行は何をやっていますか?
    この行のコードで呼び出されるFormクラスの関数はどれでしょう?

    この質問内容に対する答えがわかるのであれば、他の方が指摘している内容もわかるはずです。
    なぜ無限ループになるのかもわかるはず。

    クラスの概念に関する知識がかなり足りないように思います。
    いきなりアプリケーションを作成するのではなくてC++/CLIの文法を勉強して
    クラスの概念についてしっかり理解する事が必要だと思いますよ。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年8月12日 2:06
  • Form1^ form1 = gcnew Form1(); は、よくないのですね。

    エラーは、名前空間が抜けていたから発生していました。

    TESTSANNSYOU::Form1::textBox1->Text = "123";
    が出来ればよいのだが、

    クラスの中でインスタンスを差せない。。。
    2009年8月12日 3:53
  • >Form1^ form1 = gcnew Form1(); は、よくないのですね。

     ちがいます、その文は至って普通です。書いている場所との関係がおかしいのです。

     Form1::Form1() はコンストラクタです、インスタンスの作成時にインスタンスの設定を行う為に gcnew Form1() から呼ばれます。
     その中で gcnew Form1() をすると Form1::Form1() をgcnewを介して無限に呼びだす事になるという事を指摘しています。

    Kazuhiko Kikuchi
    2009年8月12日 4:02
  • Form1^ form1 = gcnew Form1(); は、よくないのですね。

    エラーは、名前空間が抜けていたから発生していました。

    TESTSANNSYOU::Form1::textBox1->Text = "123";
    が出来ればよいのだが、

    クラスの中でインスタンスを差せない。。。
    えーと、クラスの中でインスタンスがさせないとはどういう事でしょう?

    今のソースだとFormの中にFormのインスタンスがあってという作りになっていて
    Formのコンストラクタで内部の保持しているFormのインスタンスを作っていて
    そのFormができる時にそのまた中のFormを作ろうとしてとなっていて完全に入れ子状態なんですが、
    その事は理解で来ていますか?

    なんか相当拙い方向に勘違いしているような気がします。
    Formの中にFormを持つようにした意図は何なんでしょう?
    何がしたくてこう言う構造にしたのでしょう?

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年8月12日 4:06
  • C言語を勉強し、関数の宣言と定義の違いを理解してください。
    次にC++言語を勉強し、クラスとメンバ関数に関する宣言と定義について理解してください。
    その上でC++/CLI言語を勉強し、.NETクラスがC++にどのように実現されているかを理解してください。

    今までのやりとりの内容を例えると、日本語の文法を知らない人に小論文の添削をお願いされている印象です。
    説明を聞いても言葉が通じていませんよね?
    2009年8月12日 4:17
  • わかりました。場所がふさわしくないのですね。作ろうとして作るの繰り返しだと。

    作られたインスタンスに対して作用させたいので、自分のクラスはgcnewするけど、Formのインスタンスを作るつもりではないので作られるときに
    Formインスタンスをもらって持っておこうと思い。

    クラスにインスタンスを書くと、”->Text' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。”のエラーになる。

    2009年8月12日 5:10
  • クラスにインスタンスを書くと、”->Text' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。”のエラーになる。

    ご説明されていることが分かりません。
    「クラスにインスタンスを書く」とはどういったことでしょうか。


    言語の仕様、開発プラットフォームでの流儀等を理解せずに続けると、こういったやりとりが続きます。
    完成するまでの道筋も長くなりますし、いざできあがっても次のことに移ったときにも、またコードの添削をすることになります。
    この調子だといつまでも自分でコードを書けないのですが、それでも、今の方針をお続けになるのでしょうか?

    私的には、C++ の基礎を理解するか、書籍が豊富な別の言語(C# や VB.NET)をお薦めしたいところです。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月12日 6:29
    モデレータ
  • わかりました。場所がふさわしくないのですね。作ろうとして作るの繰り返しだと。

    作られたインスタンスに対して作用させたいので、自分のクラスはgcnewするけど、Formのインスタンスを作るつもりではないので作られるときに
    Formインスタンスをもらって持っておこうと思い。

    クラスにインスタンスを書くと、”->Text' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。”のエラーになる。


    やろうとしている事の意味が分からないです。
    Formを使ってウインドウを作成する場合、main関数内でFormのインスタンスを作成して、作成したインスタンスの関数を呼び出していますよね。
    (この部分はご自分で提示されたコードの中にあります)
    表示中のウインドウに対して操作を行うのであれば、このインスタンスに対して指示を行う必要があります。
    新たにインスタンスを作成してもそれは表示中のウインドウに関連するインスタンスとは全くの別物です。
    ですから、むやみにインスタンスを生成しても意味が有りません。
    この辺に関しては、佐祐理さんが書かれている通り、クラスとインスタンスの関係がきちんと理解できていない為だと思います。

    あと、自インスタンスの関数内で自インスタンスが管理しているtextBox1にアクセスしたいのであれば、特に名前空間等の話は出てきませんよね。
    this->textBox1でもアクセスできるはずですし。

    あと、「クラスにインスタンスを書くと」の意味もわかりません。
    具体的にどの部分の事を言っているのでしょう?

    前のレスでも書いていますが、
    やはり必要な基礎知識が足りないまま突っ走ってしまっているように感じます。
    御本人の書き込みを見る限りでは、こちらの説明が理解してもらえていないように感じます。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年8月12日 6:31
  • 最初の質問で、別クラス(自作)の(フォームとは別名前空間)から、フォームのテキストボックスに値を入れたいの質問でしたので、
    自クラスでthis->textBox1が可能であることは確認しています。


    表示中のウインドウに対して操作を行うのであれば、このインスタンスに対して指示を行う必要があります。
    新たにインスタンスを作成してもそれは表示中のウインドウに関連するインスタンスとは全くの別物です。
    は、言葉としては理解できます。

    クラスにインスタンスを書くというう部分は、

    (フォームとは別名前空間)::別クラス(自作)(){

     TESTSANNSYOU::Form1::textBox1->Text = ":ここに完全修飾でインスタンスのテキストボックスのテキストに値を書いてもエラーになる";

    }です。

    勉強不足は否めませんが。

    2009年8月12日 7:09
  • 自クラスでthis->textBox1が可能であることは確認しています。

    (中略)

    TESTSANNSYOU::Form1::textBox1->Text = ":ここに完全修飾でインスタンスのテキストボックスのテキストに値を書いてもエラーになる";

    ・this->textBox1 と Form1::textBox1 が異なる意味であることを理解して下さい。
    ・自作クラスのメソッドの引数、あるいは自作クラスのコンストラクタで、操作の対象となる Form1 のインスタンスが持つ textBox1 インスタンスを渡すような設計にできれば良いのでは?
    ・今まで指摘されてきたことがよく分からないのであれば、大きな書店等で、自分の分かりやすい書籍を手にとって下さい。(C++/CLI は書籍がそもそもあまりないのですが。。。)


    # そもそも、自作のクラスから TextBox を直に操作する設計が良いとは言えないかも。場合によりますが。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月12日 7:22
    モデレータ
  • 表示中のウインドウに対して操作を行うのであれば、このインスタンスに対して指示を行う必要があります。
    新たにインスタンスを作成してもそれは表示中のウインドウに関連するインスタンスとは全くの別物です。
    は、言葉としては理解できます。

    クラスにインスタンスを書くというう部分は、

    (フォームとは別名前空間)::別クラス(自作)(){

    TESTSANNSYOU::Form1::textBox1->Text = ":ここに完全修飾でインスタンスのテキストボックスのテキストに値を書いてもエラーになる";

    }です。

    勉強不足は否めませんが。

    ::はスコープ解決演算子なのでForm1::と書いてしまった時点で特定のインスタンスを指していないというのは分かりますか?
    TESTSANNSYOUは名前空間だと思いますが、この名前空間内で宣言されたインスタンスであれば、スコープ解決演算子を使っても
    インスタンスを特定できるでしょう。ですが、Form1は、クラスの定義であり実体では有りません。
    従ってTESTSANNSYOU::Form1は特定のインスタンスを指していません。
    メンバー変数であるtextBox1は、Form1のインスタンスが特定できて初めて意味を持ちます。
    従って、TESTSANNSYOU::Form1::textBox1は、特定のインスタンスを指していないのです。

    例えば、電気スタンドにはスイッチがあります。スイッチが無いと機能しませんから必ずありますよね。
    電気スタンドと言うクラスにスイッチというメンバー変数があるイメージです。
    この場合の電気スタンドは特定の実物を指しているわけではなく、電気スタンドに分類される物の総称ですね。
    目の前にとある電気スタンドの実物Aがあったとします。Aのスイッチと言うとどのスイッチなのか特定されます。
    でも、電気スタンドのスイッチと言ってしまうとスイッチ自体を特定する事はできなくなります。
    電気スタンドに分類される実物についているスイッチならどれでも電気スタンドのスイッチに該当するからです。
    コンパイラから見たらTESTSANNSYOU::Form1::textBox1と言うのは正に電気スタンドのスイッチと
    言われているのと同じ事です。インスタンスを特定できませんから代入なんかできるはず無いと怒るわけです。

    この部分はクラスの考え方で基礎になる部分です。
    この部分の理解がどうも足りないようなので言語の基礎的な知識から勉強されたほうが良いのではとお勧めしているわけです。

    あと、メンバー変数とそれを保持しているクラスのインスタンスを同列に考えるのはどうかと思います。
    メンバー変数はクラス内の持ち物であり、外部から自由に扱えるのは危険が伴います。
    また、クラスの基本的な考え方から行けば、クラス内の動作は外からは隠蔽されるべきで
    入力と出力がきちんと提示されていれば良いという考え方になると思います。
    その意味ではForm1内部のtextBox1に直接値を設定するのはあまりよろしく無いと思います。
    クラスの考え方から行けば、Form1にtextBox1にtextを設定する為の関数を作成し、
    外部からはForm1のその関数を呼び出してtextBox1にtextを設定するほうが良いと思います。

    但し、Form1のメンバー関数(静的関数で無い物)を呼び出すときには、呼び出す対象になるForm1のインスタンスが
    必要になりますので、その事をお忘れなく。
    インスタンスとクラス定義の違いが理解できていれば、これらの事に関しても理解できるはずです。
    もし納得がいかないのであれば、すなわちその理解がまだ足りないことを意味します。

    追記:
    そのクラスの操作を行う為にはそのクラスのインスタンスが必要であると言う考え方はとても重要です。
    で、globalAなるクラスに必要なインスタンスを引き渡す手段が設定されていない点が問題になります。
    globalAクラスのインスタンスは、Form1とは全く関連性が無いクラスのインスタンスです。
    全く関連性の無いクラスのインスタンスからどうやってForm1クラスのインスタンスにアクセスするのでしょう?
    今のしょうもとさんの設計ではそのアクセスする手段が考慮に入っていないのです。
    アクセスする手段が設計されていないのにアクセスしようとしている訳で、
    できるはずのない事を無理やりやろうとしているのでおかしな事になっています。
    操作するべきインスタンスは特定のインスタンスであり、適当に生成した物ではだめなわけですから
    そのインスタンスにアクセスする為の手段をあなた自身で考えて提供しない限り、アクセスする事は出来ません。

    あと、言葉としては理解できますと書かれている部分ですが、
    main関数内のForm1のインスタンスform1(正確には参照になりますが)とForm1のコンストラクタの
    ローカル変数form1が全く別のインスタンスであると言う事は理解で来ていますか?
    また、このform1とForm1のメンバー変数として宣言しているform1も別物なんですが、これはどうでしょう。
    提示されているコードを見る限り、クラスとインスタンスの関係が理解できているとは思えないのです。
    そして、この関係を理解する事はとても大切です。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 編集済み PATIO 2009年8月12日 10:12
    2009年8月12日 7:47