字符串构建和表单组件访问

时间:2016-04-25 20:51:18

标签: c#

背景

我正在编写一个程序,它收集不同的事件(按键,鼠标位置等)并将单个字符串发送到串行端口。 程序的一小部分,其中按下一个键,以控制移动(前进 - W键;左 - A键,前左 - WA键)。 当事件发生时,将调用一个方法,该方法在FinalStringClass类中获取数字字符串和进程。在主窗体上,有一个方法,它将收集的值分配给标签。 但是,由于缺乏编程经验,我遇到了代码问题:(

主要表格:

    Serial port;
    FinalStringClass fstr;
    public Form1()
    {
        InitializeComponent();
        //... Serial port settings
        timer.Start();
        fstr = new FinalStringClass(UpdateLabel2);
    }

    public void UpdateLabel2(string x, string y, string speed, string mvm) //
    {
        label2.Text = "x: " + x + "y: " + y + "speed: " + speed + "mvm: " + mvm;
    }
    private void timer_Tick(object sender, EventArgs e)
    {
        var up = KeyboardInfo.GetKeyState(Keys.W);
        var down = KeyboardInfo.GetKeyState(Keys.S);
        var left = KeyboardInfo.GetKeyState(Keys.A);
        var right = KeyboardInfo.GetKeyState(Keys.D);

        if (left.IsPressed)
        {
            if (up.IsPressed == true) // if W and A keys are pressed, ->
            {
                fstr.mvmMethod("7"); // this method is triggered
                return;
            }
            if (down.IsPressed)
            {
                fstr.mvmMethod("9");
                return;
            }
            if (right.IsPressed)
            {

                fstr.mvmMethod("1");
                return;
            }

            fstr.mvmMethod("4"); //if W key is pressed, then this method is triggered
        }
        //... (other if condition statements)

        label2.Text = fstr.FinalStringBuilder();
        port.Write(fstr.FinalStringBuilder());
    }

外部课程:

class FinalStringClass
{
    private Action<string, string, string, string> updateLabel2;
    Action<String> _x, _y, _speed, _mvm;
    string xF, yF, speedF, mvmF;

    public FinalStringClass(Action<string, string, string, string> updateLabel2)
    {
        this.updateLabel2 = updateLabel2;
    }

    public FinalStringClass(Action<String> x, Action<String> y, Action<String> speed, Action<String> mvm)
    {
        _x = x;
        _y = y;
        _speed = speed;
        _mvm = mvm;
    }

    public void xMethod(string x)
    {
        _x(x);
        xF = x;
    }
    public void yMethod(string y)
    {
        _y(y);
        yF = y;
    }
    public void speedMethod(string speed)
    {
        _speed(speed);
        speedF = speed;
    }
    public void mvmMethod(string mvm)
    {
        _mvm(mvm);
        mvmF = mvm;
    }
    public string FinalStringBuilder()
    {
        return xF + yF + speedF + mvmF;
    }
}

使用单个参数时,一切正常。但处理多个参数会导致问题:(

使用单个参数(完整工作代码)的示例:

主要表格

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FFApp
{
    public partial class Form1 : Form
    {
        SerialPort port;
        MyClass outside;
        public Form1()
        {
            InitializeComponent();
            timer.Start();
            outside = new MyClass(UpdateLabel);
        }
        public void UpdateLabel(string str)
        {
            label1.Text = str;
        }
        private void init()
        {
            port = new SerialPort();
            port.PortName = "COM1";
            port.BaudRate = 115200;

            try
            {
                port.Open();
            }
            catch (Exception e1)
            {

                MessageBox.Show(e1.Message);
            }
        }

        public struct KeyStateInfo
        {
            private Keys key;
            private bool isPressed;
            private bool isToggled;

            public KeyStateInfo(Keys key, bool ispressed, bool istoggled)
            {
                this.key = key;
                isPressed = ispressed;
                isToggled = istoggled;
            }

            public static KeyStateInfo Default
            {
                get
                {
                    return new KeyStateInfo(Keys.None, false, false);
                }
            }

            public Keys Key
            {
                get { return key; }
            }

            public bool IsPressed
            {
                get { return isPressed; }
            }

            public bool IsToggled
            {
                get { return isToggled; }
            }
        }
        private void timer_Tick(object sender, EventArgs e)
        {
            var up = KeyboardInfo.GetKeyState(Keys.W);
            var down = KeyboardInfo.GetKeyState(Keys.S);
            var left = KeyboardInfo.GetKeyState(Keys.A);
            var right = KeyboardInfo.GetKeyState(Keys.D);
            Keyboard kb = new Keyboard();

            if (left.IsPressed)
            {
                if (up.IsPressed == true)
                {                    
                    outside.MyMethod("7");
                    return;
                }
                if (down.IsPressed)
                {
                    outside.MyMethod("9");
                    return;
                }
                if (right.IsPressed)
                {
                    outside.MyMethod("1");
                    return;
                }
                outside.MyMethod("4");
            }

            if (right.IsPressed)
            {
                if (up.IsPressed)
                {
                    outside.MyMethod("6");
                    return;
                }
                if (down.IsPressed)
                {
                    outside.MyMethod("8");
                    return;
                }
                if (left.IsPressed)
                {
                    outside.MyMethod("1");
                    return;
                }
                outside.MyMethod("5");
            }

            if (up.IsPressed)
            {
                if (left.IsPressed)
                {
                    outside.MyMethod("7");
                    return;
                }
                if (right.IsPressed)
                {
                    outside.MyMethod("6");
                    return;
                }
                if (down.IsPressed)
                {
                    outside.MyMethod("1");
                    return;
                }
                outside.MyMethod("2");
            }

            if (down.IsPressed)
            {
                if (left.IsPressed)
                {
                    outside.MyMethod("9");
                    return;
                }
                if (right.IsPressed)
                {
                    outside.MyMethod("8");
                    return;
                }
                if (up.IsPressed)
                {
                    outside.MyMethod("9");
                    return;
                }
                outside.MyMethod("3");

            }

            if (!right.IsPressed && !left.IsPressed && !up.IsPressed && !down.IsPressed)
            {
                outside.MyMethod("1");
            }
       } 
        public class KeyboardInfo
        {
            [DllImport("user32")]
            private static extern short GetKeyState(int vKey);

            private KeyboardInfo()
            {

            }

            public static KeyStateInfo GetKeyState(Keys key)
            {
                short keyState = GetKeyState((int)key);
                int low = Low(keyState), high = High(keyState);
                bool toggled = low == 1;
                bool pressed = high == 1;
                return new KeyStateInfo(key, pressed, toggled);
            }

            private static int High(int keyState)
            {
                return keyState > 0 ? keyState >> 0x10
                        : (keyState >> 0x10) & 0x1;
            }

            private static int Low(int keyState)
            {
                return keyState & 0xffff;
            }
        }
    }
}

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FFApp
{
    class MyClass
    {
        Action<String> labelSetter;

        public MyClass(Action<String> labelSetter)
        {
            this.labelSetter = labelSetter;
        }
        public string MyProperty { get; set; }

        public void MyMethod(string text)
        {
            labelSetter(text);
            MyProperty = text;
        }
    }
}

或者是否可以在此代码中获取更改值(存储在变量中),当按下W / A / D / S / W + A / W + D等键时,为了允许构建最终字符串?例如:string finalstring = x + y + speed + pressed_key;

0 个答案:

没有答案