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

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

ただいまの
回答率

90.61%

  • C#

    6857questions

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

  • Visual Studio 2013

    306questions

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

  • オブジェクト指向

    273questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,615

ElecDove

score 227

お世話になります。

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

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

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

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



わかりにくいかもしれませんが、質問をまとめるとこんな感じです
  • 静的クラス内の静的メソッド内(Main内)で宣言された変数に、その中(Main内)でインスタンス化されたオブジェクトからアクセスするには
  • 静的クラス内の静的メソッド内(Main内)でインスタンス化されたオブジェクトに、静的クラス内の静的メソッド内(Main内)でインスタンス化された別のオブジェクトからアクセスする方法



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

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


実際に運用したいのは、

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

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

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

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

//namespaceは省略します。
static class Program{
    [STAThread]
    static void Main(){
        var hoge = new fuga();//←アクセスしたいのはここでインスタンス化されたオブジェクト
        string moji = "this is a moji". 
           
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        application.Run(new Form1());
    }

    public class fuga{
        public string text1 = "this is a mojimoji";
}

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


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

こんにちは。

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

static class Program
{
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    public class fuga
    {
        private static fuga _Insutance = null;
        public static fuga Instance 
        {
            get
            {
                if(_Insutance == null)
                {
                    _Insutance = new fuga();
                }
                return _Insutance;
            }
        }

        private fuga()
        {
            //TODO:設定ファイル等読み込み、オブジェクトとして保存
        }

        public void Save()
        {
            //TODO:設定ファイルへオブジェクトのフィールド値を保存
        }

        #region 設定フィールド
        public string Param1 { get; set; }
        public int Param2 { get; set; }
        #endregion
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        textBox1.Text = Program.fuga.Instance.Param1;
        textBox2.Text = Program.fuga.Instance.Param2.ToString("000");

        //.....

        Program.fuga.Instance.Save();
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

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

void SomeMethod(){
    var f = new Foo();
    var b = new Bar(this);
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/20 00:35

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

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    [C#]異なるダイアログで部品を共有したいのですが

    メモ帳のようなアプリを作っているのですが、検索ダイアログと置換ダイアログで共通する部分があり、(検索文字列のテキストボックス、大文字小文字区別のためのチェックボックスなど)共有化し

  • 解決済

    コンストラクタで戻り値をもらう方法(?)

    コンストラクタに直接戻り値を付けられませんが、File fl = new myFile(); でflにFileを格納したいんです。 わざわざ、File fl = new myFil

  • 解決済

    スレッドからアプリケーションを再起動させたい

    public partial class Form1 : Form {     private static System.Threading.Mutex mutex = ne

  • 解決済

    static変数を同時にnewした場合の生成順序は?

    以下のjavaのシングルトンのソースコードを読んでいて気になっていたのですが、 同時にHogeクラスがロードされnew Hoge()を生成された場合の順序はどうなるのでしょうか?

  • 解決済

    Taskが実行されません。

    ネットで、ThreadよりTaskを使ったほうが良いという記事を見て、コピペで使ってみましたが、動きません。 MSDNを見ても、同じようなコードがあったのでこれでいいのかなーと思

  • 解決済

    C#におけるForm1クラスの他クラスでの利用

    C#を勉強中です。 現在、 listBoxに値を挿入するという基本的なコーディングを行っているのですが、 下記点で質問があります。 listBox1コントールを他の

  • 解決済

    php 継承関係について

    お世話になっております。 PHPの継承の関係について質問させてください。 ある理由がありまして、継承先から継承元にメソッドを渡したいのですがどうしたら良いでしょうか。 元のファ

  • 受付中

    他のクラスからJFrameのラベルのテキストを変更

    前提・実現したいこと JAVAプログラムをNetBeansで作っています。 JFrameにラベルを配置しました。 このラベルのテキストを他のクラスから変えるにはどうしたら良いでしょ

同じタグがついた質問を見る

  • C#

    6857questions

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

  • Visual Studio 2013

    306questions

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

  • オブジェクト指向

    273questions

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

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