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;
}
No.3ベストアンサー
- 回答日時:
モーダルである場合、CloseでDispose処理が呼ばれるので、
deleteは不必要です。
(ShowDialogの場合は、Dispose処理が呼ばれないから、deleteが必要。)
また、前述のとおり一度Disposeが呼ばれているためCloseすると再度Showできなくなるので、
再度gcnewを行う必要があります。
コードではこんな感じ。
※全角空白で成形しています。そのままコピペしてもエラーになるので気をつけてください。
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
this->childForm_ = nullptr;
}
・
・
・
private:
Form2^ childForm_;
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_->Show(this);
}
}
単に、表示非表示の切り替えで良いのであれば、CloseではなくHideを使います。
その場合は、1度だけgcnewすればいいです。
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
this->childForm_ = gcnew Form2();
}
・
・
・
private:
Form2^ childForm_;
private:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
if (this->childForm_->Visible) {
this->childForm_->Hide();
}
else {
this->childForm_->Show(this);
}
}
No.6
- 回答日時:
if (条件式A && 条件式B)
というif文があったとき、条件式Aが偽であるとき条件式Bを評価するまでもなく
結果が偽になります。
C言語ではそのケースのとき条件式Bを評価しないような仕組みになっています。
よって、「条件式Aが偽になる」点で効率が良くなるということです。
今回は
条件式A:this->childForm_ != nullptr
条件式B:!this->childForm_->IsDisposed
ですので、nullptrを代入しておけば、条件式Aが偽になるので、
条件式Bを評価する必要がなくなる分効率が良くなるのです。
他にも
if (条件式A || 条件式B)
のときは条件式Aが真であれば、条件式Bは評価されません。
ご教授、ありがとうございます。
ご指摘頂いて、そういえばそうだった、と気付きました。
(すみません、私のレベルはその程度です。)
this->childForm_->Close();
//this->childForm_ = nullptr;
上記の紹介頂いたソースは、コメントを除いて使用したいと思います。
ありがとうございました。
No.5
- 回答日時:
>this->childForm_->Close();
>//this->childForm_ = nullptr;
下のコメントになっているのはあってもなくても同じという意味です。
どちらかという意味ではありません。
>if ((this->childForm_ != nullptr) &&
> !this->childForm_->IsDisposed)
nullptrを代入しておけば、この条件式が若干効率が良くなります。
この回答への補足
ご指摘ありがとうございます。
あまり質問し続けるのも恐縮してしまいますが、
nullptrを代入しておけば、この条件式が若干効率が良くなる
とはどういうことなのでしょうか。
No.4
- 回答日時:
No.3です。
間違いがあったので訂正です。
>モーダルである場合、CloseでDispose処理が呼ばれるので、
モーダルではなくモードレスでした。
ご回答、ありがとうございます。
回答番号:No.3とまとめてお返事をさせて頂きます。
(返答遅れまして申し訳ございませんでした。)
ご紹介頂いたコードでやりたい事が実現できました!
ありがとうございました。
アドバイス頂いたとおりこの方法ですと、
ダイアログがあるかどうか判断するグローバル変数は
必要ないようですね。
this->childForm_->Close();
//this->childForm_ = nullptr;
途中で、上記の記述がございますが、この2つの記述には
何か違いがあるのでしょうか。
No.2
- 回答日時:
まずformAAAを「メインフォームのpublicなメンバ変数」として定義します。
そして、メインフォームのコンストラクタで「formAAA = gcnew AAA();」として、formAAAもコンストラクトして下さい。
formAAAは、メインフォームのコンストラクタで作成は行われますが、表示は行われません。
formAAAを表示する必要がでたら「formAAA->Show(this);」で表示します。これは、メインフォームのクラス内なら、どこで行っても構いません。
formAAAを閉じる必要がでたら「formAAA->Close();」で閉じます。これも、メインフォームのクラス内なら、どこで行っても構いません。
最後に、メインフォームのデクストラクタで「delete formAAA;」を行って、メインフォームの破棄と同時に子フォームも破棄してください。
この回答への補足
ご回答、ありがとうございます。
(返信おくれてすみませんでした。)
当初、私にはchie65535さんから頂いた説明では
難しく感じましたが、No3さんの具体的なコードを参照して
説明の内容はこういうことなのかな、と思いました。
(申し訳ございませんが、まだ十分に理解しきれていません。)
また、chie65535さんの指摘で初めて、「デストラクタ」の言葉とか
「delete formAAA;」の文法を知りました。
いつも「this->Close();」という文法のみを使って
ダイアログが消えたから安心していましたが、
「delete formAAA;」をしないと過去に開いたダイアログがメモリ上に
残り続けてしまうのでしょうか?
No.1
- 回答日時:
閉じようとしているものがShowしたものと別ということは理解していますか?
gcnewで新しいフォームを作って、それに対してCloseを処理させようとしています。
開いたフォームを親フォームに覚えておくような仕組みにすればよいでしょう。
(そうすればフラグもいらなそう)
この回答への補足
ご回答、ありがとうございます。
>閉じようとしているものがShowしたものと別ということは理解していますか?
すみません、まだ理解しておりません。
具体的にどのように、書けばよろしいでしょうか。
追記ですが、質問内容に、誤記がございました。
AAA^ formAAA = gcnew AAA();が2つ記載されておりますが、
1回目のAAA^ formAAA = gcnew AAA();
は削除して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- JavaScript JavaScript?jQuery?で書き方を教えてください。 初心者です。 AAAという要素をステ 2 2023/08/04 22:09
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- 英語 Since there is no change in external dimensions, t 1 2023/04/03 22:42
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA リストボックスをダブルク...
-
VBAにてメッセージボックスを最...
-
リストボックスの選択解除
-
メインフォームからサブフォー...
-
accessで2つ以上のフォームを起...
-
アクセス フォームが存在する...
-
VB.net(VB)で、フォームにExcel...
-
ExcelVBAでフォーム内でブック...
-
Googleフォーム・複数人の申し...
-
VBプログラムの終了
-
VB.NET 親フォームから子フォー...
-
サブフォームのイベント取得
-
C# 別なフォームへ値を渡す (...
-
子フォームから親フォームのオ...
-
アクセスでフォームで入力 複...
-
Accessでフォームから別フォー...
-
ExcelVBAでユーザーフォーム内...
-
サブフォームの新規レコードに...
-
さくらサーバーにcgiフォームを...
-
PDFフォーム内で日付計算したい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAにてメッセージボックスを最...
-
VB.net(VB)で、フォームにExcel...
-
Accessでフォームから別フォー...
-
リストボックスの選択解除
-
Googleフォーム・複数人の申し...
-
ユーザーフォーム上にアイコン...
-
アクセスVBA フォームのス...
-
VBプログラムの終了
-
アクセス フォームが存在する...
-
サブフォームの新規レコードに...
-
サブフォームの行ごとにコンボ...
-
PDFフォームに本日の日付を自動...
-
accessで2つ以上のフォームを起...
-
メッセージボックスの背景色
-
PDFフォーム内で日付計算したい...
-
VBA リストボックスをダブルク...
-
Access 無操作の場合、自動で閉...
-
ディスプレイ解像度より大きな...
-
フォーム上の全てのコントロー...
-
ToolStripStatusLabelを固定し...
おすすめ情報