VCのForm内で構造体を使いたい

このQ&Aのポイント
  • VC初心者&苦手なので、初歩的な事を教えてください
  • 構造体の配列をForm内の各関数で使用したいのですが、うまく定義できません
  • AaaDataをForm内の各関数で使用したいだけなのですが、エラーとなってしまいます
回答を見る
  • ベストアンサー

VCのForm内で構造体を使いたい

お世話になります VC初心者&苦手なので、初歩的な事を教えてください 構造体の配列をForm内の各関数で使用したいのですがうまく定義できません。 ソースの先頭で以下の宣言をしています(コンパイル通ります) #pragma endregion private: ref class AAADATA { public: int AAACnt; // AAAの数 int AAAPosX; // AAAのX座標 int AAAPosY; // AAAのY座標 int AAASize; // AAAのサイズ }; 以下が実際の宣言なのですが、MainForm_Loadでも上記宣言の直下に記載でも エラーとなってしまいます。 AaaData = gcnew array<AAADATA>^(10); やりたいことはAaaDataをForm内の各関数で使用したいだけなのですが。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

AAADataが refクラスなので AAAData = gcnew array<AAADATA^>(10); といった具合に テンプレートの型名の後ろに『^』が必要ですよ AAADataの宣言時も array<AAADATA^>^ AAAData; といった具合で 型名の直後に『^』を付け忘れないように … エラーが出る場合 C3149とかのエラー番号や 出力内容をのまま引用するなどしたほうがいいですよ

usami33
質問者

お礼

無事ビルド通りました ありがとうございました ^が足りなかったのですね、勉強不足でした

