Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2

Как запретить ввод определенных символов в текстовые поля

22.02.2014, 01:14. Показов 4066. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго вечера. Есть несколько проблем, и голова уже плохо соображает, со вчерашнего дня сижу с программой...
В общем, форма, на ней 8 основных текстовых полей.
И свой класс, работающий в другом потоке.
Вопросы такие:
1. Как запретить ввод в текстовые поля все, что не относится к Hex-знакам, и все маленькие знаки одновременно. Разрешен ввод только цифр от 0 до 9 и английских больших букв от A до F. Так же желательно ограничить размер ввода в каждое поле не больше 4 знаков.
2. Как я сказал, класс работает в отдельном потоке. Есть ли возможность в процессе работы программы прервать работу потока, при этом перед прерыванием сохранить значение свойства из класса (типа строка)?

ПС, чтобы не было вопросов: нужен ли поток - да, нужен, программа рассчитана на очень длительную работу, в классе крутится цикл, реально длинный, и без потока приложение висит в полном ступоре.
Нужно ли прерывать поток - да, нужно, и именно с сохранением значения (в классе идет поиск данных, последовательно, и сохранение нужно для записи того значения, на котором остановили обработку, чтобы при следующем запуске начать именно с него).
Вот код формы.
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO.Ports;
using System.Reflection;
 
namespace MON08_Generator_v._1._0._0._0
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            //Обработчики событий
            this.Load+=new EventHandler(Form1_Load);
            buttonSearch.Click += new EventHandler(buttonSearch_Click);
 
            //Событие KeyPress для всех текстовых полей
            textBoxVectHi_0.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectHi_1.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectHi_2.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectHi_3.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectLow_0.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectLow_1.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectLow_2.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
            textBoxVectLow_3.KeyPress += new KeyPressEventHandler(textBox_All_KeyPress);
 
            //Событие KeyDown для всех текстовых полей
            textBoxVectHi_0.KeyDown+=new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectHi_1.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectHi_2.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectHi_3.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectLow_0.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectLow_1.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectLow_2.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
            textBoxVectLow_3.KeyDown += new KeyEventHandler(textBox_All_KeyDown);
 
            comboBoxPort.KeyPress+=new KeyPressEventHandler(comboBox_All_KeyPress);
            comboBoxBaud.KeyPress += new KeyPressEventHandler(comboBox_All_KeyPress);
 
        }
        //Загрузка формы
        private void Form1_Load(object sender, EventArgs e)
        {
            //Поиск СОМ портов. Если порты не найдены - выход из программы
            foreach (string p in SerialPort.GetPortNames())
                comboBoxPort.Items.Add(p);
            if (comboBoxPort.Items.Count == 0)
            {
                MessageBox.Show("Порты не обнаружены!", "Информация",
                    MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                this.Close();
                return;
            }
            //Иначе - заполнение списка порта и скорости
            else
            {
                comboBoxPort.Text = comboBoxPort.Items[0].ToString();
                string[] baud = { "4800", "9600", "19200", "38400" };
                foreach (string s in baud)
                    comboBoxBaud.Items.Add(s);
                comboBoxBaud.Text = comboBoxBaud.Items[0].ToString();
            }
        }
        //Запуск процедуры поиска
        private void buttonSearch_Click(object sender, EventArgs e)
        {
            //Массив векторов
            string[] vectors = GetVectors();
 
            //Предварительная проверка векторов в массиве
            foreach (var str in vectors)
            {
                if ((string.IsNullOrEmpty(str)) || (string.IsNullOrWhiteSpace(str)))
                {
                    MessageBox.Show("Ошибка ввода данных!", "Ошибка ввода",
                        MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    return;
                }
            }
 
            //Экземпляр класса
            SearchClass searcher=new SearchClass(comboBoxPort.Text,comboBoxBaud.Text,vectors);
 
            //Подключение обработчиков
            searcher.code_Found+=new Action<string>(Code_Found);
            searcher.code_NotFound+=new Action(Code_NotFound);
            searcher.read_Err+=new Action<string>(Read_Err);
            searcher.vector_FormatErr+=new Action<string>(FormatErr);
 
            //Поток поиска
            Thread searchThread = new Thread(new ThreadStart(searcher.SearchCode));
            
            //Запуск поиска в глобальном перехватчике исключений
            try
            {
                searchThread.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
                                 MessageBoxIcon.Asterisk);
                return;
            }
        }
        private void textBox_All_KeyDown(object sender, KeyEventArgs e)
        {
            
 
        }
        private void textBox_All_KeyPress(object sender, KeyPressEventArgs e)
        {
 
        }
 
        //Метод заполнения массива строк из текстовых полей
        private string[] GetVectors()
        {
            string[] res = new string[8];
            res[0] = textBoxVectLow_0.Text;
            res[1] = textBoxVectLow_1.Text;
            res[2] = textBoxVectLow_2.Text;
            res[3] = textBoxVectLow_3.Text;
 
            res[4] = textBoxVectHi_0.Text;
            res[5] = textBoxVectHi_1.Text;
            res[6] = textBoxVectHi_2.Text;
            res[7] = textBoxVectHi_3.Text;
            return res;
        }
 
        //Метод запрета редактирования полей порта и скорости
        private void comboBox_All_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }
 
        //Метод события найденного кода
        private void Code_Found(string s)
        {
            MessageBox.Show("Код найден!", "Поиск завершен",
                MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            textBoxCode.Invoke(new Action(() => textBoxCode.Text = s));
        }
        
        //Метод события не найденного кода
        private void Code_NotFound()
        {
            MessageBox.Show("Код не найден!", "Поиск завершен",
               MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
        }
 
        //Метод события при ошибке чтения (обработка исключения в потоке)
        private void Read_Err(string s)
        {
            MessageBox.Show(s,"Ошибка чтения",MessageBoxButtons.OK,
                            MessageBoxIcon.Asterisk);
        }
 
        //Метод обработки ошибки формата ввода
        private void FormatErr(string s)
        {
            MessageBox.Show(s, "Ошибка ввода данных", MessageBoxButtons.OK,
                            MessageBoxIcon.Asterisk);
        }
    }    
}
А вот код класса.
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
 
