none
ファイル一覧の選択画面を表示したい RRS feed

  • 質問

  • ファイル一覧の選択画面を表示したい

    ボタンを押したら、ファイル一覧の選択画面を出そうとして、
    OpenFileDialogを使おうとしています。
    しかし、コンパイルエラーで先に進めません。
    ご教示願います。

    行った操作:
    (1)表示->ツールボックス->openFileDialogをクリックし、Form1までドラッグして落とす。
    (2)buttonを一個配置し、ダブルクリックし、イベントハンドラbutton1_Click()関数の
      処理内容に、
      http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx
      に書かれた内容をコピーした。
    (3)ビルドを実行->結果:コンパイルエラー 

    イベント処理ハンドラ:

    private:
       void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ )
       {
     //ここからが、COPYした内容
          Stream^ myStream;
          OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;

          openFileDialog1->InitialDirectory = "c:\\";
          openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
          openFileDialog1->FilterIndex = 2;
          openFileDialog1->RestoreDirectory = true;

          if ( openFileDialog1->ShowDialog() == ::DialogResult::OK )
          {
             if ( (myStream = openFileDialog1->OpenFile()) != nullptr )
             {
                // Insert code to read the stream here.
                myStream->Close();
             }
          }
      //ここまでがCOPYした内容
       }

    コンパイルエラーのメッセージ:

    ...\hello\Form1.h(142) : error C2065: 'Stream' : 定義されていない識別子です。
    ...\hello\Form1.h(142) : error C2065: 'myStream' : 定義されていない識別子です。
    ...\hello\Form1.h(150) : error C3083: 'DialogResult': '::' の左側のシンボルには、型を指定しなければなりません
    ...\hello\Form1.h(150) : error C2039: 'OK' : '`global namespace'' のメンバではありません。
    ...\hello\Form1.h(150) : error C2065: 'OK' : 定義されていない識別子です。
    ...\hello\Form1.h(155) : error C2227: '->Close' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
    ...     型は ''unknown-type'' です。

    ここにおいて、
    Streamクラスを調べようとして検索すると次が出てきます。
    http://msdn2.microsoft.com/ja-jp/library/system.io.stream.aspx
    しかし、ここからは、どう進んだら良いのかわかりません。

    こうした行き当たりばったりに検索しながら調べても、目的の機能をプログラミングするのは
    あまりにも不明なことが多すぎ、行き詰ってしまいます。
    ここで、ファイル選択表を選択する方法も知りたいのも山々ですが、
    それと同時に、システマティックな手順により、一通りの.NET機能を使えるようになるには、
    どのように学習を進めれば良いでしょうか?

     

    2006年10月12日 5:45

回答

  • こんな感じで良いのではないでしょうか。

    private:
        System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew System::Windows::Forms::OpenFileDialog();
    
            openFileDialog1->InitialDirectory = "C:\\";
            openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1->FilterIndex = 2;
            openFileDialog1->RestoreDirectory = true;
    
            if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
                System::IO::Stream^ myStream = openFileDialog1->OpenFile();
    
                if (myStream != nullptr) {
                    //TODO : ここにソースを追加
                      myStream->Close();
                }
            }
        }
    2006年10月12日 6:18
  • 「定義されてない」と出る場合には、名前空間を疑ってみるのは如何でしょうか?

    Stream が定義されていないとエラーが出る件ですが、

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx

    に書かれている「System.IO 名前空間が追加されている必要があります」が原因でしょう。

    DialogResult 側のエラーは、ShowDialog の返り値が System.Windows.Forms.DialogResult であることから、「System::Windows::Forms::DialogResult」とすれば、コンパイルエラーが出なくなる筈です。

     

    2006年10月12日 6:20
  •  じゃんぬねっと さんからの引用

    こんな感じで良いのではないでしょうか。

    private:
        System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew System::Windows::Forms::OpenFileDialog();
    
            openFileDialog1->InitialDirectory = "C:\\";
            openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1->FilterIndex = 2;
            openFileDialog1->RestoreDirectory = true;
    
            if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
                System::IO::Stream^ myStream = openFileDialog1->OpenFile();
    
                if (myStream != nullptr) {
                    //TODO : ここにソースを追加
                      myStream->Close();
                }
            }
        }

    ありがとうございます。ひとまず解決です。

    お教えいただいたコードを参考にして、次のコードに修正しましたら、ファイル選択画面が表示されました。

    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
          System::IO::Stream^ myStream;
                   //                      OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
          System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew System::Windows::Forms::OpenFileDialog();


                   openFileDialog1->InitialDirectory = "c:\\";
                   openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                   openFileDialog1->FilterIndex = 2;
                   openFileDialog1->RestoreDirectory = true;

          if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
                   {
                    if ( (myStream = openFileDialog1->OpenFile()) != nullptr )
                    {
                     // Insert code to read the stream here.
                      myStream->Close();
                     }
                   }

        }

     ネスティングされた名前空間を明示するのがポイントと理解しました。

     

     

    2006年10月12日 7:07
  •  Takashi SAKAMOTO さんからの引用

    「定義されてない」と出る場合には、名前空間を疑ってみるのは如何でしょうか?

    Stream が定義されていないとエラーが出る件ですが、

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx

    に書かれている「System.IO 名前空間が追加されている必要があります」が原因でしょう。

    DialogResult 側のエラーは、ShowDialog の返り値が System.Windows.Forms.DialogResult であることから、「System::Windows::Forms::DialogResult」とすれば、コンパイルエラーが出なくなる筈です。

     

     

    ・ネスティングされているopenFileDialogの所在する名前空間を明示すること、

    ・同じくStream型の定義されている名前空間を明示すること

    ・・・が、ポイントですね。

    基礎的なところですが、教わって初めてわかりました。

    ありがとうございました。

    2006年10月12日 7:14

