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

現在フォーム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と関連する良く見られている質問

QAccess2007のフォームウイザードでデータシートを作りたいが方法が分からない

Access2003では、フォームウイザードでデータシートを作れたが。
Access2007では、フォームウイザードでは単票のフォームしか作れない様だ。

どうやって、作るのだろうか。操作が分からない。

Aベストアンサー

どういう帳票が欲しいかわかりませんが一応例として....
まずAccess上部にある作成をクリックします。
フォームウィザードをクリックして使用するテーブルとフィールドを選択します。
次に表形式を選択すれば帳票形式でフォームが作成されます。

もう1つはその他のフォームから複数のアイテムを選択すれば帳票形式でフォームが作成されます。

QSystem::Drawing::Color::XXXXを変数に代入可能?

連続で質問するのも申し訳ないのですが・・・

VS2005 C++ Expressを使ってWindowsフォームアプリケーションを作っています。(C++/CLI)

ボタンなどのフォームのプロパティに、色を指定するものがあると思いますが、例えばBackColorを白に変更したい場合、
this->button1->BackColor = System::Drawing::Color::White;
のように書けると思います。

この、「System::Drawing::Color::White」の部分を変数のようにして記述したいのですが、どのように宣言した型を使用すればよいのでしょうか?
例えば仮に「System::Drawing::Color::White」がString文字列であれば、
void func1(int choice){
String^ hoge;

  if(!choice){
    hoge = System::Drawing::Color::White;
  } else {
    hoge = System::Drawing::Color::Red;
  }
  this->button1->BackColor = hoge;
}
こんな風にすると、func1(0);と呼ばれるとボタンの背景が白くなり、0以外の引数だと赤くなると思います。
ですが、System::Drawing::Color::XXXはStringではないのでできません。

この場合、hogeをどのような形で定義すればいいのでしょうか?
あるいは別の方法がありますでしょうか?

よろしくお願いします。

連続で質問するのも申し訳ないのですが・・・

VS2005 C++ Expressを使ってWindowsフォームアプリケーションを作っています。(C++/CLI)

ボタンなどのフォームのプロパティに、色を指定するものがあると思いますが、例えばBackColorを白に変更したい場合、
this->button1->BackColor = System::Drawing::Color::White;
のように書けると思います。

この、「System::Drawing::Color::White」の部分を変数のようにして記述したいのですが、どのように宣言した型を使用すればよいのでしょうか?
例えば仮...続きを読む

Aベストアンサー

#1です。
すいません。
System::Drawing::Color^ hoge;
ではなく
System::Drawing::Color hoge;
でした。


void func1(int choice){
System::Drawing::Color hoge;
  if(!choice){
    hoge = System::Drawing::Color::White;
  } else {
    hoge = System::Drawing::Color::Red;
  }
  this->button1->BackColor = hoge;
}

Q【Access】複数フォームを閉じる時の、選択処理について

Access Ver. : 2003
Windows Ver.: XP

Accessフォームの「閉じる時」処理で、下記のような工夫をした
いと考えております。

・フォームがひとつしか開かれていないとき、Accessを終了する
・複数のフォームが開かれている時、そのフォームのみを閉じる

そんなVBAコードがありましたら、教えてください。
何か参考になるページでも、かまいません。
どうぞ、宜しくお願いいたします。

Aベストアンサー

forms.count で開いているフォーム数を得て分岐
Application.quit

Access VBE のヘルプで、CurrentProject オブジェクト を見てみたら?

QSystem::Object へのmyClassの代入

お世話になっております。
表題の件について困っております。お分かりになる方、教えてください。
やりたいことは、Windowsフォームアプリケーションで、ボタンやListBoxなどのコントローラにあるtagプロパティに自分で作ったクラス(MY_CLASS)のオブジェクトを代入したいのですが、やり方がわかりません。
オブジェクトクラスには何でも代入できると思っていたので普通に代入しようとるすと、
'MY_CLASS' から 'System::Object ^' に変換できません。
と怒られます。
どうすれば良いのかご教授ください。

お願いいたします。

Aベストアンサー