namespace MON08_Generator_v._1._0._0._0
{
    
    class SearchClass
    {
        SerialPort port;
        string[] vectors_string;
 
        //События для прогрессбара
        public event Action bar_On;
        public event Action bar_Off;
        public event Action bar_Step;
        public event Action bar_Clear;
 
        //События для результата операции (успешно/не успешно)
        public event Action<string> code_Found;
        public event Action code_NotFound;
 
        //События для обработки ошибок
        public event Action<string> vector_FormatErr;
        public event Action<string> read_Err;
 
        //Конструктор
        public SearchClass(string portname,string baudrate,string[] vectors)
        {
            port = new SerialPort(portname, int.Parse(baudrate));
            port.ReadTimeout = 500;
            vectors_string = new string[vectors.Length];
            vectors_string = vectors;
        }
 
        //Построение массива начальных векторов из строк
        private int[] GetVectors(string[] vectors_string_in)
        {
            int[] vectors = new int[8];
            //Конвертирование из строковой формы
            for (int i = 0; i < 8; i++)
            {
                vectors[i] = int.Parse(vectors_string_in[i],
                             System.Globalization.NumberStyles.HexNumber);
            }
            //Проверка на корректность ввода
            for (int i = 0; i < 4; i++)
            {
                int ind = 4;
                if (vectors[i] > vectors[i + ind])
                {
                    return null;
                }
            }
            return vectors;
        }
 
