0

mainForm と所有者フォーム cameraViewVS(child) があります。2番目のフォームにcheckBoxがあり、チェックまたはチェックを外したときに最初のフォームでその値を取得したい、mainFormでこのようなpropertyNameを使用した

public bool propertyZoomCam
{
  get { return f1.checkBoxZoomCam.Checked; }
}

f2 のインスタンスを 1 回だけ表示するときに、f1 でこのプロパティを呼び出します。

public void timer()
{
  for (int l = 0; l < 2; l++)        
  {            
    cameraInstance[l].Start();
    if (cameraInstance[l].MoveDetection == true)
    {
      foreach (Form S in Application.OpenForms)
      {
        var frm = S as Formes.CameraViewVS;
        if (frm != null && frm.Addresse == cameraInstance[l].adresse) {
          // Match, activate it
          cameraInstance[l].MoveDetection = false;
          frm.WindowState = FormWindowState.Normal;
          frm.Activate();
          return;
        }
      }
      // No match found, create a new one
      var f1 = new Formes.CameraViewVS(cameraInstance[l], adresseIPArray[l]);
      f1.Show(this);
      if(propertyZoomCam)
        zoom = 15;
    }
  }
}      

最初の値が false であるため、最初の false 値のみを取得します。チェックを変更またはチェック解除すると、その値は取得されません。

何か助けはありますか?

4

2 に答える 2

0

ここで確認する必要があるいくつかのoifがあります:

  1. 上記の回答で述べたように、プロパティコードでローカル変数を参照しています。これは、その変数の作成の範囲内でプロパティにアクセスする場合にのみ機能します。これにより、実装しようとしている使用が大幅に制限されます。これを絶対にやるべきではないとは言いませんが、有効なユースケースを思い付くことができません。
  2. Show()を呼び出すと、モードレスフォームが作成されてすぐに返されます。したがって、onloadコードでチェックボックスのステータスが変更されない限り、作成時のステータスとほとんど変わりません。
  3. 最後に、そして最も重要なこととして、最終目標に関して、タイマーを使用することは、チェックボックスの変更を処理するための非効率的な方法である可能性があります。子フォームのチェックボックスがクリックされたときにアプリが親フォームで反応するようにする場合は、イベントを利用する必要があります。子フォームは、ユーザーがチェックボックスのステータスを変更したことを検出すると、イベントをトリガーする必要があります。メインフォームは、次のタイマーサイクルを待つ代わりに、このイベントをリッスンして適切に応答できます。これを実装するには、イベントデリゲートを確認する必要があります。これらの手法に対処するSOに関する多くの質問があります。
于 2012-05-17T18:36:44.763 に答える
0

コードに次の変更を加えます。

  1. 子フォームへの参照を保持する変数をフォーム レベルで宣言します。

  2. ここで、変数 f1 と frm をタイマー関数の frmCamera に置き換え、変数 f1 と frm をタイマー関数で宣言しないでください。

3. プロパティ コードを更新します。

Formes.CameraViewVS frmCamera;

public bool propertyZoomCam
{
    get 
    {
        if (frmCamera!=null)
            return frmCamera.checkBoxZoomCam.Checked; 
        else 
            return false;
    }
}


public void timer()
{
  for (int l = 0; l < 2; l++)        
  {            
    cameraInstance[l].Start();
    if (cameraInstance[l].MoveDetection == true)
    {
      foreach (Form S in Application.OpenForms)
      {
        frmCamera = S as Formes.CameraViewVS;
        if (frmCamera != null && frmCamera.Addresse == cameraInstance[l].adresse) {
          // Match, activate it
          cameraInstance[l].MoveDetection = false;
          frmCamera.WindowState = FormWindowState.Normal;
          frmCamera.Activate();
          return;
        }
      }
      // No match found, create a new one
      frmCamera = new Formes.CameraViewVS(cameraInstance[l], adresseIPArray[l]);
      frmCamera.Show(this);
      if(propertyZoomCam)
        zoom = 15;
    }
  }
}      

タイマー イベントが再び発生すると、カメラ フォームの参照が失われていたため、プロパティで使用されているのと同じオブジェクトにフォームを保存しています。

于 2012-05-17T17:48:25.340 に答える