Совместный текстовый редактор - PullRequest
0 голосов
/ 22 марта 2012

У меня действительно раздражающая проблема: Я работаю над совместным текстовым редактором в C #, и я хочу, чтобы каждый клиент из списка редактировал общее текстовое поле, но я застрял в символах от преобразований клавиатуры. Вот код для события KeyDown:

private void downKey(object sender, KeyEventArgs e)
    {
        try
        {
            byte[] data;

            switch (e.KeyCode)
            {
                case Keys.Enter: data = Encoding.UTF8.GetBytes("enter");
                    break;
                case Keys.Back: data = Encoding.UTF8.GetBytes("backspace");
                    break;
                case Keys.Space: data = Encoding.UTF8.GetBytes("space");
                    break;
                default:


                        data = Encoding.UTF8.GetBytes(e.KeyCode.ToString().ToLower());


                    break;
            }

            TcpClient.GetStream().Write(data, 0, data.Length);

        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

Теперь каждый клиент из списка клиентов, подключенных к приложению, должен получить байтовый массив с вводом textBox.So на обратный вызов OnDataReceived каждого клиента в преобразовании этого байтового массива в строку и попытаться выполнить обновление через crossThreadDelegate текстовое поле каждого клиента.

    public void OnDataReceived(IAsyncResult asyn)
    {
        try
        {
            TcpSpecificPacket theSockId = (TcpSpecificPacket)asyn.AsyncState;
            int dataReceivedLength = theSockId.thisClient.GetStream().EndRead(asyn);
            if (dataReceivedLength != 0)
            {
               textBoxArrived.Invoke(changeCrossTextBox, new object[] {Encoding.UTF8.GetString(theSockId.dataBuffer, 0, dataReceivedLength)});

               WaitForData();
            }
        }
        catch (IOException)
        {

        }

А теперь определение делегата crossThread:

    private void changeCrossTextBox(string mesaj)
    {

        if (mesaj.Equals("enter"))
        {
            textBoxArrived.Text += Environment.NewLine;
        }
        else if (mesaj.Equals("space"))
        {
            textBoxArrived.Text += " ";

        }
        else if (mesaj.Equals("backspace"))
        {
            textBoxArrived.Text = textBoxArrived.Text.Substring(0, textBoxArrived.Text.Length - 1);
        }
        else
        {
            textBoxArrived.Text += mesaj;
        }
    }

Но моя настоящая проблема заключается в следующем: я не могу точно определить escape-символы, потому что я отправил байтовый массив, я конвертирую его в строку, а затем пытаюсь обновить textBox каждого клиента этой строкой. Например, когда я нажимаю клавишу Shift, строка во всем TextBox клиента будет «shiftKey». Можете ли вы сказать мне, пожалуйста, как обращаться с этими управляющими символами? Есть ли метод для отправки и обновления в ASCII.

1 Ответ

0 голосов
/ 22 марта 2012

Я не уверен на 100%, что задает ваш вопрос, но если вы хотите отфильтровать строку, содержащую неконтрольные символы, вы можете использовать это - если вы измените свой код, чтобы использовать событие OnKeyPress из OnKeyDown:

if(!char.IsControl(e.KeyChar))
{
    //Do Stuffz
}

Существует множество вещей для тестирования кодов клавиш на объекте 'char', который вы можете использовать.

char.IsLetterOrDigit, char.IsPunctuation .. и т. Д.

...