C#のWindowsアプリケーションでボタン押下時の配列処理について

このQ&Aのポイント
  • C#のWindowsアプリケーションでボタンを押すと、oという配列が生成されます。
  • 他のボタンを押すと、oの値を引いてくることができます。
  • しかし、未確定の配列の大きさを他のイベントで使う場合、どのような処理が必要でしょうか?
回答を見る
  • ベストアンサー

C#のwindowsアプリケーションで??

今、以下のような流れを考えています C#のwindowsアプリケーションでフォーム中のボタンを押す。 ↓ このイベントで発生するoという配列を戻す ↓ 他のボタンを押した時にoの値を引いてくる。 しかしながら、うまく処理できていません。 配列の大きさが未確定のoという配列を戻して他のイベントで使うにはどういう処理をしたらいいのでしょうか? わかるかたがいましたら、教えていただけないでしょうか? よろしくお願いします。 参考までに考えているプログラムを下に示します。 記述中のプログラム(voidをdoubleに変更してもうまくいきませんでした。 public void button3_Click(object sender, EventArgs e) {       int a; int b; 途中省略       double[, ,] o = new double[a, 50,b];        途中省略 return o }

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>他のボタンを押すとdouble[, ,] o;に入力した値はNULLに戻ってしまいます。 フィールドに記述した内容と、 それぞれのボタンのイベントハンドラに記述した内容はどんなのですか?  public partial class Form1 : Form  {   double[,,] o;   public Form1()   {    InitializeComponent();   }   private void button1_Click(object sender, EventArgs e)   {    o = new double[2,3,4];    o[0, 0, 0] = 1.234;   }   private void button2_Click(object sender, EventArgs e)   {    if (o != null)     o[0, 0, 0] += 0.111;   }  } これで、とりあえずbutton1を「1回」クリックした後で、button2をクリックしていくとo[0,0,0]は0.111ずつ増えていきますが。 # ブレークポイント設定して、ステップ実行で確認。 なお、その後button1をクリックすると先に確保していた分は破棄され、新たにnewで確保したモノに置き換わります。 # 破棄した分のメモリは後で回収されることになります。 再確保させないためには…    if(o == null)     o = new double[2,3,4]; ってな感じになるでしょうかね。 button1_Click()でnewしている箇所を double[,,] o = new double[2,3,4]; としてはダメですよ。 この場合は「フィールドのo」ではなく「ローカル変数のo」を作成しているだけですから、イベントハンドラから抜けると「ローカル変数のo」は破棄されます。

saterain20
質問者

お礼

ありがとうございます。うまくいきました。 本当にありがとうございます。 ずっと悩んでたことがやっと解決できました。 ミスはご指摘の下記内容でした。 button1_Click()でnewしている箇所を double[,,] o = new double[2,3,4]; としてはダメですよ。 この場合は「フィールドのo」ではなく「ローカル変数のo」を作成しているだけですから、イベントハンドラから抜けると「ローカル変数のo」は破棄されます

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>newして割り当てた場合、フォームのフィールドとイベントパンドラ内で2重の定義になり、 >既にスコープされていると表示されてしまいました。 フィールドには double[, ,] o; だけ。 コンストラクタでもnewしないでおきます。 # o = null;くらいはいいかもしれませんが。 で、 public void button3_Click()内では、 o = new double[a, 50,b]; とします。

saterain20
質問者

お礼

ありがとうございます。 それも行ったのですが。 他のボタンを押すとdouble[, ,] o;に入力した値はNULLに戻ってしまいます。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>このイベントで発生するoという配列を戻す どこに戻すのでしょうか? 掲示されたコードだと、イベントハンドラの呼び出し元に返していますが、呼び出し元が戻り値としてソレを要求していますか? >public void button3_Click(object sender, EventArgs e) なので戻り値はなしのハズですが……。 # returnの行で警告かエラーになっていませんか? おそらくフォームでしょうから、フォームのフィールドにdouble[, ,] o;を加えて、イベントハンドラ内(button3_Click()内)でnewして割り当てればよいかと。 >他のボタンを押した時にoの値を引いてくる。 では、oがnullかどうか判定してから処理するようにします。

