none
埋め込まれたテキストの選択 RRS feed

  • 質問

  • 前回はお世話になりました。

    内部にテキストを埋め込むことが出来ました。

    今度は他の動作で行き詰ってしまいました。

    これまでは、1種類のテキストを埋め込んで
    実行していましたが、今度は読み込むテキストを
    3種類用意し、条件(ラジオボタンの選択)で
    表示されるテキストを選択できるようにしようと
    思っています。

    単純に、if文で試してみましたが
    うまくいきませんでした。

    埋め込んだテキストをラジオボタンで選択して
    実行するにはどのようにすればよいか
    アドバイスをいただけないでしょうか?

    よろしくお願いいたします。

    下記にソースを載せます。(恥ずかしいですが。。)

    ********
    読み込み(1種類のテキスト/動作確認済み)

                Assembly my_asm = Assembly.GetExecutingAssembly();

    // ココに部分を修正
                Stream st = my_asm.GetManifestResourceStream(
                                Application.ProductName + "." + "data.txt");
                StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
    //

                string A;
                while ((A = sr.ReadLine()) != null)
                {
                    set[i].mon = sr.ReadLine();
                    set[i].keA = sr.ReadLine();
                    i++;
                }
                sr.Close();
                st.Close() ;
    *********


    *********
    複数選択式
    *********

                Stream A_st = my_asm.GetManifestResourceStream(
                                Application.ProductName + "." + "A_qko1200.txt");

                Stream B_st = my_asm.GetManifestResourceStream(
                                Application.ProductName + "." + "B_qko1200.txt");

                Stream C_st = my_asm.GetManifestResourceStream(
                                Application.ProductName + "." + "C_qko1200.txt");

                if (radioButton4.Checked == true)
                {
                StreamReader sr = new StreamReader(A_st, Encoding.GetEncoding("Shift_JIS"));
                }
                else if (radioButton5.Checked == true)
                {
                StreamReader sr = new StreamReader(B_st, Encoding.GetEncoding("Shift_JIS"));
                }
                else if (radioButton6.Checked == true)
                {
                StreamReader sr = new StreamReader(C_st, Encoding.GetEncoding("Shift_JIS"));
                }
    *********

     

    2011年11月12日 4:28

回答

  • C#の書籍など、文法や言語の仕様を体系的に学べる物はお持ちですか?
    変数のスコープについてお調べになった方が良いでしょう。

    エラーになるケースは想定していません。

     

     

    Stream st;
    
    if (radioButton4.Checked == true)
        st = my_asm.GetManifestResourceStream(Application.ProductName + "." + "A_qko1200.txt");
    else if (radioButton5.Checked == true)
        st = my_asm.GetManifestResourceStream(Application.ProductName + "." + "B_qko1200.txt");
    else if (radioButton6.Checked == true)
        st = my_asm.GetManifestResourceStream(Application.ProductName + "." + "C_qko1200.txt");
    
    StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
    
    
    

    #文章を書いている間に被ってしまったようです。
    #すみません。
    • 編集済み NF64 2011年11月12日 14:26
    • 回答としてマーク John.J.Rambo 2011年11月14日 20:33
    2011年11月12日 14:26

すべての返信

  • 埋め込んだテキストをラジオボタンで選択して
    実行するにはどのようにすればよいか
    アドバイスをいただけないでしょうか?

    コードの意味を説明できますか?
    また、変数のスコープ(有効期間)を考えられていますか?

    現状のコードは、RadioButton の分岐の際にそれぞれの分岐の中で StreamReader sr という変数を作っては捨てているため、if-else ブロックを抜けた後は sr を使うことができません。
    今のコードをベースにするとすれば、StreamReader sr = null; を if の前に置き、if-else の中では sr = new StreamReader(... というようにすでに用意している変数に入れるだけにするところでしょうか。
    ただ、その場合でも、どの if にもマッチしなかった場合(else ブロック)はどのような処理を書くべきか、また、選ばれなかったリソース Stream の Dispose はいつ行うべきかについても考えていただく必要があります。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年11月12日 9:13
    モデレータ
  • ありがとうございます。

    すみません、StreamReader sr は、捨てられているのはわかりませんでした。

    ということは、あまりこの方法ではよくないということでしょうね。

    実際、複数のテキストを読み込んで、選択させる場合はどのように組めばよいか

    アドバイスいただけないでしょうか?

    (ちゃんと理解するように勉強します)

     

    2011年11月12日 13:52
  • このコード例を参考にする場合、どのように考え、どのように解決したなど、読んだ結果で得たものを共有してください。

    Stream resourceStream;
    if (/* Aであることを確かめる式 */)
    {
    	resourceStream = my_asm.GetManifestResourceStream(/* A */);
    }
    else if (/* Bであることを確かめる式 */)
    {
    	resourceStream = my_asm.GetManifestResourceStream(/* B */);
    }
    else
    {
    	// AでもBでもなかった場合はどうするの?
    }
    
    // ここからはresourceStreamに対して読み込むなどの処理をすればいい。
    

     


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年11月12日 14:18
    モデレータ
  • C#の書籍など、文法や言語の仕様を体系的に学べる物はお持ちですか?
    変数のスコープについてお調べになった方が良いでしょう。

    エラーになるケースは想定していません。

     

     

    Stream st;
    
    if (radioButton4.Checked == true)
        st = my_asm.GetManifestResourceStream(Application.ProductName + "." + "A_qko1200.txt");
    else if (radioButton5.Checked == true)
        st = my_asm.GetManifestResourceStream(Application.ProductName + "." + "B_qko1200.txt");
    else if (radioButton6.Checked == true)
        st = my_asm.GetManifestResourceStream(Application.ProductName + "." + "C_qko1200.txt");
    
    StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
    
    
    

    #文章を書いている間に被ってしまったようです。
    #すみません。
    • 編集済み NF64 2011年11月12日 14:26
    • 回答としてマーク John.J.Rambo 2011年11月14日 20:33
    2011年11月12日 14:26
  • 遅くなりました。

    教えていただいたソースで、希望通りの動作を確認できました。

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

     

    手元にある書籍、ネット上の情報を熟読してしかり勉強したいと思います。

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

    2011年11月14日 20:32