2013-04-26 43 views
0

我有一个Windows应用程序,它使用串行端口向微处理器发送消息和从微处理器接收消息。如何访问此方法中的变量

该应用程序工作正常,做什么应该做的。现在,我需要对从串行接收的数据进行一些阐述,我想在SetText方法中访问变量“value”。 如何从其他方法或类访问该变量的内容? 感谢您的帮助。

delegate void SetTextCallback(string text); 
    private void SetText(string text) 
    { 
     if (this.txtOutput.InvokeRequired) 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      this.BeginInvoke(d, new object[] { text }); 


     } 
     else 
     { 
      txtOutput.AppendText(text); 
     } 



     // capture messages from serial port 
     if (txtOutput.Text.Length > 0) 
     { 
      MatchCollection mc = Regex.Matches(txtOutput.Text, @"(\+|-)?\d+"); 
      if (mc.Count > 0) 
      { 
       long value = long.Parse(mc[mc.Count - 1].Value); 


       if (value > 1 && value < 1000) 
       { 
        textBox2.Text = value.ToString(); 
       } 
       else if (value < 2000 && value > 1000) 
       { 
        value = value - 1000; 
        textBox3.Text = value.ToString(); 
       } 

      } 
     } 
    } 
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 

     try 
     { 
      SetText(serialPort1.ReadExisting()); 
     } 

     catch (Exception ex) 
     { 
      SetText(ex.ToString()); 
     } 

    } 
+0

通过传递它,或使其公开或使其他方法/类别可达到。 – Patashu 2013-04-26 10:42:51

+2

公开财产? – DGibbs 2013-04-26 10:43:04

+0

创建一个属性是全球.. – pordi 2013-04-26 10:43:58

回答

0

这是我做了什么,这是现在working.Thanks给大家的好建议。我很确定,我将尽快在应用程序的其他开发中使用您的示例。

internal long value; 
     private void SetText(string text) 
     { 
      if (this.txtOutput.InvokeRequired) 
      { 
       SetTextCallback d = new SetTextCallback(SetText); 
       this.BeginInvoke(d, new object[] { text }); 


      } 
      else 
      { 
       txtOutput.AppendText(text); 
      } 
      // capture messages from serial port 
      if (txtOutput.Text.Length > 0) 
      { 
       MatchCollection mc = Regex.Matches(txtOutput.Text, @"(\+|-)?\d+"); 

       if (mc.Count > 0) 
       { 
        value = long.Parse(mc[mc.Count - 1].Value); 
        if (value > 1 && value < 1000) 
        { 
         textBox2.Text = value.ToString(); 
        } 
        else if (value < 2000 && value > 1000) 
        { 
         value = value - 1000; 
         textBox3.Text = value.ToString(); 
        } 

       } 
      } 
     } 
1

您可以通过访问其他类变量“静态”变量或实例变量

public class Demo1 
{ 
    //Static variable can be accessed without instantiating an instance of Demo1 
    public static int Number;  //Demo1.Number 
    public string Info {get;set;} 
} 

public class AnotherClass 
{ 
    void DoSth() 
    { 
     Demo1.Number ++; 
    } 
} 

,或者如果你有demo1的实例,说demo1Instance

demo1Instance.Info="Sth you like"; 
+0

谢谢你的例子,但我无法使用它。你能对我的代码做一个实际的例子吗? – FeliceM 2013-04-26 11:11:04

+0

现在正在工作。感谢大家的支持。 – FeliceM 2013-04-26 14:50:04

2

考虑这个:

设为财产

public long Value { get; set; } 

在您的代码中使用此代码。

if (txtOutput.Text.Length > 0) 
     { 
      MatchCollection mc = Regex.Matches(txtOutput.Text, @"(\+|-)?\d+"); 
      if (mc.Count > 0) 
      { 
       value = long.Parse(mc[mc.Count - 1].Value); 


       if (value > 1 && value < 1000) 
       { 
        textBox2.Text = value.ToString(); 
       } 
       else if (value < 2000 && value > 1000) 
       { 
        value = value - 1000; 
        textBox3.Text = value.ToString(); 
       } 

      } 

如果您想确保此属性保留其值,则使用静态值。

public static long Value { get; set; } 
+0

@ PradipKT,考虑我是初学者。你在哪里放置公共静态长值{get;组; }? SetText之外不起作用。 – FeliceM 2013-04-26 11:01:10

+0

紧接着类声明 – pordi 2013-04-26 12:40:03

2

如果数据将要使用一个以上的地方,那么不要犹豫,只需要创建一个类是这些方法之间共享输出变量的列表。为该类中的变量创建属性。现在为全局类创建一个对象,并将检索到的值从微处理器分配给这个全局声明对象中的属性。你可以在任何地方访问它。由于这是一个Windows应用程序,数据将保留,直到您清除或应用程序关闭。

这是代码。我在Windows应用程序中有一个文本框和两个按钮。一个按钮用于获取数据,另一个用于显示数据。数据是使用文本框从用户获得的。在点击显示数据按钮获取数据后,它将显示推送到对象的数据的次数。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
    { 
public partial class Form1 : Form 
{ 
    // Declare Global Variable 
    DataHolder objDataHolder = new DataHolder(); 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // Here use your code to load the data retrieved from Microprocessor 
     objDataHolder.UserData = txtUserData.Text; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show(objDataHolder.UserData); 
    } 
} 

// Class to hold Data 
public class DataHolder 
{ 
    // Here have a list variables that you need to maintain that are retrieved from Microrocessor. 
    private string _userdata = string.Empty; 

    // Here have a list Properties that you need to maintain that are retrieved from Microrocessor. 
    public string UserData 
    { 
     get 
     { 
      return _userdata; 
     } 
     set 
     { 
      _userdata = value; 
     } 
    } 
} 

}

+0

谢谢,这个概念很明确,但我需要一个关于我的代码的实例。我是一个初学者,为了完成这个任务而奋斗。 – FeliceM 2013-04-26 11:13:28

+0

非常感谢。我将更改我的代码以包含您编码的功能。再次感谢,真的很感谢。 – FeliceM 2013-04-26 12:15:12

+0

随时欢迎FeliceM – 2013-04-26 12:17:02