        //Основной метод поиска
        public void SearchCode()
        {
            bool code_index=false;//Индекс найденного кода
 
            using (port)
            {
                port.Open();
 
                //Получение начальных векторов
                int[] vectors = GetVectors(vectors_string);
 
                //Проверка формата векторов и выход из обработки
                if (vectors == null)
                {
                    if (vector_FormatErr != null)
                        vector_FormatErr("Ошибка ввода данных!");
                    return;
                }
 
                //Массив байт для запроса в порт
                byte[] res = new byte[8];
 
                //Генератор массива для запроса в порт
                for (int i1 = vectors[0]; i1 <= vectors[4]; i1++)
                {
                    for (int i2 = vectors[1]; i2 <= vectors[5]; i2++)
                    {
                        for (int i3 = vectors[2]; i3 <= vectors[6]; i3++)
                        {
                            for (int i4 = vectors[3]; i4 <= vectors[7]; i4++)
                            {
                                res[0] = (byte)(i1 / 0x100);
                                res[1] = (byte)(i1 % 0x100);
                                res[2] = (byte)(i2 / 0x100);
                                res[3] = (byte)(i2 % 0x100);
                                res[4] = (byte)(i3 / 0x100);
                                res[5] = (byte)(i3 % 0x100);
                                res[6] = (byte)(i4 / 0x100);
                                res[7] = (byte)(i4 % 0x100);
 
                                
 
                                //Обработка исключений по таймауту чтения и выход из метода
                                try
                                {
                                    //Метод запроса в порт, прием и анализ ответа
                                    code_index = FindCode(res);
 
                                    //Строковое представление запроса
                                    CodeFounded = GetCodeString(res);
                                }
                                catch(Exception ex)
                                {
                                    if (read_Err != null)
                                        read_Err(ex.Message);
                                    return;
                                }
 
                                //Если код найден, событие "Код найден"
                                if (code_index)
                                {
                                    if (code_Found != null)
                                        code_Found(CodeFounded);
                                    return;
                                }
                            }
                        }
                    }
                }
            }
            //Код не найден в данном диапазоне, событие "Код не найден"
            if (code_NotFound != null)
                code_NotFound();
            return;
        }
 
        //Метод работы с портом, запрос и анализ ответа
        private bool FindCode(byte[] vectors)
        {
            //Массив для получения данных
            byte[] vectorAsc = { 0x4a, 0xff, 0xf6 };
 
            port.DtrEnable = true;//Включение DTR
 
            /**********Векторный запрос**********/
            for (int i = 0; i < vectors.Length; i++)
            {
                port.DiscardInBuffer();//Сброс буфера порта
                port.Write(vectors, i, 1);//Запрос в порт
 
                //Цикл ожидания ответа
                int counter = 0;//Счетчик попыток чтения
                int size = (i == 7) ? 3 : 2;//Установка размера чтения данных
                bool readFlag = false;//Флаг успешного чтения
                do
                {
                    if (port.BytesToRead == size)
                    {
                        ReadData(size);
                        readFlag = true;
                        break;
                    }
                    else
                    {
                        Thread.Sleep(1);
                        counter++;
                    }
                }
                while (counter <= 500);
                if (!readFlag)
                    throw new TimeoutException("Устройство не отвечает!");
            }
            /**********Окончание векторного запроса*********/
 
            /**********Запрос на получение данных*********/
            byte[] data = new byte[3];
            int get_data_counter = 0;
            bool data_correct = false;
 
            //Внешний цикл, выполняется при совпадении ответа
            //При первом неверном ответе выход из цикла
            do
            {
                //Внутренний цикл, выполняется в зависимости от результата 
                //(совпадение-несовпадение, но не менее одного раза)
                for (int i = 0; i < vectorAsc.Length; i++)
                {
                    //Запрос в порт
                    port.Write(vectorAsc, i, 1);
 
                    //Ожидание получения данных
                    int counter = 0;//Счетчик попыток чтения
                    int size = (i == 2) ? 3 : 2;//Установка размера чтения данных
                    bool readFlag = false;//Флаг успешного чтения
                    do
                    {
                        if (port.BytesToRead == size)
                        {
                            if (size == 3)//Установка варианта чтения (чтение -> чтение в массив данных для анализа)
                                data = ReadData(size);
                            else
                                ReadData(size);
 
                            readFlag = true;
                            break;
                        }
                        else
                        {
                            Thread.Sleep(1);
                            counter++;
                        }
                    }
                    while (counter <= 500);
 
                    //Возврат исключения по отсутствию ответа от мк
                    if (!readFlag)
                        throw new TimeoutException("Устройство не отвечает!");
                }
 
                //Условие сравнения ответа с посланным байтом вектора
                if (data[2] != vectors[get_data_counter])
                {
                    data_correct = false;//При первом некорректном ответе выход из внешнего цикла
                    break;
                }
                //При корректном ответе продолжение опроса с изменением адреса чтения
                else
                {
                    vectorAsc[2] += 1;
                    data_correct = true;
                }
                //Увеличение счетчика
                get_data_counter++;
 
            }
            while (get_data_counter < 8);
 
            /**********Окончание запроса на получение данных**********/
 
            //Возврат true при корректном ответе, формирование строки найденного кода
            if (data_correct)
            {
                return true;
            }
 
            port.DtrEnable = false;//Отключение DTR
 
            //Возврат false если код не совпал
            return false;
        }
 
