MFCで二次元配列のCEditコントロールを作成できません

このQ&Aのポイント
  • MFCで二次元配列のCEditコントロールを作成しようと思いましたが、うまくできません。
  • 何がうまくいかないのか、教えてください。
  • 詳細な情報がないため、具体的な解決策を提供することはできませんが、おそらくコードのどこかに問題がある可能性があります。
回答を見る
  • ベストアンサー

MFCで二次元配列のCEditコントロールを作成できません。

MFCで二次元配列のCEditコントロールを作成しようと 思いましたがうまくできません。 どこがいけないのでしょうか? void CProject2View::OnBnClickedButton1() { CEdit **ed; ed=new CEdit*[10]; for(int i=0;i<10;i++) { ed[i]=new CEdit[10]; for(int j=0;j<10;j++) { ed[i][j].Create(ES_LEFT,CRect(60*i, 40*j, 60, 40),this,5588+10*i+j); } } }

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>では、ないのですか? はい。 newに対するdeleteは呼ばれてますが、 CEdit::Create()に対するDestroyWindowが呼ばれていません。 >new演算子を使用して、 >テキストコントロールを追加した場合、 >テキストの内容が変更されたときに、 >メッセージボックスが表示されるようにするにはどうすればいいですか? OnCommand()のメッセージハンドラを処理する。 もしくは、CEditをそのまま使うのではなく、CEditの派生クラスを定義して使います。で、メッセージハンドラを定義すればできます。

thulala
質問者

お礼

MFCのことをもう少し理解してから改めて質問させていただきます。 ありがとうございました。

thulala
質問者

補足

>>OnCommand()のメッセージハンドラを処理する。 >>もしくは、CEditをそのまま使うのではなく、 >>CEditの派生クラスを定義して使います。 >>で、メッセージハンドラを定義すればできます。 よくわかりませんでした。 すみません。 あちこちHPもまわりましたが、 理解できませんでした。 >>newに対するdeleteは呼ばれてますが、 >>CEdit::Create()に対するDestroyWindowが >>呼ばれていません。 よくわかりました。 ありがとうございます。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>あっていると思います。 って言われてもよくわからないのですが・・・ 補足に書かれたコードで動くようになったってことですか? で、どうすればいいのでしょうか? ちなみにこのソースをぱっと見る限りは、 エディットの破棄が行われていない、ってのが抜けてますね。 あとは static bol=true;ってありますけど、 正しくは static bool bol=true; ってとこですかね?

thulala
質問者

補足

エディットの破棄が行われていない というのは、 for(int i=0;i<10;i++) { delete[] cd[i]; } delete[] cd; bol=true; } では、ないのですか? それと、 new演算子を使用して、 テキストコントロールを追加した場合、 テキストの内容が変更されたときに、 メッセージボックスが表示されるようにするにはどうすればいいですか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>思いましたがうまくできません。 どのようにうまくいかないんですか? 1つのときは作成できるのですか? 落ちるんですか? 表示されないんですか? Createの戻り値とか調べましたか? #ちなみにこれだと2次元配列じゃないんですけど。 似てるけど違います。CEditの配列を要素に持つ1次元配列なんです。

thulala
質問者

補足

回答ありがとうございました。 すみません、少しぼけていました。 正しくは、 CEdit **cd; void CProject2View::OnBnClickedButton1() { static bol=true; char str[100][12]; if(bol) { cd=new CEdit*[10]; for(int i=0;i<10;i++) { cd[i]=new CEdit[10]; for(int j=0;j<10;j++) { cd[i][j].Create(WS_CHILD|WS_VISIBLE|ES_LEFT,CRect(i*45,j*30,i*45+40,j*30+25),this,10*i+j); } } ransu(str); for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { cd[i][j].SetWindowText(str[i*10+j]); } } bol=false; } else { for(int i=0;i<10;i++) { delete[] cd[i]; } delete[] cd; bol=true; } } でした。 あっていると思います。

