0

いくつかのメソッドで使用される値を紹介するためのいくつかのテキストボックスがあるWindowsフォームがあります。

私の意図は、変数をグローバルに定義して、プログラム全体で使用できるようにすることでしたが、コンパイルエラーは発生しませんが、チェックすると変数は空になります(すべての変数に数値が書き込まれています)。ここにいくつかの変数があります、多分私は間違った値を割り当てています:

//This is in the mainform, where all the textboxes are stored


namespace WindowsFormsApplication1{


public partial class Rotor_Calc:Form

{

        public  Rotor_Calc()
        {
            InitializeComponent();
        }


        public string T_HotIn
        {
            get { return Temphotin.Text; }
            set { Temphotin.Text = value; }
        }

        public string F_Cold
        {
            get { return flowCold.Text; }
            set { flowCold.Text = value; }
        }

// this is in a class named Globals

public class Globals

{
    public static string THotIn;
    public static string FlowCold;

     public Globals(Rotor_Calc Rotor)

     {
         THotIn = Rotor.T_HotIn;

         FlowCold = Rotor.F_Cold;
}

     public static double Thin = Convert.ToDouble(Globals.THotIn);

     public static double speedCold = Convert.ToDouble(Globals.FlowCold);
}

次に、次のメソッドでGlobals.Thinを記述して、テキストボックスから値を取得できるようにしますが、コンパイルすると空のままになります。

また、別の変数の計算値を取得して、結果のテキストボックスに書き込みたいと思います。この目的のために、私は同じプロセスを逆方向にたどりました。

//メインフォームでテキストボックスを定義します

        public string Eff_Hot
        {
            get { return effecthot.Text; }
            set { effecthot.Text = value; }
        }

        public string Eff_Cold
        {
            get { return effectcold.Text; }
            set { effectcold.Text = value; }
        }

//in the globals method, take the value from the calculation method:

public class Globals{


    public static string eff_cold;

    public static string eff_hot;


public Globals(Rotor_Calc Rotor){


         eff_cold = Rotor.Eff_Cold;
         eff_hot = Rotor.Eff_Hot;
}

     public static double effcold=Convert.ToDouble(eff_cold);

     public static double effhot = Convert.ToDouble(eff_hot);
}

もちろん、その間の計算は無限の値を与えるため、最後のものは機能していません。

私は正確に何を間違っているのですか?誰かが助けることができますか?

4

1 に答える 1

0

あなたの問題は、この声明の事実だと思います:

public static double effcold=Convert.ToDouble(eff_cold); 

Globals クラスが初めてアクセスされるとすぐに実行されます。

これは、コンストラクターが実行される前に常に実行されることを意味します。Globals(Rotor_Calc Rotor)つまり、値が割り当てられる前eff_coldに実行されます。eff_hot

effcold=Convert.ToDouble(eff_cold);コンストラクター内に移動する必要があるかもしれませんがeffhot = Convert.ToDouble(eff_hot);、何をしようとしているのかがはっきりしないのでわかりません。

Globals を使用して、アプリケーションのすべてのポイントから TextBoxes の値にアクセスしようとしている場合は、値ではなく、フォームへのポインターを Globals に保持する必要があります。コンストラクター内のステートメントは 1 回だけ実行されます。これは、その時点で TextBox の値を eff_cold と eff_hot に保存していることを意味し、コンストラクターを再度実行しない限り、これらの値は変更されません。

さらに、静的なものだけを含むクラスのコンストラクターを持つという考えは好きではありません。

あなたのコードの可能な動作バージョン(私が正しく理解した場合)は次のようになります。

public class Globals    
{
    public static Rotor_Calc Rotor;

     public static double EffHot
     {
         get { return Convert.ToDouble(Rotor.EffHot); }
         set { Rotor.EffHot = value.ToString(); }
     }

     public static double EffCold
     {
         get { return Convert.ToDouble(Rotor.EffCold); }
         set { Rotor.EffCold = value.ToString(); }
     }
}

Globals.Rotor = yourInstanceOfRotor_Calc; を設定している限り、これは機能するはずです。(おそらく、 Globals.Rotor = this;Rotor_Calc の InitializeComponent() の後に a を使用します)。

とにかく、グローバルにフォームへの参照を保持するのは好きではありません。ある種の DataBinding を好むでしょう。

最後のコメントに従って編集します。

Rotor のセッターを作成し、そこに値を割り当てて、InitializeComponent() の後にセッターを呼び出すだけです。

public class Globals    
{
    public static double EffHot;
    public static double EffCold;
    public static Rotor_Calc Rotor
    {
        set 
        {
            EffHot = Convert.ToDouble(Rotor.EffHot);
            EffCold = Convert.ToDouble(Rotor.EffCold);
        }
     }

}
于 2013-02-11T13:35:19.500 に答える