saterain20
質問者

お礼

ありがとうございます。 newして割り当てた場合、フォームのフィールドとイベントパンドラ内で2重の定義になり、 既にスコープされていると表示されてしまいました。 どうしたら解決できるのでしょうか? 調べているのですが、わかりません。追加の質問になり申し訳ありません。可能であれば教えてください。

saterain20
質問者

補足

newして割り当てるとはどういうことでしょうか?

関連するQ&A

  • C#イベント中の戻り値の設定の仕方を教えてください

    public void button6_Click_1(object sender, EventArgs e) { double a; a = 1.0; } 上記のプログラムでaを戻すにはどうしたらいいですか? voidをdoubleに変えてreturn a;などいろいろ試しているのですがうまくいきません教えてください。 よろしくお願いします。 また、a,bと複数の値を返すにはどうしたらいいですか?

  • visual C++ windowsフォーム

    簡単なプログラムですが windowsフォームを使ったことがないので質問させていただきます。 ボタンとlabelを用いて ボタンを押したら labelに計算結果が表示されるというものです。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {  int a;   for(a=0;a<=10000;a++)   {     label1->Text=a.ToString();  } } このような 簡単なプログラムを書いたのですが。ボタンを押した結果は少したって10000というものでした。 私がイメージしてるは1,2,3,4、・・・・・10000(※1が表示され、2が表示 横に続くのではない)と表示されるものを作りたいのですが。 今までは コマンドプロンプトで行っていたのですが この場合はイメージ通りにできたのですが。 windowsフォームでは、できませんでした。 なぜでしょか?? 詳しいやり方を教えてください。

  • Visual C#を用いたボタン押し処理について

    Visual C#を用いたボタン押し処理について Visual C#のWindowsアプリケーションについての質問です。 「ボタンA、ボタンB、ボタンC」ボタンを3つ作ります。 private void button1_Click(object sender, EventArgs e){} このようなソースになるのですが、ボタンAを押したときにボタンB、ボタンCを押した処理を行いたいです。ボタンB、Cを button2_Click(X,Y); button3_Click(X,Y); でロードするのはわかるのですが、XとYには何を入れればいいのでしょうか? 検索した結果、おそらくnullを入れてはいけないのはわかったのですが、何を入れればいいのかがわかりません。 >非静的イベントを発生させるときは、sender パラメーターとして null (Visual Basic の場合は Nothing) を渡さないでください。 よろしくお願いします。

  • C# Formの操作

    Form2 form2 ; // 子 Form Form3 form3 ; // 子 Form private void button1_Click(object sender, System.EventArgs e) { form2 = new Form2() ; this.AddOwnedForm(form2) ; // 親 Form が form2 を所有する form2.Show() ; } private void button2_Click(object sender, System.EventArgs e) { form3 = new Form3() ; this.AddOwnedForm(form3) ; // 親 Form が form3 を所有する form3.Show() ; } 上記のようにボタン一つに対して1つのFormに対する処理をするのではなく,ボタン1つに対して 複数のFormを処理する.つまり 例えば,Form1,2,3とあったとして,Form1のボタンを押してFrom2を開き,そこで何らかの処理を したものをForm1に反映する.または,From3のボタンを押してForm2を開きそこで何らかの処理を 行いForm3に反映する. この場合,Form1とForm3のどちらのFormのボタンが押されたか判断しないといけないと思うのですが,ここの処理がうまくいきません. どちらかのFormのボタンを押してForm2を表示し,どちらかのFormに反映させる所までは出来たのですが,両方の判断材料を入れて,どちらのFormのボタンを押されたか判断する際に,押されなかった方が「null」となりエラーになります. 下記にこの判断部分を掲載いたします.どなたかご教授よろしくお願いいたします. Form1 public int but = 0; public int butt1; public string DB; public string HDB; public Form2 f2 = null; private void mybutton1_Click(object sender, EventArgs e) { butt1 = 1; ・ ・ ・ public int Ye=0; private void button43_Click(object sender, EventArgs e) { butt1 = 0; From2 public partial class Form2 : Form { Form1 f1; Form3 f3; public Form2(Form1 f) { f1 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } public Form2(Form3 f) { f3 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { #region int Pin1 = f1.butt1; int Pin3 = f3.butt3; Form3 Form1と基本的には同じです.

  • イベントハンドラ関数について

    現在VC++/CLR 2005 でプログラミングをしています。 基本的な事柄かもしれませんが、質問させてください  以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 その場合は private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ str = textBox1->Text } のようにボタン2のイベントハンドラ関数をボタン1と同じように書けばいいのですが イベントハンドラ関数の処理が膨大になった場合を考えて省略する 書き方は無いのでしょうか?(以下の場合ですとエラーが起こってしまいます。) private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(); } 宜しくお願いします

  • C# 関数はどこに書くの?

    c#を始めました。 関数はどこに書けばよいのだろうと思い以下の2つのパターンを書きました。どちらも実行するとちゃんと動いています。 どちらの書き方が正しいのでしょうか?よろしくお願いいたします。 パターン1 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int a=3; int n= tasu(a); MessageBox.Show(n.ToString());   //ここに関数を書く int tasu(int a10) { return a10 - 2; } } } パターン2 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int a=3; int n= tasu(a); MessageBox.Show(n.ToString()); }   //ここに関数を書く int tasu(int a20) { return a20 -1; } }

  • C#のWindowsアプリケーションのセルダブルクリックのコードについて

    今、C#のWindowsでプロジェクトのソースコードを勉強しています。 セルダブルクリックイベント処理でわからないんですが、それが次のコードです private void dgvOrder_CellDoubleClick(object sender,DataGridViewCellEventArgs e) そのイベント処理が SelectDataUpdate(2,e.RowIndex); です。  ここで、わからないのがイベント処理の()の中です。 この、2,e.Indexはどういうことですか?SelectUpdateは、選択して、更新するですよね? 詳しく教えてください。お願いします。

  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • C# 2010 contextMenuStripのファンクション名の不

    C# 2010 contextMenuStripのファンクション名の不思議? まず2ケのメニューアイテムを持つcontextMenuStripを作り、それぞれのTEXTを試験1、試験3と改名します ダブルクリックするとハンドラーが出来て、その名称が(1)(2)のように TEXT名+ToolStripMenuItem_Click なります ここでいったんプロジェクトを終了して再ロードします 画像のように試験1と試験3の間に『試験3を途中に追加』を入れてダブルクリックして作ったファンクション名は前2者とは異なり (3)の如くtoolStripMenuItem1_Click となってしまいます なぜ 試験2を途中に追加ToolStripMenuItem_Click にならないのでしょうか? private void 試験1ToolStripMenuItem_Click(object sender, EventArgs e) --- (1) { } private void 試験3ToolStripMenuItem_Click(object sender, EventArgs e) --- (2) { } private void toolStripMenuItem1_Click(object sender, EventArgs e) --- (3) { } 追伸 『試験3を途中に追加』が長すぎるかと思い、『試験3』だけにしても結果は同じでした

  • VC++  Windowsアプリケーション作成

    【VC++ 2005 ExpressEdition】使用 ●今回、上記の環境を用いて簡単なWindows用ツールでも作成しようと思っております。  実際起動し、新しいプロジェクトの開始で、Windowsフォームアプリケーションを選択したのですが、初めから様々なcppファイルやらヘッダファイルがあり、プログラムもすでに大量に書かれていてどこにWinMainがあり、どこから書いていけばよいのか分かりません。 試しにボタンをフォームデザインで作成し、ダブルクリックによりイベントを作成してみたのですが、 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) このような文が表示されました。 過去にBolandの開発環境を使い1からウィンドウを作成したことがあり、BN_CLICKEDなどのメッセージが使われるのだろうと思っていたのですが全く意味が分かりませんでした。参考書やサイトに書いてあるプログラムもどこに書いてよいのか分かりません。 VC++でのWindowsアプリケーションの作成時の使い方をどなかた教えていただけないでしょうか。 尚、VC#、VBでのWindowsアプリケーション作成、C++でのWinAPIについては、かじった程度の経験はあります。