すべての返信

  • こんな感じで良いのではないでしょうか。

    private:
        System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew System::Windows::Forms::OpenFileDialog();
    
            openFileDialog1->InitialDirectory = "C:\\";
            openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1->FilterIndex = 2;
            openFileDialog1->RestoreDirectory = true;
    
            if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
                System::IO::Stream^ myStream = openFileDialog1->OpenFile();
    
                if (myStream != nullptr) {
                    //TODO : ここにソースを追加
                      myStream->Close();
                }
            }
        }
    2006年10月12日 6:18
  • 「定義されてない」と出る場合には、名前空間を疑ってみるのは如何でしょうか?

    Stream が定義されていないとエラーが出る件ですが、

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx

    に書かれている「System.IO 名前空間が追加されている必要があります」が原因でしょう。

    DialogResult 側のエラーは、ShowDialog の返り値が System.Windows.Forms.DialogResult であることから、「System::Windows::Forms::DialogResult」とすれば、コンパイルエラーが出なくなる筈です。

     

    2006年10月12日 6:20
  •  じゃんぬねっと さんからの引用

    こんな感じで良いのではないでしょうか。

    private:
        System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew System::Windows::Forms::OpenFileDialog();
    
            openFileDialog1->InitialDirectory = "C:\\";
            openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1->FilterIndex = 2;
            openFileDialog1->RestoreDirectory = true;
    
            if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
                System::IO::Stream^ myStream = openFileDialog1->OpenFile();
    
                if (myStream != nullptr) {
                    //TODO : ここにソースを追加
                      myStream->Close();
                }
            }
        }

    ありがとうございます。ひとまず解決です。

    お教えいただいたコードを参考にして、次のコードに修正しましたら、ファイル選択画面が表示されました。

    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
          System::IO::Stream^ myStream;
                   //                      OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
          System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew System::Windows::Forms::OpenFileDialog();


                   openFileDialog1->InitialDirectory = "c:\\";
                   openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                   openFileDialog1->FilterIndex = 2;
                   openFileDialog1->RestoreDirectory = true;

          if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
                   {
                    if ( (myStream = openFileDialog1->OpenFile()) != nullptr )
                    {
                     // Insert code to read the stream here.
                      myStream->Close();
                     }
                   }

        }

     ネスティングされた名前空間を明示するのがポイントと理解しました。

     

     

    2006年10月12日 7:07
  •  Takashi SAKAMOTO さんからの引用

    「定義されてない」と出る場合には、名前空間を疑ってみるのは如何でしょうか?

    Stream が定義されていないとエラーが出る件ですが、

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx

    に書かれている「System.IO 名前空間が追加されている必要があります」が原因でしょう。

    DialogResult 側のエラーは、ShowDialog の返り値が System.Windows.Forms.DialogResult であることから、「System::Windows::Forms::DialogResult」とすれば、コンパイルエラーが出なくなる筈です。

     

     

    ・ネスティングされているopenFileDialogの所在する名前空間を明示すること、

    ・同じくStream型の定義されている名前空間を明示すること

    ・・・が、ポイントですね。

    基礎的なところですが、教わって初めてわかりました。

    ありがとうございました。

    2006年10月12日 7:14