• 締切済み

メインダイアログを表示させずにファイル選択ダイアログを表示

VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

みんなの回答

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

ファイルダイアログを出すだけなのなら、 CtestDlgの代わりにCFileDialogにすればいいだけですよ。 CtestDlgクラスそのものがいりません。

zigen8513
質問者

お礼

ご回答ありがとうございます。 確かにそうですね。。ただ今回の方法としては、 CtestDlgのメンバ関数であるCFileDialogを用いた関数をコールし、 期待動作をさせるつもりでしたので、このような回りくどい方法となってしまったのです。 今確認したところ、 m_pMainWnd = &dlg; をコメントアウトすることで期待動作させることが出来ました。 どうやらAfxWinMainの中で落ちていたようです。 アドバイスありがとうございました。

関連するQ&A

  • 連続してダイアログを表示したい?

    VC++6.0を使用しています。 以下のようなコードでダイアログを連続して表示しようと思っています。1番目のダイアログを表示してOKボタンを押下後(このときこのダイアログは消えて)、2番目のダイアログを表示したいと思っているのですが2番目が表示できません。(1番目のところをコメントにすれば2番目は表示できます。)どうして2番目のダイアログが表示できないのでしょうか? // 1番目のダイアログ   CTest1Dlg dlg;   m_pMainWnd = &dlg;   int nResponse1 =dlg.DoModal(); // 2番目のダイアログ   CTest2Dlg dlg;   m_pMainWnd = &dlg;   int nResponse2 =dlg.DoModal(); //   if (nResponse1 == IDOK) {   :以下省略 これだけの情報でアドバイスができますでしょうか? すみません。よろしくお願い致します。

  • ファイルを開くダイアログについて

    いつもお世話になっています。 VS2005でWindowsアプリケーション作成を行っております。 ファイルを開くダイアログについて、  OPENFILENAME ofn;  ofn.lpstrFilter = TEXT("テキストファイル(*.txt)\0*.txt\0\0"); 対象ファイルを上記のようにテキストファイルと指定しているとき、 ユーザがテキストファイル以外を誤って?選択してOKをクリックした場合に エラーを表示したいのですが、ユーザが選択したファイル名の拡張子が lpstrFilterと一致するか調べる方法を教えていただきたいです。 ご教授お願いいたします。

  • ファイルダイアログでのファイルの複数選択について

    VC++6.0でプログラムをしているのですが、CFileDialogクラスのコモンダイアログでファイルを開くときに、ファイルを複数選択できるようにしています。 しかし、試してみると14枚までしか開くことができません。プログラムは以下のとおりです。 CFileDialog dlg(TRUE, "bmp", "*.bmp", OFN_ALLOWMULTISELECT); if (dlg.DoModal() != IDOK) { return; } ファイルを15枚以上選択するとif文の中のreturnに入って関数を抜けてしまいます。原因が何なのか分かる方教えてください。

  • VB6.0のマルチセレクトダイアログで250個のファイルを選択したいの

    VB6.0のマルチセレクトダイアログで250個のファイルを選択したいのですがエラーが出ます。 10個程度の選択ならエラーが出ません。 どこをどう修正したら多数のファイル選択が可能になるのでしょうか? どなたかわかる方教えてください。 どうぞよろしくお願いいたします。 エラー内容:下記のGetFileNameが空でファイル名を取得できない。 Dim GetFileName As Variant 'ファイル名(フルパス) GetFileName = apiGetOpenFileName(Form1.hWnd, strFilter, strDir) 'ダイアログ表示 使用したコード:下記リンク先のコードにマルチセレクト用のコードを追加しました。 "?http://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm"? 以下、追加したコードです。---------------------------- Public Const OFN_LONGNAMES = &H200000 '旧スタイルのダイアログのとき、ロングファイル名を使用可能にする Public Const OFN_EXPLORER = &H80000 'エクスプローラ型ダイアログとして表示 '構造体の設定 With OFN .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加

  • ファイルの保存ダイアログでデフォルト命名したい

    ファイルの保存ダイアログでデフォルト命名したい Win32API(C言語)編 第55章 ファイルを開く・保存のコモンダイアログ http://www.geocities.jp/ky_webid/win32c/055.html をみてファイルの保存ダイアログを出せるようになりました。 しかし、たまーにフリーソフトなどでもファイルを保存する際に、 デフォルトのファイル名が初期値として指定されているものもあります。 私のソフトでもそのようにしたいのですが、色々な部分に文字列を 入れてみて試してみても、思ったとおりの結果にはなりませんでした。 下記は上記サイトに記載されている ファイルを保存する際のダイアログの出し方から引用したものですが、 これをどのようにしたらダイアログが開いた際にファイル名部分に デフォルト命名された状態で開けるのでしょうか? static OPENFILENAME ofn; static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域 static TCHAR filename[MAX_PATH]; // ファイル名を受け取る領域 // 構造体に情報をセット ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類 ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定 ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類 // 名前を付けて保存コモンダイアログを作成 if( !GetOpenFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }

  • ファイルを開きたいのですが、うまくいかなくて困っています。

    ファイルを開きたいのですが、うまくいかなくて困っています。 以下のソースですが、デバッグしながらやっているので謎な部分があるかもしれません。 やりたいこと: ・実行ボタンを押すと"data/test.txt"を開き、OK部の処理に入りたい。 現状: ・参照ボタンを押した後、ファイル選択ダイアログで[開く]を押した後、実行ボタンを押すとエラー ・参照ボタンを押した後、ファイル選択ダイアログで[キャンセル]を押した後、実行ボタンを押すとOK ・"data/test.txt"は存在します。"r"を"w"にして作成してみたりした為、間違いないと思います。 VC++(MFC)でプログラミングしています。 自力解決が難しい為、お力を貸してくださいm(__)m [環境] OS: Windows XP SP3 tools: VisualStudio2008 //**************************************************************** // 参照ボタン //**************************************************************** void CMergeFile::OnBnClickedButtonRef02() { static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt|All Files(*.*)|*.*||"; // ファイルの指定を行う CFileDialog dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST, zFilter, NULL ); dlg.m_ofn.lpstrTitle = "取り込むファイルを選択"; // OKボタンが押されたかチェックする if( dlg.DoModal() == IDOK ){ // ファイル名称クリア処理 ※fileNameはメンバ変数として外に持っています。 memset( fileName, '\0', sizeof(fileName) ); // ファイル名を取得する strcpy( fileName,dlg.GetPathName()); } else { return; } // 選択ファイル名を表示する m_edit_filepath.SetWindowText(fileName); } //**************************************************************** // 実行ボタン //**************************************************************** void CMergeFile::OnBnClickedButtonExe02() { FILE *fpBase = 0; fpBase = fopen("data/test.txt", "r"); if ( fpBase == NULL ){ MessageBox("err"); // エラー } else { MessageBox("ok"); // OK fclose(fpBase); } }

  • ダイアログボックスを表示したい。

    下記処理コードを実行したときに、 ファイル選択のダイアログ表示をさせるのにファイル名を決まった形にしないと駄目みたいです。 (例)strLookupFileName = "abcms_E000_H*.csv;" ファイル名に関係なくダイアログを表示させるにはどうしたら良いのでしょうか? 今現在、ファイル名を適当なものに変えると「キャンセルされました。」のメッセージボックスが表示されます。 例:strLookupFileName = "abc明細.xls"←エラー(これでも可に) (処理コード) 'ファイル選択 strFileName = FileNameGet(Me.Hwnd, strHomeDirectory, strLookupFileName, "CSV ファイル", "ファイル選択") If strFileName = "" Then MsgBox "キャンセルされました。", vbInformation + vbOKOnly, " " Exit Sub End If ↓ Public Function FileNameGet(Owner As Variant, DefaultDirectory As String, DefaultFilter As String, DefaultFilterName As String, Title As String) As Variant On Error GoTo Err Dim dlg As OPENFILENAME Dim rslt As Long dlg.hwndOwner = Owner dlg.hInstance = 0 'dlg.nFilterIndex = 0 dlg.lpstrTitle = Title & Chr(0) & Chr(0) dlg.lpstrFileTitle = Space(256) & Chr(0) & Chr(0) dlg.lpstrInitialDir = DefaultDirectory & Chr(0) & Chr(0) dlg.lpstrFile = DefaultFilter & Space(256) & Chr(0) & Chr(0) dlg.lpstrFilter = DefaultFilter & Chr(0) & Chr(0) dlg.nMaxFile = Len(dlg.lpstrFile) dlg.nMaxFileTitle = Len(dlg.lpstrFileTitle) dlg.lStructSize = Len(dlg) rslt = GetOpenFileName(dlg) If rslt = 0 Then FileNameGet = "" Exit Function End If 'ファイル名チェック If IsNull(dlg.lpstrFile) Or dlg.lpstrFile = "" Then MsgBox "ファイル名が取得できませんでした。", vbInformation + vbOKOnly, " " FileNameGet = Null Exit Function End If 'FileNameGet = StrConv(MidB(StrConv(dlg.lpstrFile, vbFromUnicode), 1, (dlg.nFileExtension + 3)), vbUnicode) FileNameGet = Left$(dlg.lpstrFile, InStr(dlg.lpstrFile, vbNullChar) - 1 On Error GoTo 0 Exit Function Err: MsgBox Err.Description End Function

  • ファイル選択ダイアログで複数の拡張子を有効に

    Ruby+VisualuRubyでプログラムを作っています。 ファイル選択ダイアログで file_name = SWin::CommonDialog::openFilename(nil, [["テキスト(*.txt)","*.txt"],["DOC(*.doc)","*.doc"],["DOCX(*.docx)","*.docx"]], 0x1000, "ファイル選択") とすれば、複数の拡張子からの選択が可能になるのはわかったのですが、 これだと、拡張子を選んで、その拡張子のファイルから選択することになります。 同時に、複数の拡張子のファイルを表示し、その中から選択するようにはできないのでしょうか?

    • ベストアンサー
    • Ruby
  • VBSでファイル選択ダイアログを表示させたい

    VBS初心者です。 フォルダ選択ダイアログは BrowseForFolder にて可能なのですが、 VBSでファイル選択ダイアログを表示するのどうするのでしょうか? どなたかご存知でしたらご教授下さい。

  • Win32API ファイルの書き込み、保存

    Win32APIを使って、ファイルの保存ダイアログを表示→ファイルを指定→保存ボタンを押す→指定されたファイルに書き込む→指定したファイルを保存 というプログラムを作りたいと考えています。しかし、ファイルに書き込んだ後どう保存すればいいかわからないので教えてください。s[256]をfilename_fullに書き込んで保存したいです。この場合プログラムは抜粋したものなので、s[256]に文字が格納してあると考えてください。 char s[256]; FILE *fp; static OPENFILENAME ofn; static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域 static TCHAR filename[MAX_PATH]; // ファイル名を受け取る領域 // 構造体に情報をセット ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類 ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定 ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類 // 名前を付けて保存コモンダイアログを作成 if( !GetSaveFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }else{ if((fp=fopen(filename_full,"w")) == NULL) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); exit(0); /* (3)エラーの場合は通常、異常終了する */ } /*ここからがわかりません*/     /*s[256]をファイルに書き込んで、保存するプログラムを教えてください。

専門家に質問してみよう