DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンストラクタでのフォームインスタンスの受け渡し

環境/言語:[XP Pro、C++.NET Framework 1.1]
分類:[.NET]

下記の様にコーディングすると「Form2(Form1* frm)」の行でエラーが表示されます。
「構文エラー:’)’が’*’の前にありません。」

原因と対処方法をご教授ください。
宜しくお願いします。

Form1

private void button1_Click(object sender, System.EventArgs e)
{
Form2* frm = new Form2(this);
frm->Show();
}
************************************
Form2

public:
Form2(Form1* frm)
{
InitializeComponent();
frm = frm1;
Form2ではForm1が何者かわかりません。
かといって このままのコードでForm2.hでForm1.hをインクルードすることはできません。

こういう場合、.cppファイルを使って回避します。

◎Form1.h

private void button1_Click(object sender, System.EventArgs e); // 宣言のみ


◎Form1.cpp(追加)
#include "Form2.h"

void Form1::button1_Click(object sender, System.EventArgs e)
{
    Form2* f = new Form2(this);
    f->Show();
}

◎Form2.h
#include "Form1.h"


類似スレ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=29550&forum=7&start=0
ご回答ありがとうございます。
こちらのコーディングが悪いのか、同一の場所で同様のエラーがでます。
include等を省いていましたので、修正前のコードを書きます。
お教え頂いたForm1の「#Include "Form2.h"」については記入済みでした。
Form2.cppへの「#include "Form1.h"」の追加ということで宜しいのでしょうか。

Form1.hのコード

#pragma once
#include "Form2.h"

namespace passTest
{
using namespace System;
・・・
public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}
protected:
void Dispose(Boolean disposing)
{
if (disposing && components)
・・・
}
private: System::Windows::Forms::Button * button1;
private: System::Windows::Forms::TextBox * textBox1;
private:
System::ComponentModel::Container * components;

void InitializeComponent(void)
{
this->button1 = new System::Windows::Forms::Button();
・・・
}
private: System::Void button1_Click(System::Object *
sender, System::EventArgs * e)
{
Form2* f = new Form2(this);
f->Show();
}
};
}
*********************************************
Form1.cppのコード

#include "stdafx.h"
#include "Form1.h"
#include <windows.h>

using namespace passTest;

int APIENTRY _tWinMain(HINSTANCE hInstance,
・・・
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState =
System::Threading::ApartmentState::STA;
・・・
return 0;
}
**************************************************************************
Form2.hのコード
#pragma once

using namespace System;
・・・
using namespace System::Drawing;

namespace passData
{
public __gc class Form2 : public System::Windows::Forms::Form
{
public:
Form2(Form1* frm)
{
InitializeComponent();
}
protected:
void Dispose(Boolean disposing)
{
・・・
}
private: System::Windows::Forms::Button * button1;

private:
System::ComponentModel::Container* components;

void InitializeComponent(void)
{
this->button1 = new System::Windows::Forms::Button();
・・・
this->ResumeLayout(false);
}
private: System::Void button1_Click(System::Object * sender,
System::EventArgs * e)
{
}

};
}
*********************************************
Form2.cppのコード

#include "StdAfx.h"
#include "Form2.h"
**************************************************************************
2007/01/25(Thu) 10:45:59 編集(投稿者)

ですから、

Form1.hのコード

>#include "Form2.h"
削除

>private: System::Void button1_Click(System::Object *
>sender, System::EventArgs * e)
>{
>Form2* f = new Form2(this);
>f->Show();
>}
>};

private: System::Void button1_Click(System::Object * sender, System::EventArgs * e);

Form1.cppのコード

#include "Form2.h"

System::Void Form1::button1_Click(System::Object * sender, System::EventArgs * e)
{
Form2* f = new Form2(this);
f->Show();
}

を追加。

Form2.hのコード

#include "Form1.h"

を追加。
すみません。ぼけてました。
下記の様に修正したのですが、
「'Form2':定義されていない識別子です。」
「'f':定義されていない識別子です。」等のエラーがでます。#include "Form2.h"を追加しても参照できないのでしょうか。
度々すみませんが、ご教授願います。

Form1.hのコードの修正部分

//#include "Form2.h" コメントとする

private: System::Void button1_Click(System::Object *
sender, System::EventArgs * e)
{
//Form2* f = new Form2(this); コメントとする
//f->Show(); コメントとする
}
*******************************************************
Form1.cppの修正部分

#include "Form2.h" 追加する

System::Void button1_Click(System::Object * 追加する
sender, System::EventArgs * e)
{
Form2* f = new Form2(this);
f->Show();
}
*******************************************************
Form2.hの修正部分
#include "Form1.h" 追加する
ちがいます。
>private: System::Void button1_Click(System::Object *
>sender, System::EventArgs * e)
>{
>//Form2* f = new Form2(this); コメントとする
>//f->Show(); コメントとする
>}

private: System::Void button1_Click(System::Object * sender, System::EventArgs * e);
//{
//Form2* f = new Form2(this); コメントとする
//f->Show(); コメントとする
//}
プロトタイプ宣言だけにするのです。)の後ろに ; がくるのに注目してください。


>System::Void button1_Click(System::Object * 追加する
>sender, System::EventArgs * e)
>{
>Form2* f = new Form2(this);
>f->Show();
>}
私のレス、ちゃんと見ていますか?

System::Void Form1::button1_Click(System::Object * sender, System::EventArgs * e)

Form1:: を付けないとダメです。

>「'Form2':定義されていない識別子です。」
ですが、namespaceがあるので

passData::Form2として使わないとダメです。
めんどくさければ、

Form1.cppに

using namespace passData;

とでも追記してください。
Blueさんありがとうございました。

Form1::button1_ClickですがエラーでForm1が定義されていないとなったため、いらないものかと思い削除してしまいました。
Form2と同様にpassData::Form1とすることで正常に動作いたしました。
お手数をおかけして申し訳ございませんでした。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板