いつもお世話になっております。

現在フォームAからフォームBをモードレスで呼び出しております。
フォームBが閉じたことをフォームAに知らせたいのですが、
どのようにすればよいか教えて頂けませんでしょうか。

現在下記のタイミングでコーディングすればよいと思うのですが、
いかがでしょうか。
private: System::Void FormB_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
//ここにコード記述
}

お手数ですが、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

FormBのFormClosingイベントに


FormAで定義したFormClosingEventHandlerデリゲードを設定する。

// ずっと前のコードに追加

private:
  Form2^ childForm_;
private:
  System::Void ChildForm_Closing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)
  {
    MessageBox::Show(L"フォームが閉じるよ");
  }
private:
  System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
  {
    if ((this->childForm_ != nullptr) &&
    !this->childForm_->IsDisposed)
    {
      this->childForm_->Close();
      /this->childForm_ = nullptr;
    }
    else
    {
      this->childForm_ = gcnew Form2();
      this->childForm_->FormClosing += gcnew FormClosingEventHandler(this, &Form1::ChildForm_Closing);
      
      this->childForm_->Show();
    }
  }

ただ
>フォームを閉じたこと
だったら、FormClosingではなくFormClosedではないかと。

この回答への補足

回答ありがとうございます。
(返信遅れてすみません。)

※本件はhttp://okwave.jp/qa4865001.htmlで質問させていただいた延長でした。

>FormBのFormClosingイベントに
>FormAで定義したFormClosingEventHandlerデリゲードを設定する。
とはどういうことなのでしょうか。

また、教えていただいたソースは、以下の部分も含めてすべて呼び出し元のフォームに書き込むのでしょうか。
  System::Void ChildForm_Closing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)
  {
    MessageBox::Show(L"フォームが閉じるよ");
  }

お手数ですが、よろしくお願いします。

補足日時:2009/06/04 10:56
    • good
    • 0

>とはどういうことなのでしょうか。


は示したコードのとおり。

>以下の部分も含めてすべて呼び出し元のフォームに書き込むのでしょうか。
そう。


本気でC++/CLIをやるのであれば、ちゃんとした基本を勉強しておくべきでしょう。

オススメ書籍
http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5C-CLI- …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

教えていただいたとおりしたら、何とかできました!
ありがとうございます。

しかしながら、デリゲートをまったく理解していないので、
教えていただいた本を利用して、もう一度勉強させて頂きます。

お礼日時:2009/06/05 08:52

 こんばんは。

こう言う事でしょうか。

//フォームA
public: System::Void FormA::NotifyClosing(System::Windows::Forms::Form^ form)
{
//必要であればformを使用して何かする
}

//フォームB
private: System::Void FormB_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)
{
//ここにコード記述
FormA^ formA = dynamic_cast<FormA^>(this->Owner);
if(formA == nullptr)return;
formA->NotifyClosing(this);
}

この回答への補足

早速のご回答ありがとうございます。

やりたいことは、教えていただいたソースのイメージです。

しかしながら、教えていただいたソースではエラーが
出てしまいました。
(FormAが定義されていませんと出てきます。)

また、
formA->NotifyClosing(this);
のように、formAはNotifyClosingを利用できませんでした。

補足日時:2009/05/28 00:08
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QビジュアルC++でボタンの有効/無効

ビジュアルC++でプログラミングをしているのですが、ツールから貼り付けたボタンの有効/無効を操作したのですが、何度やっても成功しません><、


ネットで検索した結果
CWnd* myWnd = GetDlgItem(IDC_MYEDIT);
myWnd->EnableWindow(TRUE);

でできると書いてあるのですが、どのサイトの物を使用してもビルドできませんでした(;ロ;)

どなたか原因がわかるかた、ご教授くださいm(__)m

Aベストアンサー

みているサンプルは
「Windows フォームアプリケーション」
で作成したプロジェクト用のものではありません。

どのタイミングで有効・無効を切り替えるかわかりませんが、
Enabledプロパティで変更できませんか?

this->button1->Enabled = false; // 無効

Control::Enabled プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.enabled.aspx

Qコンボボックスでデフォルト値の設定

コンボボックスのデフォルト値を設定しようとして
以下のコードを書いたのですが、コンパイルがとおり
ません。どうしたらよいでしょうか?

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
//費目初期値
array<System::String^>^himokudata = {
"通信費","光熱費","住居費"
};

for (int i=0; i < himokudata->Length; i++) {
comboBox1->Items->Add(himokudata[i]);
}

comboBox1->Text = comboBox1->Items->default;
<---ここが通らない。textに表示されるデフォルト
値として通信費を入れたいのだが
}

Aベストアンサー

comboBox1->SelectedIndex = 0;

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QVisual C++ でコントロールを配列にする方法

VisualC++を使い始めて楽しさを覚え始めた頃ですが、壁にぶつかり解決できません。よろしくお願いいたします。

