Всем добрый день! ) Помогите грамотно передавать значения между классами.
Один класс у меня принимает значения о подключившемся TCP клиенте и отправляет этому же клиенту, сформированное вторым классом, xml сообщение.
Вот в чём загвоздка. В ходе формирования xml файла мне нужно в классе передать значение переменной true другому классу (типа что моему классу(который отправляет сообщение) уже есть что читать).
Вот в этом методе я формирую сообщение и хочу сказать другому классу что оно готово
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
| public XmlDocument Create_M()
{
using (fbBD = new FbConnection())
{
FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
csb.ServerType = 0;
csb.Database = Program.form1.tb_path_db.Text;
// Настройка параметров "общения" клиента с сервером
csb.Charset = "WIN1251";
csb.Dialect = 3;
// Настройки аутентификации
csb.UserID = Program.form1.tb_login.Text;
csb.Password = Program.form1.tb_pswd.Text;
try { fbBD = new FbConnection(csb.ToString()); }
catch { Program.form1.WriteLog(Program.form1.statusStrip1.Items[0].Text = "Ошибка в параметрах соединения"); }
fbBD.Open();
sqlReqest = new FbCommand("select n, datetime, pt, parity, id from kp where status=1", fbBD);
try
{
FbDataReader r = sqlReqest.ExecuteReader();
// результат запроса построчно - строка за строкой
while (r.Read())
{
NO = r.GetString(0);
DATE = r.GetString(1);
PT = r.GetString(2);
PARITY = r.GetString(3);
ID = r.GetString(4);
ready = true;
}
Program.form1.WriteLog(Program.form1.statusStrip1.Items[0].Text = "Соединение с базой успешно");
}
catch
{
Program.form1.WriteLog(Program.form1.statusStrip1.Items[0].Text = "Ошибка чтения данных из базы");
Program.form1.btn_load.Enabled = true;
}
XmlTextWriter writer = null;
try
{
sqlReqest = new FbCommand("select n, datetime, pt, parity, id from kp where status=1", fbBD);
FbDataReader r = sqlReqest.ExecuteReader();
writer = new XmlTextWriter(string.Format(Program.form1.tb_xml_name.Text + "\\" + "M000.xml"), System.Text.Encoding.Default);
writer.WriteStartDocument();
writer.WriteStartElement("GPS");
writer.WriteAttributeString("Type", "M");
writer.WriteAttributeString("mes", mes_M.ToString());
writer.WriteAttributeString("time", DateTime.Now.ToUniversalTime().ToString());
writer.WriteAttributeString("ver", "1");
while (r.Read())
{
writer.WriteStartElement("BICL");
writer.WriteAttributeString("id", NO.ToString());
writer.WriteAttributeString("time", DATE.ToString());
writer.WriteAttributeString("type", TYPE.ToString());
writer.WriteAttributeString("pt", PT.ToString());
writer.WriteAttributeString("parity", PARITY.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message);
}
finally
{
if (writer != null)
{
writer.Close();
string a = string.Format(Program.form1.tb_xml_name.Text + "\\" + "M000.xml");
xmlDoc_M.Load(a);
server_klient s_k;
s_k.Send_Ready(ready);
}
}
Program.form1.contextMenuStrip1.Items[0].Enabled = true;
fbBD.Close();
}
return xmlDoc_M; |
|
Метод который принимает значение переменной Ready (типа bool)
C# |
1
2
3
4
| public void Send_Ready(bool ready)
{
send_ready = ready;
} |
|
Метод отправляющий сообщение:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public void XML_SEND_M(object new_client)
{
if (send_ready == true)
{
byte[] xml_M = Encoding.Default.GetBytes(xml_doc_m.InnerXml);
byte[] xml_M_0 = new byte[xml_M.Length + 1];
xml_M.CopyTo(xml_M_0, 0);
client.Client.Send(xml_M_0);
send_ready=false;
}
else
{
byte[] xml_empt = Encoding.Default.GetBytes(xml_empty.InnerXml);
byte[] xml_0 = new byte[xml_empt.Length + 1];
xml_empt.CopyTo(xml_0, 0);
client.Client.Send(xml_0);
}
} |
|
А это вызывается всё из формы вот так:
C# |
1
2
3
4
5
6
7
| Program.form1.F = Program.form1.program_functions.Create_F();
Program.form1.mes_M = 1;
Program.form1.empt = Program.form1.program_functions.xml_Empty();
S_K = new server_klient(client);
Program.form1.Invoke(new MethodInvoker(delegate { Program.form1.timer1.Enabled = true; }));
Program.form1.Invoke(new MethodInvoker(delegate { Program.form1.timer1.Start(); }));
tcpClientConnected.Set(); |
|
Дело в том, что мне нельзя вызывать класс server_klient через new. иначе нарушается логика программы.
но класс Functions должен наверное понимать, что где то этот класс создается.(при подключении TCP клиента.) Как грамотно сделать? Что бы передавать в ходе работы одного класса в другой?
Так как вызываю я пишет что Use of unassigned local variable 's_k' . Заранее благодарю )