私は、I/O制御の状態をチェックするためのポーリングデバイスを扱う小さなプロジェクトに取り組んでいます。特定のデバイスを扱う小さなプロジェクトを実装しましたが、最終的には別のデバイスを実装することにしたので、クラス:インターフェイスアプローチに移行しました。ただし、多くのコードを移動したため、これによりいくつかの問題が発生しました。
コードなどを移動する前は、デリゲートを使用して動的フォームコントロールにアクセスしていました。
if (result != null)
{
this.Invoke((MethodInvoker)delegate
{
txtOutput1.Text = (result[4] == 0x00 ? "HIGH" : "LOW"); // runs on UI thread
if (result[4] == 0x00)
{
this.Controls["btn" + buttonNumber].BackColor = Color.Green;
}
else
{
this.Controls["btn" + buttonNumber].BackColor = Color.Red;
}
});
}
これは、特定のメソッドをインターフェイスから継承する新しいクラスに移動するまでは正常に機能しました。動的ボタンをパブリックに設定するだけではなく、get;set;を作成できるかどうかわかりません。動的ボタンの場合、それらがたくさんあることを考慮して、起動時に作成されます。もう1つの問題はthis.invoke"コマンドです。フォームに配置しないとinvokeコマンドは機能しないと思います...そして今はクラスに移動されているので、これを行う別の方法を検討する必要があります。
誰かが私がこれでどこに向かうべきかについて何か考えを持っていますか?
編集1:
このプログラムは、入力/出力を処理するハードウェアデバイスの監視システムとして設計されています。これらを使用して、たとえば、ドアアラームがトリガーされたかどうかなどを確認できます。フォーム/デザインの面でのプログラム自体は非常に単純です。現在、データベース内の情報に基づいてボタンを生成する単一のフォームがあります。たとえば、10個のデバイスが構成されている場合、10個のボタンがあります。これらはそれぞれ、ハードウェアの状態に応じて緑/赤で表示されます。
私のメインフォームは、それを監視する各デバイスのスレッドをトリガーしますが、複数のタイプのデバイスが必要だったため、それらを異なるクラスとすべての一般的なメソッドを処理するインターフェイスに移動しました。現在、インターフェイスを実装するデバイスクラスがあります。この質問に関しては、新しいインスタンスを作成するのではなく、更新元の単一のメインフォームのインスタンスにアクセスする必要があります。これにより、ロジックをフォーム自体に移動したときに作成した新しいメソッドを使用できるようになります。 。
編集2:
IdeviceInterface bfdeviceimp = new bf2300deviceimp();
// some other declarations and initialize components
private void btnConnect_Click(object sender, EventArgs e)
{
updateUI();
}
public void updateUI()
{
DBConnector mDBConnector = new DBConnector();
int count = mDBConnector.Count() - 1;
DataTable dataTable = mDBConnector.Select("SELECT * FROM devices");
int x = 12;
int y = 65;
for (int i = 0; i <= count && i < 25; i++)
{
Button btnAdd = new Button();
btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
btnAdd.Location = new Point(x, y);
btnAdd.Tag = i;
btnAdd.Name = "btn" + i.ToString();
btnAdd.BackColor = Color.Green;
var temp = i + 1;
this.Controls.Add(btnAdd);
this.Controls[btnAdd.Name].MouseClick += (sender, e) =>
{
int index = temp;
generalMethods.generatePopup(sender, e, index);
};
string address = dataTable.Rows[i]["deviceIP"].ToString();
int port = int.Parse(dataTable.Rows[i]["devicePort"].ToString());
ThreadStart workerThread = delegate { start(address, port, i); };
new Thread(workerThread).Start();
x = (x + 75);
if (i != 0 && (i % 5) == 0)
{
x = 12;
y = y + 30;
}
if (i == 25)
{
Button btnPreviousPage = new Button();
btnPreviousPage.Text = "<";
btnPreviousPage.Location = new Point(150, 350);
btnPreviousPage.Tag = "left";
this.Controls.Add(btnPreviousPage);
Button btnNextPage = new Button();
btnNextPage.Text = ">";
btnNextPage.Location = new Point(225, 350);
btnNextPage.Tag = "right";
this.Controls.Add(btnNextPage);
}
}
}
public void start(string address, int port, int i)
{
if (timer == null)
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { timerElapsed(sender, e, address, port, i); };
}
timer.Enabled = true;
// MessageBox.Show("Thread " + i + " Started.");
}
public void timerElapsed(object sender, ElapsedEventArgs e, string address, int port, int i)
{
bfdeviceimp.newconnect(address, port, i);
}
そして最後に私のデバイスクラス:
class bf2300deviceimp : IdeviceInterface
{
public void newconnect(string address, int port, int buttonNumber)
{
//send data
byte[] bData = new byte[71];
bData[0] = 240;
bData[1] = 240;
bData[2] = 0;
bData[3] = 1;
bData[68] = 240;
bData[69] = 240;
bData[70] = this.newCalculateCheckSum(bData);
try
{
byte[] result = this.newSendCommandResult(address, port, bData, 72);
//form1.setAlarmColour(result, buttonNumber);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
statechangedハンドラーをどこに置くことを提案しますか?