1

別のフォームからメイン フォームの関数を呼び出そうとしています... メイン フォームで public static を宣言することにより、既に単純な関数を呼び出さなければなりませんが、必要な関数を呼び出すことができません。呼び出す関数:

    public static void spotcall()
    {
        string dial = Registry.CurrentUser.OpenSubKey("SOFTWARE").OpenSubKey("INTERCOMCS").GetValue("DIAL").ToString();
        MainForm.txtSendKeys.Text = dial;// Here it asks me for a reference to an object.


        foreach (char c in txtSendKeys.Text)
        {
            sideapp.Keyboard.SendKey(c.ToString(), checkBoxPrivate.Checked);
        }
        txtSendKeys.Clear();
    }

子フォームから呼び出すために使用する手順:

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Text = "Hoho";
        MainForm.spotcall();
    }

私は C# に関する理論が不足していることを完全に認めますが、よくあることですが、自分の仕事のためにそれを行う必要があるだけなので、たまたま自分で解決策にたどり着けない場合は、助けを得られることを期待しています。ありがとうございました :)

4

7 に答える 7

2

これを行う正しい方法は、デリゲートを使用することだと思います。この方法では、フォーム (ウィンドウ) は親フォームについて何も知る必要はありません (フォームは別の親フォームから開くことができます)。

子フォームが閉じているとき (フォームをモーダルとして表示していないとき) に、親フォームで関数を呼び出したいとしましょう。

子フォームの上部にデリゲートを作成します。

    public delegate void CloseEvent();
    public CloseEvent WindowClosed;

フォームを閉じるイベントを作成し、デリゲートを呼び出します。

    private void child_FormClosing(object sender, FormClosingEventArgs e)
    {
      WindowClosed();
    }

親フォームのボタンは、子フォームを表示し、コールバックを設定できます。

    private ChildForm childform = null;

    private void buttonShowChildForm_Click(object sender, EventArgs e)
    {
      if (childform == null)
      {
        childform = new ChildForm();
        childform.WindowClosed += childClosed;
        childform.Show();
      } else
      {
        childform.BringToFront();
      }
    }

    private void childClosed()
    {
        childform = null;
    }

この例では、ボタンを使用して、親フォームをブロックしない新しいフォームを開きます。ユーザーがフォームをもう一度開こうとすると、既存のフォームを前面に移動してユーザーに表示します。フォームを閉じるときにオブジェクトを null に設定して、次にボタンをクリックしたときに新しいフォームが開かれるようにします。これは、閉じたときに古いフォームが破棄されたためです。

よろしくハンス・ミリング...

于 2015-01-27T10:28:06.030 に答える
1

静的関数を作成する場合、関数内で静的でないグローバル変数を参照することはできません。

したがって、スポットコールを静的にするには、txtSendKeys への参照を削除する必要があります (これは、フォームの他の場所で作成したテキスト ボックスであると想定しています)。または、txtSendKeys を静的関数内で宣言する必要があります。

追加:

可変ダイヤルを介して、前の行で txtSendKeys.Text の値を取得しました。txtSendKeys.Text をまったく参照する代わりに、単に変数 dial を使用して関数を完了し、関数を静的のままにすることができると思います (とにかく最後にクリアします)。

public static void spotcall()
    {
        string dial = Registry.CurrentUser.OpenSubKey("SOFTWARE").OpenSubKey("INTERCOMCS").GetValue("DIAL").ToString();


        foreach (char c in dial)
        {
            sideapp.Keyboard.SendKey(c.ToString(), checkBoxPrivate.Checked);
        }            
    }

ただし、checkBoxPrivate.Checked で遭遇する可能性が高い同じ問題を解決することはできません。

ブール値の引数を取るように変更できます。

public static void spotcall(Boolean PrivateChecked)
    {
        string dial = Registry.CurrentUser.OpenSubKey("SOFTWARE").OpenSubKey("INTERCOMCS").GetValue("DIAL").ToString();               

        foreach (char c in dial)
        {
            sideapp.Keyboard.SendKey(c.ToString(), PrivateChecked);
        }

    }
于 2013-05-29T16:16:23.280 に答える