        //Метод чтения данных из порта
        private byte[] ReadData(int count)
        {
            byte[] data = new byte[count];
            for (int i = 0; i < count; i++)
            {
                data[i]=(byte)port.ReadByte();
            }
            return data;
        }
 
        //Метод формирования строки кода
        private string GetCodeString(byte[] data)
        {
            string code = string.Empty;
            for (int i = 0; i < data.Length; i++)
            {
                code = string.Concat(code, " ", data[i].ToString("X2"));
            }
            return code;
        }
 
        //Свойство для возврата найденного кода
        public string CodeFounded
        {
            get;
            private set;
        }
    }
}
Добавлено через 1 час 39 минут
Все, с текстбоксами разобрался, нарыл инфу на MSDN. А вот с потоком вопрос пока открыт, может кто подскажет, как осуществить задуманное...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2014, 01:14
Ответы с готовыми решениями:

Как запретить ввод определенных символов в несколько TextBox, не программируя каждый по отдельности
Добрый день.. Подскажите пожалуйста, как можно создать, свойство, которые бы прописывал в текстбоксы, а оно давало возможность ввода только...

Запретить ввод определенных символов
В текстовое поле можно вводить буквы лат. и рус.алфавита, пробел, дефис, цифры. В KeyPress условие if (e.KeyChar != 8 &amp;&amp;...

Как запретить ввод определенных символов?
здраствуте, как можно запретить ввод определенных символов в &quot;int main&quot; (да и в целом) ? допустим, я сделал калькулятор и мне нужно,...

2
5 / 5 / 3
Регистрация: 30.01.2014
Сообщений: 18
22.02.2014, 10:00
Для проверки текстового поля используй событие text_changed и там проверяй всё что тебе нужно, при ошибке пиши сообщение 'Неверное число' и сбрасывай поле.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.02.2014, 11:35  [ТС]
Так с текстовыми полями я уже разобрался... Великий и могучий MSDN помог...
Мне бы теперь с прерывание потока разобраться, и с сохранением значения свойства из потока...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2014, 11:35
Помогаю со студенческими работами здесь

Запретить ввод определенных символов в EDIT
Подскажите, как запретить ввод цифр 0-9 в EDIT? hWndInput = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT(&quot;EDIT&quot;), TEXT(&quot;&quot;), ...

Запретить ввод в текстовое поле определенных символов
Всем доброго дня еще раз. Как запретить ввод в текстовое всего, кроме цифр и не более 2х точек

Как запретить оставлять текстовые поля пустыми?
У меня есть прога в ней есть текстовые поля как мне сделать так чтобы когда текстовые поля оставляли пустыми, и нажимали готово то им...

Как запретить использование определенных символов в ДНС?
Собственно в теме вопрос,конкретно в моем случае, нужно запретить использование не латинских символов.

Как запретить ввод символов
Можно ли как-то запретить ввод символов в scanf(&quot;%f&quot;, &amp;qwe); т е мне надо, чтобы программа выбирала только цифры или не выполнялась, пока...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru