質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

7743閲覧

C# static Main内でインスタンス化されたオブジェクトにフォームからアクセスするには

ElecDove

総合スコア254

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2015/09/19 14:52

お世話になります。

static void Main()内でインスタンス化されたオブジェクトにフォームからアクセスするにはどうしたらよいでしょうか

new Form1()をするとき、thisを渡そうとすると、「静的(略)では利用できません」と怒られます。

かといって、何も渡さずにhoge.text1のように呼び出そうにも呼び出せません…

また、同じようにMain内で宣言した変数(stringですが)にどうやってフォームからアクセスすればよいのかがわかりません。

わかりにくいかもしれませんが、質問をまとめるとこんな感じです

  • 静的クラス内の静的メソッド内(Main内)で宣言された変数に、その中(Main内)でインスタンス化されたオブジェクトからアクセスするには
  • 静的クラス内の静的メソッド内(Main内)でインスタンス化されたオブジェクトに、静的クラス内の静的メソッド内(Main内)でインスタンス化された別のオブジェクトからアクセスする方法

よろしくお願いいたします。
以下、ソースです。

※基本的にVisualStudioの吐いたソースです。タイポがあるかもしれませんがご容赦ください

実際に運用したいのは、

static Main()内でアプリの設定ファイル等読み込み、オブジェクトとして保存。

メインフォーム起動(もちろん設定情報を利用する→ユーザーが変更)

最後にファイルへ書き込み

です。(xmlを使っています)

C#

1//namespaceは省略します。 2static class Program{ 3 [STAThread] 4 static void Main(){ 5 var hoge = new fuga();//←アクセスしたいのはここでインスタンス化されたオブジェクト 6 string moji = "this is a moji". 7 8 Application.EnableVisualStyles(); 9 Application.SetCompatibleTextRenderingDefault(false); 10 application.Run(new Form1()); 11 } 12 13 public class fuga{ 14 public string text1 = "this is a mojimoji"; 15}

C#

1public partical class Form1:Form{ 2 public Form1(){ 3 InithializeComponent(); 4 textBox1.Text = hoge.text1; //←こんな風にしたい 5 textBox2.Text = Main.moji; //←こんな風にしたい 6 } 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

実際の運用シナリオから想定するに、
「シングルトンデザインパターン」を適用して設定ファイルの単一インスタンスを用意するのが良いと思います。

C#

1static class Program 2{ 3 /// <summary> 4 /// アプリケーションのメイン エントリ ポイントです。 5 /// </summary> 6 [STAThread] 7 static void Main() 8 { 9 Application.EnableVisualStyles(); 10 Application.SetCompatibleTextRenderingDefault(false); 11 Application.Run(new Form1()); 12 } 13 14 public class fuga 15 { 16 private static fuga _Insutance = null; 17 public static fuga Instance 18 { 19 get 20 { 21 if(_Insutance == null) 22 { 23 _Insutance = new fuga(); 24 } 25 return _Insutance; 26 } 27 } 28 29 private fuga() 30 { 31 //TODO:設定ファイル等読み込み、オブジェクトとして保存 32 } 33 34 public void Save() 35 { 36 //TODO:設定ファイルへオブジェクトのフィールド値を保存 37 } 38 39 #region 設定フィールド 40 public string Param1 { get; set; } 41 public int Param2 { get; set; } 42 #endregion 43 } 44} 45 46public partial class Form1 : Form 47{ 48 public Form1() 49 { 50 InitializeComponent(); 51 textBox1.Text = Program.fuga.Instance.Param1; 52 textBox2.Text = Program.fuga.Instance.Param2.ToString("000"); 53 54 //..... 55 56 Program.fuga.Instance.Save(); 57 } 58}

投稿2015/09/19 15:37

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Form1のコンストラクタなりで渡せばいいと思います
new Form1(hoge,moji)というように。

というかthisを何か勘違いしているような気がします。

C#

1void SomeMethod(){ 2 var f = new Foo(); 3 var b = new Bar(this); 4}

と書いてもbがfにアクセスする手段はありませんよ?
fSomeMethod()内のローカル変数なので。

投稿2015/09/19 15:23

編集2015/09/19 15:32
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2015/09/19 15:35

回答ありがとうございます 確かにおっしゃる通りです 何を血迷っていたんだろう、ちゃんと考えればわかることでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問