MY_CLASS^ myc = gcnew MY_CLASS();
button1->tag = myc;

QACCESSフォームのボタン表示

ACCESSフォームのボタン表示

ACCESS2000で作成したフォームのボタンはACCESS2007でも変わりません。
ACCESS2007で一から作成したMDBは、ボタンの表示スタイルが異なります。
※ボタンの角が丸く、マウスカーソルをボタンの上に当てるだけで色が変わる。
ACCESS2000で作成したMDBをACCESS2007で上記のように表示させる設定は
あるのでしょうか?
いろいろ見ても、見当たらないのです。
よろしくお願いします。

Aベストアンサー

[Office ボタン] - [Accessのオプション] - [カレントデータベース] で
「フォーム上のコントロールに Windows のテーマを使用する」にチェック。

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

QExcelで作成されたフォームをAccessにコンバージョンしたいので

Excelで作成されたフォームをAccessにコンバージョンしたいのですが、フォームのインポートはできないのでしょうか?
Accessのフォーム作成画面から、インポートを選択していって、Excelファイルを開くのですが、シートしか選択できません。
コントロールのコピペもできないみたいですが。。。
Excelで作成されたフォームはAccessにはインポートできないのですか?
コーディングをそっくり使用することはできなくても、せめてフォームのデザインはコピーしたいのですが。。。(> <)
よろしくお願いします。m(_ _)m

Aベストアンサー

質問者はプロかプロ経験者ですか。でないならこんな勉強は試みないほうが良いでしょう。
市販の書物や初心者向けの講習で説明される話題ではない。プロで会社にその辺の経験者がいたりすれば聞けるでしょうが。原理的には最熟練者の人は変換プログラムは組めるかもしれませんが、そのレベルの人は、この質問コーナーを読んでないでしょうし、無料で教えるスキルではないと思います。
WEBの記事も多分少ないでしょう。
Googleででも「エクセル フォーム アクセス 移行」で出てくる記事を参考にしてはどうでしょう。
http://www.accessclub.jp/bbs2/0080/beginter24987.html
同じ発想の人はいることはいるが。
ーー
VBAとVBのフォームはコードで扱う上で微妙に違うし、アクセスVBAとエクセルVBAでは違う点も多い。
またコントロールの生成もコードで行う方法は隠して、易しいD&Dやマウスによる移動、プロパティボックスでの入力にして易しくしています。
エクセルのUserForm1のフォームも本格的なものではないサービスのような気がする。エクセルで第3者を巻き込んだ業務の開発までは予定して無いように推測する(何でもエクセル的な過大期待が横行している)。
それにエクセルでのセルとの連携をつけた機能LinkedCell、FillいstRangweなどはエクセル特有で、RecordSourceのSQL指定やフォーム指定はアクセス特有と思います。
外観を決めるサイズや書式関係は(エクセルでフォームやコントロールの)プロパティーメモー(アクセスでのフォームやコントロールの)プロパティ設定でやや似せて移せるかもしれない。
エクセルバージョン内の相違、エクセル・アクセルで使えるコントロールの種類の相違などもあります。

質問者はプロかプロ経験者ですか。でないならこんな勉強は試みないほうが良いでしょう。
市販の書物や初心者向けの講習で説明される話題ではない。プロで会社にその辺の経験者がいたりすれば聞けるでしょうが。原理的には最熟練者の人は変換プログラムは組めるかもしれませんが、そのレベルの人は、この質問コーナーを読んでないでしょうし、無料で教えるスキルではないと思います。
WEBの記事も多分少ないでしょう。
Googleででも「エクセル フォーム アクセス 移行」で出てくる記事を参考にしてはど...続きを読む

QC++/CLI System::String::Fotmat 16進表記

お世話になります

