2011-01-20 10 views
0

これは実装の問題の詳細です。 MainWindowには、SendData(byte [] data)メソッドを公開するシリアルポートオブジェクトがあります。 MainWindowには、実行時に外部XMLファイルを使用して読み込まれるタブコントロールもあります。これらのコントロールはシリアルポートと相互作用し、データの送受信を行います。実行時に作成されたコントロールに代理人を渡す

送信するには、[送信]をクリックし、MainWindow.SendData()を呼び出す必要があります。問題は、MainWindowを参照せずにMainWindow.SendData()を呼び出す方法です(SendData()を別のクラスに移動するなど)。頭に浮かぶ

class MainWindow { 
    SerialPort serialport; 
    public MainWindow { 
     // parse XML and add tabs to tabcontrol 
     int tabcount = xmlreader.GetNodeCount(xpath); 
     for (int i = 0; i<tabcount; i++) { 
     tabitems[i] = new TabClass(tabname, ref tabControl); 
    } 
    public void SendData(byte[] data){ 
     serialport.Write(data,0,data.Length); 
    } 
} 

class TabClass { 
    TabItem tabitem; 
    public TabClass(tabname, ref tabControl){ 
     tabitem = new TabItem(); 
     tabcontrol.Items.Add(tabitem); 
     // add all controls (coming from xml) 
     for (int i = 0; i < nrControls; i++) { 
      // add control here, i.e. CommandControl 
     } 
    } 
}  
class CommandControl { 
    public Button_Click(){ 
     // Need to call SendData here!! 
    } 
} 

まず最初は、TabClassが追加される各カスタムコントロールにデリゲートを渡してきた、TabClassへのSendDataデリゲートを渡すことです。私は各クラスのコンストラクタを渡すことができます。または、代理人をパブリックにしてMainWindowに直接書き込ませることができます。

私が持っている問題は、すべての単一のユーザーコントロールとメインのTabControlでデリゲートを作成して宣言していることです。実装を変更する場合は、すべてのユーザーコントロールで宣言を変更する必要があります。もちろん、新しい実装を組み込むようにコントロールを変更する必要がありますが、すべてのコントロールで宣言を書き換えないようにしたいと考えています。

質問:MainWindowを参照せずにMainWindowからSendData()デリゲートを公開する方法はありますか?私は一度だけ宣言し、すべてのコントロールを共有したいと思います。

+0

ですから、複数のタブから読み取り、同じシリアルポートへの書き込みがありますか? –

+0

直接ではありません。 SendData()は実際には、データを送信する必要がある複数のタブからすべてのコントロールのデータをエンキューするSerialPortマネージャです。すべてのタブは、受信したすべてのデータを管理するReceiveData()を介して、同じSerialPortからデータを受信して​​います。 – PaulG

答えて

1

シングルトンクラス、または単に静的クラスを使用できます。

これはちょうどと一致する必要があります。出力チャネルはです。

+0

私に簡単な例を教えてもらえますか?私はそれを成功せずに試みた。静的クラスから非静的メソッド(serialport.SendData)を呼び出すことはできません。私はまたMainWindow.SendDataへの代理人だけを含む静的なクラスを作成しようとしましたが、やはりそれは私にそれをさせませんでした。 – PaulG

+0

静的/シングルトンは、a)MainFormまでのSerialPortまたはb)リンクを所有している必要があります。 –

0

これに委任する必要はありません。
ユーザーヘルパークラス。

class SerialWrapper { 
    SerialPort serialport; 
    public void SendData(byte[] data){ 
     serialport.Write(data,0,data.Length); 
    } 
} 

class MainWindow { 
    SerialWrapper serialWrapper; 
    public MainWindow { 
     // parse XML and add tabs to tabcontrol 
     int tabcount = xmlreader.GetNodeCount(xpath); 
     for (int i = 0; i<tabcount; i++) { 
     tabitems[i] = new TabClass(tabname, ref tabControl,serialWrapper); 
    } 
    public void SendData(byte[] data){ 
     serialWrapper.SendData(data); 
    } 
} 

更新:

class CommandControl { 
    public CommandControl(SerialWrapper serialWrapper) 
    { 
      this.serialWrapper=serialWrapper; 
    } 

    public Button_Click(){ 
     serialWrapper.SendData(); 
    } 
} 
+0

MainWindowはそれを作成してポートを所有しているので、これでMainWindowを参照する必要があります。静的なクラスがもっと合うようです。 – PaulG

+0

@ PaulG:私の例によると、SerialWrapperクラスへの参照だけが必要です – Avram

関連する問題