• ベストアンサー

右オペランドを扱う演算子は定義されていません。のエラー

ある書籍のサンプルプログラムをVisual C++で「実行」したところ error C2679: 二項演算子 '=' : 型 'class CString' の右オペランドを扱う演算子は 定義されていません。(または変換できません)(新しい動作; ヘルプを参照) となり、エラーとなってしまいました。 このプログラムは、コモンドイアログを利用して、 ダイアログのボタンをクリックするとファイルを開くウィンドウが開き、 選択したファイル名をダイアログのエディットボックスに表示するというプログラムです。 一先ず提供できる情報はこの程度なのですが、(質問はお受けします。) どなたか原因のわかる方はいらっしゃらないでしょうか。 よろしくお願い致します。 ---------------ソース--------------- void CSCHEDULEDlg::OnFileopen() {   // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください   char m_sResults; // 開かれたファイル名   CFileDialog m_ldFile(TRUE);   // [ファイルを開く]ダイアログウィンドウを表示し、   // その結果の戻り値がID_REQと等しいか比較する   if (m_ldFile.DoModal() == ID_REQ)   {    // 選択されたファイルの名前を取得する    m_sResults = m_ldFile.GetFileName();  /*** エラーとなる部分 ***/    // ダイアログの表示を更新する    UpdateData(FALSE);   }

noname#17462
noname#17462

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

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

  char m_sResults; // 開かれたファイル名 の部分は書籍には載っていないのではないでしょうか? m_sResult はおそらく,ファイル名を表示させるエディットボックスに割り当てた,CString 型の DDX 変数だと思います。 書籍に「変数の追加」の方法が載っていませんか? 以下のページも参考にしてみてください。 http://mailsrv.nara-edu.ac.jp/~asait/visual_cpp/dialog1/dialog1.htm http://mailsrv.nara-edu.ac.jp/~asait/visual_cpp/dialog1/editbox/editbox.htm

noname#17462
質問者

お礼

No.1の方のお礼でも書きましたが、 すべておっしゃる通りでした。 m_sResultはvoid CSCHEDULEDlg::OnFileopen()で宣言するのではなく、 エディットボックスの void CSCHEDULEDlg::DoDataExchange(CDataExchange* pDX) にDDX変数として宣言するものでした。 安易な思い付きで惑わせて申し訳ありませんでした。 そしてありがとうございました。

その他の回答 (1)

  • lawson
  • ベストアンサー率44% (29/65)
回答No.1

このソースに出てくる技術要素にそんなに詳しくないものですが。 ざっくりみて、変だなと思うことを述べます。 m_sResultsですが。 char型になってます。 これがchar[]や、 char*だとまだなんとか分る気もしますが・・。 char m_sResults を char* m_sResults に変更する。 それでもまだエラーが出るようであれば、 お使いの処理系では、エラーがでる仕様であると 割り切って。 m_ldFile.GetFileName() がCStringのようですが・・ これをさらにchar*に変換するような対策を して下さい。 例えば、 http://rararahp.cool.ne.jp/vc/vctips/cstringchar.htm を参考にして、 m_sResults = m_ldFile.GetFileName(); を strcpy(m_sResults,m_ldFile.GetFileName()); に変更してみるとか・・。

noname#17462
質問者

お礼

まずは申し訳ありません。 書籍のサンプルプログラムではchar m_sResultsの変数宣言はありませんでした。 定義されていないと出る・・・無理やり定義してみよう。 文字なのでchar*型(←*は付け忘れていました)だろう。 と勝手に思って付け加えた部分をそのまま掲載してしまいました。 惑わせて申し訳ありませんでした。 そして質問に関してなのですが、No.2の方のおっしゃるように、 書籍にはm_sResultsの変数宣言をCstring型でするようにとあり、 書籍にあるように宣言をしたのですが、エラーが出たため質問をしました。 ・・・が、本日もう一度変数宣言をし直してみたところ、 何故かコンパイル・デバッグが通ってしまいました。 本当に申し訳ない気持ちでいっぱいですが、 今回教えていただいた事は頭の中に留めておきたいと思います。 ありがとうございました。

関連するQ&A

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

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

  • 演算対象の数字と演算子を入力して計算させる

    数字と演算子をそれぞれ入力し、優先順位の高い順に四則演算させるにはどのような考え方をすればよいのでしょうか。 数字をa[7]とおいて、演算子をop[7]としてそれぞれ配列に格納しましたが、そこから先に進めません。 オペランドと演算子の組み合わせならば優先順に計算してくれるのはわかっていますが、オペランドと演算子を格納した配列では上手く行きません。 実は既に全ての演算子の組み合わせをIfで表示させるプログラムを根性で作ったのですが、最適解を知りたいです。 言語はCでvisualstudioを使っております。 条件はn回数字を入力したらn-1回演算子を入力し、n回目に=を入力する。nの最大値は7とする。です。 だらだらと見辛い文章で申し訳ありませんが、何卒宜しくお願いします。

  • VC++6.0,MDI,子ウィンドウのタイトルが変わる!?

    VC++6.0でMDIプログラムを作成しているものです. 子ウィンドウをダブルクリックすると「ファイルを開く」のコモンダイアログを呼び出し,そこに選択した画像ファイルを表示させるプログラムを作ったのですが,ついでにタイトルバーに開いたファイル名を以下のようにして表示させました. // Viewクラスにて CFileDialog dlg(TRUE, "bmp", "*.bmp",               OFN_HIDEREADONLY|         OFN_OVERWRITEPROMPT,        "BITMAP(*.bmp)|         *.bmp|JPEG(*.jpg)|         *.jpg||"); if (dlg.DoModal() != IDOK) { return; } GetParent()->SetWindowText(dlg.GetFileName()); そして,画像を表示したウィンドウとは別のウィンドウをアクティブにすると,タイトルバーに表示したファイル名がウィンドウを生成したときのタイトルに戻ってしまいます. 子ウィンドウが何個あっても,表示している画像のファイル名をタイトルバーに表示したいのですが,どうすればいいのですか?

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

    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 ); … }

  • 画像の保存方法。

    VC++のMFC、ダイアログベースで画像処理のソフトを開発している者です。 ピクチャーコントロールに画像を表示させて、その画像を保存したいと思っています。 保存用のダイアログを開き、名前を付けて保存したいのですがうまくいきません。 下が今作っているプログラムです。 void Cstart2Dlg::OnBnClickedButton10() { CFileDialog myDLG(FALSE,"BMP","*.BMP", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "画像(*.BMP)|*.BMP||"); if(myDLG.DoModal() == IDOK){ CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate |CFile::modeWrite|CFile::typeBinary); UpdateData(TRUE); fout.WriteString(m_pict8); fout.WriteString("\xla"); filename = myDLG.GetPathName(); SetWindowText("start2"+filename); } ピクチャーコントロールの変数をm_pict8にしています。テキストファイルを保存するプログラムを参考にして作っているので間違っているのだと思います。 画像の保存方法が分かる方がいらっしゃいましたらよろしくお願いいたします。

  • AVIファイルがうまく表示できません

    CCDカメラ「webcam」で用意したAVI形式のファイルを 再生できるような物をVC++で作ってみたのですが いざ実行してみると画面が4分割されて表示されてしまいます。しかも上下左右のコマの順番がめちゃくちゃで。 プログラムは本に載っていたものを丸写しで、 他のAVI形式のアニメーションは正常に表示されます。 webcamで撮ったものだけだめなんです。 VC++初心者のため原因がわからず困っています。 どなたか知恵をお貸しください! ↓ファイルを読み込むボタンの中身です。 // コモンファイルダイアログを呼び出すためのオプションを指定する   CFileDialog dlg(TRUE, _T("AVI"), _T("*.AVI"),   OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,         _T("Animation (*.AVI)|*.AVI|")); // [OK]ボタンがクリックされて復帰したときの処理   if( dlg.DoModal()==IDOK )   { // AVIファイルのパス名を取得する   m_strFilename = dlg.GetPathName(); // フォームビューの内容を更新する   UpdateData(FALSE); // ウィンドウの属性を変更する m_dwStyle = WS_CHILD|WS_VISIBLE;   SetWindowLong(m_Animate.GetSafeHwnd(),   GWL_STYLE, m_dwStyle); // AVIファイルを開く   m_Animate.Open(m_strFilename); }

  • CFIleDialgを使う前後で作業ディレクトリが変わってしまう?

    いつもお世話になっています。 MFCでプログラミングをしています。 CFileDialogで ファイルをダイアログで選択すると、 ファイルを選んだディレクトリが 作業ディレクトリに変わってしまい、 データの出力が当該ディレクトリになってしまいます。 MSDNやWEBでCFileDialogを調べたのですが、 それに関する事項が見つかりませんでした。 元のディレクトリを メンバ変数として保持していおく以外に 方法はないのでしょうか? できるだけ余計な変数を減らして 効率的なプログラムに仕上げたいです。 どなたか、カレントディレクトリを 変えない方法/元に戻す方法について アドバイス又は参考URL等ご教示お願いします。 char path[256]; ::GetCurrentDirectory(255,path); CFileDialog dialog(TRUE,_T("out"),_T("particle_data.out"), OFN_FILEMUSTEXIST, "Outputファイル(*.out)|*.out|テキストファイル(*.txt)|*.txt|全ファイル(*.*)|*.*||", NULL); dout = dialog.DoModal(); ::GetCurrentDirectory(255,path);

  • ACCESS2000でダイアログボックスをひらく?

    アクセス2000でcsv形式のファイルを読み込むために、ダイアログボックスを表示さして、ファイルを選びたいのですがどうすればいいのでしょうか?エクセルのVBAではApplication.GetFilename(・・・・)でやったのですが、アクセスではGetFilenameがありません??????。大変困っています。たいした質問ではないのかもしれませんが教えていただきたいです。よろしくお願いします。

  • ダイアログを自分の好きな位置に表示したい

    VCで簡単なプログラムを造っています。 ダイアログベースです。 EXE を実行した時に表示されるダイアログを、自分の指定した位置に 表示させる方法はあるでしょうか。 また、そのダイアログから DoModal関数で別のダイアログを表示する場合、 同様に、自分の指定した位置に表示させる方法はあるでしょうか。 デフォルトのままだと、1つ目のダイアログは画面の中央に、 DoModal関数で表示させたダイアログは、1つ目のダイアログの上に なります。

  • 特殊文字「\」の変換の方法

    VC++2005のMFCにてプログラムを作成しています。 CFileDialogにてテキストファイルを読み込み、 読込んだファイルパスの「\」を「\\」になるように変換したいのですが、 実装の方法が分かりません。 ===================================== 例)C:\test\hoge.txt ⇒ C:\\test\\hoge.txt と変換する。 ===================================== 下記にファイルパスをCstring型で読み込み、 char型に変換するまでのプログラムを記載します。 理想としては、char型配列の中に、 「C:\\test\\hoge.txt」のような変換後のファイルパスを 入れたいのです。 解決方法をご存知の方おられましたら、ご教示お願いできませんでしょうか。 【プログラム】 /* ファイルオープンダイアログを表示 */ CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); CString filepath; if( ReadDlg.DoModal() == IDOK ) { filepath = ReadDlg.GetPathName(); // ファイルのフルパス名を取得 } CFile cfile; CFileException ex; if( !cfile.Open( filepath, CFile::modeRead , &ex ) ) { AfxMessageBox( "ファイルを開くのに失敗しました" ); // エラーメッセージを表示 return; } char st[255] = ""; strcpy( st, filepath );