C++/CLIを使用して、16進表記で悩んでいます
Format( "0x{0:x2}, 1 );
期待する値は、"0x01"ですが、"0x1"と表記されてしまいます

Formatを使用した場合は仕方ないのでしょうか?
ほかにマネージを"0x%2x"のように変換する方法を
ご存知の方がいらっしゃいましたら、御教授願います
よろしくおねがいします

Aベストアンサー

リーディング0などの書式指定は無かったと思います

String^ str = String::Format("0x{0,2:X}", 1 ).Replase(" ", "0");
などで代替処理してはいかがでしょう

{0,2:X}は 最初の引数を2桁16進数の文字列に変換されます

String::Format("0x{0,2:X}", 1 )で "0x 1"となるので
この文字列中のスペースを『0』に置換したものを取得します

QVBからmdbファイル(Access2000)の特定のフォームを開きたい?

VisualBasicのフォームに配置したコマンドボタンをクリックすることで、特定のmdbファイルをAccess2000で開き、開くと同時に特定のフォームが表示されるようにしたいのですが、こんなことできますか?できるとすればどのようにすればよいのですか?

例えば、C:\商品管理\在庫一覧.mdbにフォーム商品があるとしたとき、
Form1のcommand1をクリックすると、C:\商品管理\在庫一覧.mdbがAccess2000で開き、フォーム商品が最初に表示されるようにしたいのですが・・・
ちなみに、Access2000の起動時の設定では他のフォームが最初に開くようになっています。
よろしくお願いします。

Aベストアンサー

オートメーションを使ってAccessを制御しましょう。
で、他のフォームが最初に開くようになっていることなので、最初に開くフォームを閉じてからAccessを表示するようにすればいいと思います。

Dim acs as Object

'AccessのApplicationオブジェクトを取得する。
Set acs = CreateObject("Access.Application")

'c:\test.mdbを開くacs.OpenCurrentDatabase "c:\test.mdb"

'起動時に開かれたフォームを閉じる
'2はacForm定数のこと
acs.Close 2,"フォーム名"

'Accessを表示させる
acs.Visible = True

'表示させたいフォームを開く
acs.OpenForm "フォーム名"


こんな感じで。

最後に、Accessを終わらせるときは

'オブジェクトの開放
Set acs = Nothing

で、オブジェクトを開放してください。

オートメーションを使ってAccessを制御しましょう。
で、他のフォームが最初に開くようになっていることなので、最初に開くフォームを閉じてからAccessを表示するようにすればいいと思います。

Dim acs as Object

'AccessのApplicationオブジェクトを取得する。
Set acs = CreateObject("Access.Application")

'c:\test.mdbを開くacs.OpenCurrentDatabase "c:\test.mdb"

'起動時に開かれたフォームを閉じる
'2はacForm定数のこと
acs.Close 2,"フォーム名"

'Accessを表示させる
acs.Visibl...続きを読む

Q”System::IO::StreamReader”ってどういう意味ですか?

Visual C++ 2008 Express Editionで、現在、600kバイト程度のバイナリファイルを読み込んで特定の番地のデータだけを取り出してそれをテキスト変換してテキストボックス内に表示させるというプログラムを作成しているのですが、このことをOKwaveでどのようにコーディングするかを教えてもらったところ、


System::IO::StreamReader^ sr=gcnew StreamReader(_T("sample.txt"));


このような文を教えてもらったのですが、全く知識がなく何をやっているのかわかりません。
”sr”というのは変数で、sample.txtからstreamReader関数でsample.txt内のデータをsr変数に
入れているという感じがしますが、”System::IO::StreamReader”とか”gcnew”とかの意味がよくわかりません。
どうかご教授お願いいたします。

Aベストアンサー

私は、C++で開発を行っているのではなくC#ですが・・・ さらに初心者ですが・・・

>System::IO::StreamReader
テキストの文字列を、指定のフォーマットなどで取り込む時に使用します。
srへ、格納した後は、自由に取り出すことができます。
(while文などを使用して、上から一行づつ取り出すなど)

>gcnew
gcnewは、初めてみたのでわかりませんが、メモリ管理周りっぽいですね。難しかったですが、リンク載せておきます。(2つ目)

参考URL:http://msdn.microsoft.com/ja-jp/library/akzyzwh9.aspx,http://loafer.jp/mixi/diary/class.xsp?2007-09-02-22-43


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

人気Q&Aランキング

おすすめ情報