VC++:ダイアログがDispose()できない

このQ&Aのポイント
  • VC++の場合、C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?
  • 破棄が必要な場合、どのようなコードを書けばよいのでしょうか?
  • VC++のダイアログでオブジェクトを破棄する方法を教えてください。
回答を見る
  • ベストアンサー

VC++:ダイアログがDispose()できない

前略 ・.NET 2012のVC++を使っています。 ファイルをオープンするプログラムをつくろうとしています。その過程でダイアログをオープンするプログラムをネットにあったC#のコードを参考に、openFileDialog1->Dispose();をコメントアウトした以下に示すものをつくりました。このコードは特に問題なくコンパイルできて動作します。  しかし、C#のコードにあった openFileDialog1.Dispose();から変更したopenFileDialog1->Dispose();を追加すると "error C2039: 'Dispose' : 'System::Windows::Forms::OpenFileDialog' のメンバーではありません。"と云うエラーメッセージがでてコンパイルできません。 <質問>  VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?  もし、破棄が必要なのであればどのようなコードを書けばよいのでしょうか?  どなたかお分かりになる方、ご教示いただければ幸いです。 以上、よろしくお願いします。 //------------------------------------------------------- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); openFileDialog1->Title = "ダイアログのタイトルをココに書く"; openFileDialog1->InitialDirectory = "c:\\"; openFileDialog1->FileName = "初期表示するファイル名をココに書く"; if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) MessageBox::Show(openFileDialog1->FileName); // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) // openFileDialog1->Dispose(); };

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

  • ベストアンサー
回答No.2

近年 C++/CLI 触っていないのでうろ覚えですが、C++/CLI では openFileDialog1->Dispose() を呼び出すのに delete を使うんだったと記憶しています。 delete openFileDialog; gcnew との対称性を重んじたのでしょうね。ダイアログは unmanaged resource なので、CLR がよろしくやってくれるという事はありませんよ。openFileDialog が GC に回収されるまでリソースが残ってしまいます (まあ、それでも良いという態度もあるかも知れませんが、個人的には気持ち悪いです…)。 因みに、構文糖衣ですが ^ を付けずに (あたかも値型の様に) 宣言すると、C# の using と同等のコードを生成してくれます。つまり、自動的にスコープの終端で delete (Dispose) してくれます。 { OpenFileDialog openFileDialog1; openFileDialog1.Title = "ダイアログのタイトルをココに書く"; openFileDialog1.InitialDirectory = "c:\\"; openFileDialog1.FileName = "初期表示するファイル名をココに書く"; if (openFileDialog1.ShowDialog() == System::Windows::Forms::DialogResult::OK) MessageBox::Show(openFileDialog1.FileName); }

stokyostokyo3
質問者

お礼

前略 ・さっそくご教示ありがとうございます。  openFileDialog1->Dispose(); を delete openFileDialog1; に変更したらコンパイルできました。 ・糖衣構文については、まったくしりませんでした。コンパイルして実行を確認しました。勉強になりました。 今後ともよろしくお願いします。 以上

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

CLIは触っていませんが……。 >VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか? CLRがよろしく処理してくれる…ようです。 まぁ、即座に破棄したい場合はその限りではないようですが。

参考URL:
http://fireball.loafer.jp/kes/article_558.html
stokyostokyo3
質問者

お礼

前略 ・ さっそく ご教示ありがとうございました。   しばらくするとCLRが処理してくれるようですが、delete openFileDialog1; で即座に終了処理することとしました。  今後ともよろしくお願いします 以上

