C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: VS2008 C# フォームを跨いだ変数利用について


(過去ログ 118 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■69361 / inTopicNo.1)  VS2008 C# フォームを跨いだ変数利用について
  
□投稿者/ たろう (9回)-(2013/12/19(Thu) 13:57:34)

分類:[C#] 

visual studio 2008のC# windowsフォームでプログラムを作成しています。

mainForm、SUBForm、SUB2Formの3つのFormがあり、MainFormに記述された変数をSUB、SUB2Formで使用したいと考えています。

現在はmainFormに

public partial class start : mainForm {
    static int CHECK_OK = 1;
    static int CHECK_NG = 2;
}

という二つの静的変数を定義しSUBFormで
public partial class DN5101 : SUBForm {
    public mainForm MainForm = new mainForm();

    MainForm.CHECK_OK;
}

という風にしてMainFormに記述されたCHECK_OKをSUBFormで使用しようとしているのですが、アクセスできない保護レベルになっていますというエラーが出て上手くいきません。

MainFormでC言語の#defineのようなことをして他のFormで使いたいのですがどうのようにしたら上手くいくでしょうか?
引用返信 編集キー/
■69364 / inTopicNo.2)  Re[1]: VS2008 C# フォームを跨いだ変数利用について
□投稿者/ an (19回)-(2013/12/19(Thu) 15:05:53)
No69361 (たろう さん) に返信

>     MainForm.CHECK_OK;

上記のように指定しておりますが、
MainForm は 

>     public mainForm MainForm = new mainForm();

となっていますので、
本クラスのメンバですよね?

別クラスのスタティックの値を取得する場合は、
通常インスタンスではなく、型自身になると思うので、
MainFormよりmainFormの方が正しいです。

しかし、CHECK_OKの宣言しているところを見ると

> public partial class start : mainForm {
>     static int CHECK_OK = 1;
>     static int CHECK_NG = 2;
> }

このようになっており、mainFormクラスに定義しているのではなく、
mainFormクラスを継承したstartクラスに定義していますので、
正しくは、

start.CHECK_OK

ではないでしょうか?


また、

>     static int CHECK_OK = 1;

となっていますが、他クラスから参照するにはpublic等の
もっと広いスコープにしなければならないのでは?
(省略するとprivate?)
(本件の「アクセスできない保護レベルになっていますというエラー」がこれで出る)


#ちなみに
#MainForm.CHECK_OK;
#はメソッド外に記載していますが、
#これだと別のエラーが出ますけど・・・

引用返信 編集キー/
■69365 / inTopicNo.3)  Re[2]: VS2008 C# フォームを跨いだ変数利用について
□投稿者/ たろう (11回)-(2013/12/19(Thu) 15:25:12)
No69364 (an さん) に返信

回答ありがとうございます。

> 別クラスのスタティックの値を取得する場合は、
> 通常インスタンスではなく、型自身になると思うので、
> MainFormよりmainFormの方が正しいです。

  mainForm.CHECK_OK;
とすることで解決しました。

> しかし、CHECK_OKの宣言しているところを見ると
すいませんCHECK_OKの宣言の部分はコピペミスです。
本当は
public partial class mainForm : Form {
という風にしたかったのですが間違えました…

> となっていますが、他クラスから参照するにはpublic等の
> もっと広いスコープにしなければならないのでは?
> (省略するとprivate?)
> (本件の「アクセスできない保護レベルになっていますというエラー」がこれで出る)
省力するとprivateになるんですね、publicにしたら保護レベルのエラーが解決しました。

> #ちなみに
> #MainForm.CHECK_OK;
> #はメソッド外に記載していますが、
> #これだと別のエラーが出ますけど・・・

#はC言語で変数を定義する#defineのような動きをしたいという例えだったので実際にソースに組み込むわけではないのです、紛らわしくて済みません。
mainForm.CHECK_OK;
とすることで解決しましたありがとうございます。

解決済み
引用返信 編集キー/
■69367 / inTopicNo.4)  Re[3]: VS2008 C# フォームを跨いだ変数利用について
□投稿者/ an (20回)-(2013/12/19(Thu) 15:51:26)
No69365 (たろう さん) に返信
> ■No69364 (an さん) に返信

>>となっていますが、他クラスから参照するにはpublic等の
>>もっと広いスコープにしなければならないのでは?
>>(省略するとprivate?)
>>(本件の「アクセスできない保護レベルになっていますというエラー」がこれで出る)
> 省力するとprivateになるんですね、publicにしたら保護レベルのエラーが解決しました。

省略するとprivateかどうかはぱっと調べて見つからなかったので、
あくまでも推測です。
そこまでは調べませんので、ご自身で調べてみてください。
自分的には基本的には省略しない派なので、
省略すると何になるかまではあまり記憶していませんので・・・。

また、publicかどうかはあくまで例としてあげただけなので、
今回必要なスコープをちゃんと検討することをお勧めします。
あまり広すぎるスコープにすると誤解の元になったり、バグの原因になりますので。
提示されているソースコードだとinternalでも十分な気がしますが、
全てのソースコードを見たわけではないので、こちらでは判断しかねます。


>>#ちなみに
>>#MainForm.CHECK_OK;
>>#はメソッド外に記載していますが、
>>#これだと別のエラーが出ますけど・・・
>
> #はC言語で変数を定義する#defineのような動きをしたいという例えだったので実際にソースに組み込むわけではないのです、紛らわしくて済みません。
> mainForm.CHECK_OK;
> とすることで解決しましたありがとうございます。

こちらが記載した「#」は蛇足的な意味合いで書いただけで
別に「#define」について書いたわけじゃないんですが・・・(笑)

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -