Что мне нужно сделать, так это приложение киоска, которое считывает информацию с последовательного порта и переключается между тремя различными формами в зависимости от полученных данных.формы также могут переключаться между собой с помощью кнопки.
simplyfing:
1 Форма 1 активна до получения данных
2 основная программа считывает данные
3 форма 1 закрыта
4 form2 открыт и обработан полученные данные
5 нажата кнопка form2
6 форма 3 открыта
7 форма 2 закрыта
8 циклrestart
Мой подход заключается в использовании этого примера https://www.codeproject.com/Articles/7536/How-To-Swap-Top-Level-Forms?msg=969882, и я делаю это изменение в ApplicationContext, но если я использую оригинальный пример, он работает, но я не знаю, как передать метод с делегатом, если яИспользовать модифицированный код может передать делегат, но форма не будет открыта.я не уверен, что это лучший способ, я не могу перевести считываемые последовательные данные в форму1
какие-либо предложения или пример для подражания?
public class MainFormManager : ApplicationContext
{
protected bool exitAppOnClose;
// original
//Declare delagete callback function, the owner of communication
public SetOrderDelegate ProcessOrder;
public Form CurrentForm {
get { return MainForm; }
set {
if (MainForm != null) {
// close the current form, but don't exit the application
exitAppOnClose = false;
MainForm.Close();
exitAppOnClose = true;
}
// switch to the new form
MainForm = value;
MainForm.Show();
}
}
// modified
private Frm1 frm1;
private Frm2 frm2;
private Frm3 frm3;
public void ShowFrm1()
{
if (frm1 == null) {
frm1 = new Frm1();
frm1.Closed += mainFormClosed; // avoid reshowing a disposed form
this.ProcessOrder += new SetOrderDelegate(frm1.ProcessOrder);
MainForm = frminizio;
MainForm.Show();
} else {
frm1.Activate();
}
}
private void mainFormClosed(object sender, EventArgs e)
{
frminizio = null;
}
public void ShowFrm2()
{
if (frm2 == null) {
frm2 = new Frm2();
frm1.Closed += frm2Closed; // avoid reshowing a disposed form
//this.ProcessOrder += new SetOrderDelegate(frm3.ProcessOrder);
MainForm.Close();
MainForm = frm2;
MainForm.Show();
} else {
frm2.Activate();
}
}
private void frm2Closed(object sender, EventArgs e)
{
frm2 = null;
}
public void ShowFrm3()
{
if (frm3 == null) {
frm3 = new Frm3();
frm3.Closed += frm3Closed; // avoid reshowing a disposed form
//this.ProcessOrder += new SetOrderDelegate(frm3.ProcessOrder);
MainForm.Close();
MainForm = frm3;
MainForm.Show();
} else {
frmPaga.Activate();
}
}
internal sealed class Program
{
public Program()
{
//all other stuff
Application.Run(mainFormManager);
}
static void SerialReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
//SetTextDeleg BcRun = BarCodeRun;
string data = serial.ReadLine();
if (data == true) {
// this is only a semplyfied example //
frm1.setdata(data);
task.loop (2000);
frm2.setdata(data);
frm1.close();
frm2.open();
}
}
}