関連するQ&A

  • 2次元配列

    大学の課題なのですが 10×10の2次元配列に、平面のビットパターンが入っているとする(0と1の整数が入っているとする)。左右反転して出力しなさい。 という問題で、自分は以下のプログラムを作ったのですが、うまくうごいてくれません。だれか間違いを指摘していただけないでしょうか。 よろしくお願いします。 #include<stdio.h> int main(void) { int i,j; int data[10][10]={0,1}; for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%3d",data[10-i][10-j]); } printf("\n"); } return(0); }

  • 2次元配列のポインタ

    整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか?

  • 2次元配列を引数とする関数について

    2次元配列を引数とする関数について 私は今、2次元配列を引数とする関数の表を作るという課題に取り組んでいます。 条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、 関数内で表の値を代入し、値を表示する関数を作り、事実上二つの関数を作るというものです。 私は以下のようなプログラムを作り、動かしましたが、[数字][数字]=********のような本来 あるべき実行結果とは異なる数字の羅列が出てきてしまいました。 ↓ #include <stdio.h> void func(int a[][6]); void fund(int b[4][6]); void main(void) { int a[4][6]; fund(a); func(a); } void func(int a[][6]) { int i,j,b[4][6]; fund(b); for(i=0;i<4;i++)        { for(j=0;j<6;j++) { printf("a[%d][%d]=%d\n",i,j,a[i][j]); printf("\n"); } } } void fund(int b[4][6]) { int i,j; for(i=0;i<4;i++) { for(j=0;j<6;j++)          { scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]); } } } 本来の実行結果 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。 どうすれば良いのでしょうか? 何か良いアドバイスをよろしくお願いします。

  • 二次元配列に関する質問です。

    一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか?

  • 多次元配列の受渡しでの警告

    多次元配列を関数に受け渡す際に、 警告: passing argument 1 of ‘mat_add’ from incompatible pointer type 警告: passing argument 2 of ‘mat_add’ from incompatible pointer type のような警告が出てきてしまいます。 プログラムは、明解C言語(柴田望洋著)で紹介されているサンプルプログラムなのですが(下に載せておきます)、どうしてこのような警告がでるのか分からず困っています。 多次元配列の渡し方になにか問題があるのでしょうか? #include <stdio.h> void mat_add(const int ma[][3], const int mb[][3], int mc[][3]) { int i,j; for(i=0; i<2; i++) for(j=0; j<3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i,j; int ma[2][3] = {{9,2,-3},{4,5,1}}; int mb[2][3] = {{9,2,-3},{4,5,1}}; int mc[2][3] = {0}; mat_add(ma, mb, mc); for(i=0; i<2; i++){ for(j=0; j<3; j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); }

  • Javaの二次元配列についてです

    配列要素を 1, 2, 3, 4, 5 2, 2, 3, 4, 5 3, 3, 3, 4, 5 4, 4, 4, 4, 5 5, 5, 5, 5, 5 のようにしたいのですがどうすればよろしいでしょうか? int[][] a = new int[5][5]; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { ~ここの処理を教えてください~ } }

    • ベストアンサー
    • Java
  • 3次元配列の動的確保

    2次元配列は、 // 動的確保 int **mat = new int*[row]; for(i = 0; i < row; i++) mat[i] = new int[col]; //解放 for(i = 0; i < row; i++) delete [] mat[i]; delete [] mat; で、生成と開放はできたのですが、3次元となると、途端にわからなくなります。 かれこれ1時間半は試行錯誤はしているのですが、たどり着きそうにありません。 どなたかご教授願います。

  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • 2次元配列にポインタを格納

    http://www.okweb.ne.jp/kotaeru.php3?q=505241の訂正版の質問です。 VC++6.0を使っております。 下のようなプログラムを作ってみました。 #include <stdio.h> #include <vector> using namespace std; class c{ public: c(); virtual ~c(); int get(){return j;}; void set(int i){j=i;}; private: c(const c &right); const c &operator=(const c &right); int j; }; void main(){ vector <vector<c*> > a; c *b; for(int n=0;n<10;n++){ for(int i=0;i<10;i++){ b=new c; a[n].push_back(b); } } for(int j=0;j<10;j++){ for(int i=0;i<9;i++){ a[i][j] -> set(i+j); } } for(j=0;j<10;j++){ for(int i=0;i<9;i++){ printf("%d ",a[i][j] -> get()); } printf("%d\n",a[9][j] -> get()); } for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ delete a[i][j]; } } } すると、コンパイルには成功するのですが、実行は出来ません。 その理由は、「外部参照1が未解決」だそうです。 アドバイスをお願いいたします。

  • 2次元配列の基礎について

    とある問題で 下に示す行列x,yの積を求めるプログラムを作成せよ。 x=[123][456] y=[15] [53][81] 問題の意味が自分にはよくわからないのですが この場合 123*15;123*53;123*81 456*15;456*53;456*81 の解答を表示させればいいのでしょうか? 自分でやったら以下のようになりましたが、これだと456*53と123*15と0しか表示されません。どこをどう直せば宜しいでしょうか? ご教授お願いしますm(__)m #include <stdio.h> int main(void){ int ma[3][1] ={{123},{456}}; int mb[3][1] ={{15},{53},{81}}; int mc[3][1] ={0}; int i; int j; for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ mc[i][j] =ma[i][j] * mb[i][j]; } } for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ printf("%3d",mc[i][j]); putchar('\n'); } } return 0; }