関連するQ&A

  • オブジェクトをどこでdisposeするか

    オブジェクトをどこで破棄するか こんにちは。C#もしくはVBについてお教え下さい。オブジェクトの破棄をどこですればいいかわからなく、悩んでいます。 フォームには下記のオブジェクトが配置されています。 ・データグリッドビュー ・検索ボタン ・閉じるボタン 動作は下記のようになります。 ・フォームをロード時、データベースにアクセス。データテーブルにデータをセット。グリッドビューに表示。 ・検索ボタン。データベースにアクセス。データテーブルにデータを再びセット。グリッドビューに表示。 ・閉じるボタン。フォームを閉じる。 ・DataTable、DataAdapter、sqlConnectionなどの変数は使い回しています。 質問: これらのオブジェクトを破棄、disposeするのは、どのタイミングですれば良いでしょうか? 閉じるボタンを押された時でしょうか?またフォームの右上にバッテンマークがありますが、これが押された時もdispose処理を入れておいたほうがいいのでしょうか? またはフォームを閉じた時は自動で破棄してくれるのでしょうか? 宜しくお願い致します。

  • ファイルダイアログのカレントフォルダ

    vb.netのOpenFileDialogでダイアログを開いたとき、最初はマイドキュメントが表示されますが 違うフォルダからファイルを選ぶと、次にダイアログを開いたときはそのフォルダ(カレントフォルダ?)がまず表示されます。 その情報はどこに保存されてるのですか? 同じパソコンでプログラムをコピーして交互に動かしてもカレントフォルダはその度に変わってるようです。 別のパソコンにプログラムをコピーしたら(最初だけは)マイドキュメントからになるんですか? もう1つ質問で RestoreDirectoryプロパティにtrueを設定してもカレントフォルダは変わるようなのですが なぜでしょう? 試しに作ったコードは↓です。 環境はvb2005、XP-sp3です。 -------------------- Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) Dim OpenFileDialog1 As New OpenFileDialog() ' ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 False) OpenFileDialog1.RestoreDirectory = False ' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する If OpenFileDialog1.ShowDialog() = DialogResult.OK Then MessageBox.Show(OpenFileDialog1.FileName) End If End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) Dim OpenFileDialog2 As New OpenFileDialog() ' ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 False) OpenFileDialog2.RestoreDirectory = True ' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する If OpenFileDialog2.ShowDialog() = DialogResult.OK Then MessageBox.Show(OpenFileDialog2.FileName) End If End Sub End Class --------------------

  • C#)フォルダ参照ダイアログは?

    こんにちわ。 ファイル参照ダイアログは System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName); で出来たんですが、フォルダを参照したい場合はどうしたらいいのでしょうか? どなたか教えてください。

  • デバッグエラー

    VBで、簡単なお絵かきツールを作りましたが、ボタン4(開くイベント)で、「開く」ではなく、キャンセルをクリックした際に、デバッグエラーが出ました。 プログラムを記載しておきますので、対処方法を教えていただけませんか。 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim filename As String OpenFileDialog1.AddExtension = True OpenFileDialog1.Filter = "すべてのファイル|*.*" OpenFileDialog1.ShowDialog() OpenFileDialog1.Title = "開くファイルを指定してください。" filename = OpenFileDialog1.FileName If filename <> "" Then b.Dispose() canvas.Dispose() canvas = Image.FromFile(filename) b = Graphics.FromImage(canvas) PictureBox1.Image = canvas End If End Sub です。 ちなみに、保存の際には出ません。

  • ASP .NETでファイル選択ダイアログ

    タイトルの通りなのですが、ASP .NETでウインドウズのファイル選択ダイアログをだす方法を探しています。 画面のソースで <%@ import Namespace="System.Windows.Forms.OpenFileDialog" %> としてインポートしてるつもりなのですが、 Compiler Error Message: BC30002: Type 'OpenFileDialog' is not defined. Line 19: Dim ofd As New OpenFileDialog() というエラーになってしまいます。 dllが無いということでしょうか?

  • 一時ファイルをsavefileDialogを利用して保存するにはどのようにしたら良いのでしょうか?

    環境:VS2005 C# プログラム上でコメントアウトしてある様なやり方ではなく、 一旦、一時ファイルを作成しそのファイルをダイアログで保存先を任意のフォルダに保存したいのですがやり方はあるのでしょうか? OpenFileDialog ofd = new OpenFileDialog(); //一時ファイルを作成する string file_name = Path.GetTempFileName(); System.IO.StreamWriter writer = new StreamWriter(file_name); writer.WriteLine("tmptest"); writer.Close(); //ダイアログを表示 ofd.ShowDialog(); /*******************************▼コメントアウト System.IO.Stream stream; stream = ofdfilecommit.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream, 文字コード); sw.WriteLine("test"); //閉じる sw.Close(); stream.Close() } ********************************▲コメントアウト*/ //オブジェクトの破棄 ofd.Dispose(); ご協力お願いします。

  • libdecodeqrをVC6.0のダイアログベースアプリで使いたいの

    libdecodeqrをVC6.0のダイアログベースアプリで使いたいの libdecodeqrをVC6.0のダイアログベースアプリで使いたいのですが、以下のような簡単なコードを書いたのですが、リンクで「error LNK2001: 外部シンボル *** は未解決です」となり、エラーになります。 OpenCVのインストールや設定はできております。 また、libdecodeqrのサンプルにあるsimple,webcam共にビルドし動作するのを確認できています。 // 画像読み込み IplImage* pImage = NULL ; pImage = cvLoadImage( strFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ) ; // OPEN QrDecoderHandle hQRDecoder = qr_decoder_open() ; // ちょっとした処理 // CLOSE qr_decoder_close( hQRDecoder ); cvReleaseImage( &pImage ) ; よろしくお願いします。

  • VC++2005について

    以下のソースですがVC++2005でコンパイルするとエラーになります。 どこを直せばよいのでしょうか? C#のソースですが、VC++2005との違いや、VC++2005のメリットなども知りたいです。 using namespace System; namespace Strings1 { class Class1 { static void Main(){ String^ jstr1 = "こんにちは"; Console::WriteLine( "\nみなさん" ); } } };

  • Visual Basic 2005で困ってます

    「ファイルを開く」ダイアログを表示して 画像ファイルを選択し、そのファイルをPictureboxに表示させたいのですが 画像が表示されずエラーが出てしまいます。 Private Sub 開くOToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くOToolStripMenuItem.Click Dim ofd As New OpenFileDialog() ofd.FileName = ""   ofd.InitialDirectory = "デスクトップ"       ofd.Filter = _ "すべてのピクチャーファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|すべてのファイル(*.*)|*.*"   ofd.FilterIndex = 2 ofd.Title = "開くファイルを選択してください" ofd.RestoreDirectory = True ofd.CheckFileExists = True ofd.CheckPathExists = True If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then Console.WriteLine(ofd.FileName) lstFileName.Items.Add(ofd.FileName) End If このようなプログラムなのですが どのように変えたらよろしいでしょうか? 教えてください、よろしくお願いします。

  • VC++でフラッシュの再生

    タイトルのとおりのことなんですが・・・ VC++でフラッシュファイルを呼び出し、再生したいのですがすべき手順、呼び出し、再生コードを知っている方いらっしゃいましたらお教えください、、、 お願いします。 C#で言うthis.axFlash.LoadMovie(0, filename);のようなものがあれば。。

専門家に質問してみよう