Windowsフォーム作成において、ボタンやラベルなど、ツールボックスからドロップできるコントロールを配列にする方法が分かりません。
ためしにボタンを二つは配置してから、Button1とButton2がButton[0]とButton[1]になるように定義から書き直してみましたが、
private: System::Windows::Forms::Button^ button[2];
の行で、
「: error C2728: 'System::Windows::Forms::Button ^ : ネイティブ配列はこのマネージ型を含むことはできません”」
とエラーがでます。

どうすれば、コントロールの配列を作れるのでしょうか。できるだけ簡単な方法(できればVisualC++の機能でGUIでサクッと作れれば良いのですが)をご教授願います。 過去の質問に似たものがありましたが、参照先のリンクが切れていました。。

Aベストアンサー

array<Button^>^ button = gcnew array<Button^>(2);
ではダメですか?

Q【VC++2005(CLR)】マルチスレッドを使用したソースについて

いつも大変お世話になっています。
VC++初心者です。

現在、VC++2005 CLRプロジェクト(C++/CLI)で
コーディングしています。

マルチスレッドを使おうと思い、他のページを参照して
以下のソースを書くと
以下のエラーメッセージが出ました。

どのように対処すればよいか、ご教授頂けませんでしょうか。

エラーメッセージ
>delegate コンストラクタの引数が無効です。デリゲート ターゲットはメンバ関数のポインタである必要があります。
******************
private: System::Void ProjectA_Shown(System::Object^ sender, System::EventArgs^ e) {
 System::Threading::Thread^ t =
  gcnew System::Threading::Thread(
  gcnew System::Threading::ThreadStart(SendData()));
 t->IsBackground = true;
 t->Start();
 t->Join();
}

private: System::Void SendData(){
 //データを送る処理
}
******************
※表示のため先頭に全角スペースを入れています。

以上、よろしくお願いしたします。

いつも大変お世話になっています。
VC++初心者です。

現在、VC++2005 CLRプロジェクト(C++/CLI)で
コーディングしています。

マルチスレッドを使おうと思い、他のページを参照して
以下のソースを書くと
以下のエラーメッセージが出ました。

どのように対処すればよいか、ご教授頂けませんでしょうか。

エラーメッセージ
>delegate コンストラクタの引数が無効です。デリゲート ターゲットはメンバ関数のポインタである必要があります。
******************
private: System::Void ProjectA_Sh...続きを読む

Aベストアンサー

「デリゲート ターゲットはメンバ関数のポインタである必要があります」
っていっているんだから, その通りに (メンバ関数のポインタを) 渡せばいいのでは? ああ, もちろんそれだけでいいかどうかは知りませんが.

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QVC++2008 フォーム間の変数の受け渡しについて

フォーム1で
DateTime d1;
int year;
d1 = DateTime::Now;
year = System::Int32::Parse( d1.ToString("yyyy") );
で読み込んだ現在の年数を、フォーム2で使いたい場合どうすればいいのでしょうか?

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form2^ f = gcnew Form2();
f->Show();
}
でForm2を読み込んでいるので、ここに「変数yearを使う」旨を書けばいいのかとも思いましたが、うまく行きませんでした。

使用しているのはVisualC++2008 ExpressEdition。
ボタンをクリックすると別フォームを表示して、そこで元のフォームで使った変数を使おうと考えています。

Aベストアンサー

単にメンバ変数を使うのではだめなんでしょうか?

Form2 に

private:
  int year_;
public:
  void SetYear(const year) { year_ = year; }

ってなのを追加して、

Form2^ f = gcnew Form2();
f->SetYear(year);
f->Show();

とする。

QC++/CLIにてForm1の要素に外部から

C++/CLIにてForm1の要素に外部の関数からアクセスしたいです。

Windows7、Visual Studio2010にてC++/CLIで
簡単なフォームアプリケーションを作成しています。


仮に新規作成し、とりあえずテキストボックスを貼りつけたとします。

この際「Form1.h」が自動的に作成され、Form1クラスの中に
textBox1などの要素が自動的に作成されるかと思います。
Form1クラスのメソッドの中からそれにアクセスするには

this->textBox1->Text = L"変更";

みたいにするだけで良いですが、
こうしたForm1クラスの要素に対し、
Form1.h以外の場所にある外部の自作の関数から
アクセスを行うにはどのようにすれば良いのでしょうか。

Aベストアンサー

> Form1はこのApplication::Runの中で一時的に作成されているのみということなのでしょうか。

そういうことです。
ですから、外部に対してなんらかの形でフォームのオブジェクトを渡す必要があります。
まぁそこの部分を書き換えてもいいんですが、自動生成される部分にはなるべく手を加えない方がスマートです。

あと、外部関数ということはフォームとは別のスレッドからの制御になると思いますが、その場合単純に書き換えようとすると例外になります。
http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報