関連するQ&A

  • vc2005.net 構造体の宣言について

    visual studio(VC++) .net 2005マネージを練習しています。 クラス内に構造体を作りたいのですがうまくいきません。 public ref class Form1:~~ 上記クラス中で public: static STRUCTTEST test = gcnew STRUCTTEST; 上記のように記述したところ '^'この間接指定を型STRUCTTESTで使用出来ません。 と出ます。 マネージだから'^'で良いのではないでしょうか。 ^をとったところ testをマネージtestslusion::Form1のメンバとして定義できません。混合型はサポートされません。 と出ます。マネージでは^が必要なはずなのでこれは分かるのですが・・・。 gcnewをnewにしても^を*にしてもコンパイルエラーが出ます。 これは何故でしょうか。 ちなみに配列を static array<int>^ test = gcnew array<int>(10); このように記述する事は分かりました。

  • VC++の構造体について。

    テキストファイルからのテキスト文を1行づつString^ dataに入れておいてストックしておくようなグローバル変数を作るために次のような構造体を作成しましたがエラーが出てしまいます。 このような構造体を作成して eeprom_data eeprom_data;と宣言して eeprom_data->line_test[0].data; などのようにデータにアクセスするようにしたいのですが、どのようにしたらできますでしょうか? typedef struct _line_test_ { String^ data; String^ adress; int length; }line_test; typedef struct _eeprom_data_ { array<line_test^>^ line_test = gcnew array<line_test^>(32); }eeprom_data; 現在のエラー内容はこのように表示されています。 1> HomeBank.cpp 1>c:\.....\10-03\homebank\homebank\Form1.h(763): error C2814: 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(764): error C3265: マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(765): error C3265: マネージ 'adress' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(772): error C2814: 'HomeBank::Form1::_eeprom_data_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3265: マネージ 'line_test' をアンマネージ 'HomeBank::Form1::_eeprom_data_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C2864: 'HomeBank::Form1::_eeprom_data_::line_test' : static const int データ メンバー以外をクラス内で初期化することはできません ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうぞご教授頂きますよう、よろしくお願いします。

  • フォーム間のデータ受け渡し2

    Visual Studio 2005のフォームアプリケーションでプログラミングを行っているものです。前回と似たような質問になるのですが、微妙に状況が違っていてどうしてよいのかわかりません。まず、メインフォーム(Form1.h)でサブフォーム(pic0.h)を呼び出しているのですが、プログラムを見てお分かりのように起動時に呼び出ししているので最初に子フォームのpic0.hが現れます。この子フォームを消すことでメインフォームが現れるといった感じになっています。私がしたいことは、まずメインフォームの上でサブフォームを表示させ(メインフォームが表示された後にサブフォームが表示されてほしい)、さらにpic0.hでテキストボックスによる入力や出力で取得されたint型やdouble型のデータをForm1.hに引き渡すことです。以下がプログラムなのですが、どのようにプログラムしていいのかお分かりの方がいましたら御教授お願いします。 /*** メインフォーム(Form1.h) ***/ #pragma once #include "pic2.h" #include "pic0.h" // 省略 // #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { pic0 ^p0 = gcnew pic0(); //起動時呼び出し p0->ShowDialog(this); } /*** サブフォーム(pic0.h) ***/ #pragma once // 省略 // #pragma endregion praivate int a,double b; a = double::Parse(textBox1->Text); //例1 b = double::Parse(textBox2->Text); //例2 // 省略 // /*** pic0.cpp ***/ #include "StdAfx.h" #include "pic0.h" #include "Form1.h" using namespace pic;

  • VC++ 2008で別classからFormがincludeできません

    お世話になります。 タイトルの通り、別ソースで書いてあるクラスでForm1のincludeができません。includeすれば、そのclassの型が使用できるという認識なのですが、何か他にしなければならない事があるのでしょうか…。 環境はVisual C++ 2008 Express Editionです。 以下、ソースです。 [Form1.h] #pragma once #include "testclass.h" namespace testAppli { (略) private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { testclass *aaa = new testclass(); aaa->testfunc(this); } [testclass.h] #pragma once #include "stdafx.h" #include "Form1.h" class testclass { public: void testfunc(Form1^ aaa); }; [testclass.cpp] #include "stdafx.h" #include "testclass.h" void testclass::testfunc(Form1^ aaa) { return; } 以下のコンパイルエラーが出ています。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(98) : error C2065: 'testclass' : 定義されていない識別子です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(98) : error C2065: 'aaa' : 定義されていない識別子です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(98) : error C2061: 構文エラー : 識別子 'testclass' 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(99) : error C2065: 'aaa' : 定義されていない識別子です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(99) : error C2227: '->testfunc' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 1> 型は ''unknown-type'' です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\testclass.h(8) : error C2061: 構文エラー : 識別子 'Form1' 1>.\testclass.cpp(4) : error C2065: 'Form1' : 定義されていない識別子です。 1>.\testclass.cpp(4) : error C2065: 'aaa' : 定義されていない識別子です。 1>.\testclass.cpp(5) : error C2448: 'testclass::testfunc' : 関数の定義が間違っています。 1>testAppli.cpp 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\testclass.h(8) : error C2061: 構文エラー : 識別子 'Form1' 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(99) : error C2660: 'testclass::testfunc' : 関数に 1 個の引数を指定できません。

  • 【VC2005(CLR)】モードレスで呼んだダイアログの閉じ方

    VC2005初心者です。 現在CLRのプロジェクトでコーディングしてますが、 モードレスで呼んだダイアログの閉じ方が分かりません。 ご存知の方、よろしくお願いします。 ちなみに自分自身のダイアログを閉じるのは this->Close(); なので、以下のように書いたのですが、閉じてくれません。 ※showFlag = 0;を大域変数で宣言しておきます。 AAA^ formAAA = gcnew AAA(); if(showFlag ==0){ AAA^ formAAA = gcnew AAA(); formAAA->Show(this); showFlag = 1; } else{ formAAA->Close(); showFlag = 0; }

  • VC2010プログラミング

    formの中に自作のクラスを定義して使用したいのですが、どこに定義すればよいのかわかりません。 #pragma once #include "XXX.h" namespace FileRename { 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 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; XXX^ instance = gcnew XXX(); protected: private: /// <summary> /// 必要なデザイナー変数です。 /// </summary> System::ComponentModel::Container ^components;   ・   ・   ・ } XXXクラスはこの場所で定義するのは間違いなのでしょうか?

  • Form1で宣言したインスタンスをForm2で使う

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが、あるフォームで宣言したインスタンスを別のフォームで使う方法がわかりません。具体的にソースコードで説明すると using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace tesuto {   public partial class Form1 : Form   {     class Car     {       public int a;     }     public void Form1_Load(object sender, EventArgs e)     {       Car bike = new Car();//ここで宣言したインスタンスを       bike.a = 10;       Form2 fm2 = new Form2(this);       fm2.Show();     }   }   public partial class Form2 : Form   {     public void Form2_Load(object sender, EventArgs e)     {       int b;       b = bike.a;//ここでこのように使いたい     }   } } ということです。 前も似たような質問をさせていただき、たくさんの回答をいただいたにも関わらず自分のプログラム能力が低く、理解できませんでした><。なのでよければ、回答は言葉だけではなくこの上のソースコードを基にして(コピペ貼り付けなどで)、すこしでいいですのでソースコードを書いていただけませんでしょうか。 また、プログラミングを初めてまだ間もないので、すこし初心者向けでお願いします。 質問する側なのに色々要求をして申し訳ないのですが、もし御面倒でなければ御回答をお待ちしております。 よろしくおねがいします。 

  • 構造体の値受け渡しについて

    初歩的な質問で申し訳ありません。 現在、下記の現象に悩んでいます。 私の勉強不足が原因で大変恐縮なのですが、知見のある方はぜひアドバイスを宜しくお願い致します。 開発環境:VisualStudio2005.NET C# 現在下記のような構成でプログラムを開発しています。  ・構造体を定義しているクラス  ・メイン画面  ・サブ画面 構造体定義を共有化し、 メイン画面からプロパティ渡しでサブ画面にデータを渡しサブ画面のみで構造体の中身を編集したいのですが、※1の代入のタイミングで、メイン画面側の構造体も値が変わってしまいます。 いろいろ調べてみたのですが構造体は値型の受け渡しと書いている記事しか見つかりませんでした。 上記機能を実現するための解決法をご存知の方がいらっしゃいましたらアドバイス宜しくお願い致します。 //============================================== //構造体定義クラス //============================================== public class StructureCommonClass { public struct TestType { public int Data; } } //============================================== //メイン画面 //============================================== public partial class Form1 : Form { private StructureCommonClass.TestType[] _Test = new StructureCommonClass.TestType[3]; //コンストラクタ public Form1() { InitializeComponent(); _Test[0].Data = 10; _Test[1].Data = 20; _Test[2].Data = 30; } //取得用プロパティ public StructureCommonClass.TestType[] GetTestData { get { return _Test; } } //ボタンイベント private void button_F1_Click(object sender, EventArgs e) { Form2 _frm = new Form2(this); _frm.ShowDialog(); _frm.Dispose(); } } //============================================== //サブクラス //============================================== public partial class Form2 : Form { private Form1 _mainForm; private StructureCommonClass.TestType[] _Test; public Form2(Form1 _frm) { InitializeComponent(); _mainForm = _frm; } //フォームロード private void Form2_Load(object sender, EventArgs e) { _Test = _mainForm.GetTestData; _Test[0].Data = 50; //---- ※1 ---- } }

  • VC++2010 expressでファイル操作

    VC++2010 expressでテキストファイルを開いて、文字を1個ずつ読み取っていくプログラムを作りたいのですが、VCではどのようにファイル操作を行うのかがわかりません。以前使っていたCでは、 int main(){    FILE *fp    fp=fopen("test.txt","r") if( fp == NULL ){    printf( "%sファイルが開けません¥n", fname );    return 0;    } /* 以下に処理が続く */ とやっていたのですが、VC++ 2010 expressでフォームに実行ボタンを1つ作って、 Form1.hを開き以下のように書いて実行するとエラーが出ます。 #pragma once namespace サンプル{  /* (中略) */ #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { FILE *fp;       fp = fopen("test.txt", "r" ); if( fp == NULL ){    msgbox *fname+L"ファイルが開けません";    return 0; } } }; } 既にFILEの宣言からおかしいみたいなのですが、 どのように書けば正解なのでしょうか? 具体的なコードとコードを書き込む位置を明示してご教示ください。 #大変申し訳ありませんが、「○×をすればいい」等、具体的なコードが書いていない、 #コードを書く位置を明示していないコメントや、これでは拡張性が無い等の #上級のコメントはご遠慮ください。たぶん読んでもわかりませんので。

  • フォーム間のデータ受け渡し

    現在VIsual Studio 2005のフォームアプリケーションを使ってプログラミングしています。ボタンを押すことで新たな子フォームを作成し、親フォームから子フォームへグローバル関数で宣言しているbmp[],picture[],red[]などのデータを渡したいのですがどうすればいいのかわからず困っております。子フォームから親フォームへテキストボックスなどの値を渡す方法などはわかったのですが、それをどう応用していいのかもわからない状況です。最終的には親フォームのbmp[0]におけるred[0]が1(画像処理されている)なら子フォームでbmp[0]を表示させたいと思っています。わかる方がいましたらどうかご教授ください。よろしくお願いします。以下がプログラムとなっております。 *** 親フォーム *** #pragma once #include "pic2.h" namespace pic { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; // 省略 // public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // bmp = nullptr; Array::Resize( bmp, 20 ); Array::Resize( picture, 20 ); Array::Resize( bmpr, 20 ); this->red = gcnew array<int>(20); } // 省略 // private: System::Windows::Forms::PictureBox^ pictureBox1; private:array< Bitmap^>^ bmp; // 原画像格納 // private:array< Bitmap^>^ bmpr; // 処理画像格納 // private:array< PictureBox^>^ picture; private:array< int>^ red; // 処理:1 不処理:0 // // 省略 // #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp[0] = gcnew Bitmap("ファイル名",true); } private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) { pic2 ^p2 = gcnew pic2(); p2->ShowDialog();     /* ボタンを押すことで新たなフォーム作成 */ } private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { int x,y; int w = bmpr[0]->Width; int h = bmpr[0]->Height; if(red[0] == 1){ bmp[0] = gcnew Bitmap("ファイル名",true); pictureBox1->Image = bmp[0]; red[0] = 0; return; } if(red[0] == 0){ // 画像処理 // pictureBox1->Image = bmpr[0]; red[0] = 1; } } }; *** 子フォーム *** #pragma once //#include "Form1.h" #include "pic3.h" using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; namespace pic { /// <summary> /// pic2 の概要 /// public ref class pic2 : public System::Windows::Forms::Form { public: pic2(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // } // 省略 // } #pragma endregion private: System::Void pic2_Load(System::Object^ sender, System::EventArgs^ e) { if(親フォームのred[0]==1ならば){ pictureBox1->Image = bmp[0] } } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {   // 新たな子フォームpic3作成 // } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } }; }

専門家に質問してみよう