| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > Проблема с считыванием баркода |
| Автор: shark1 29.11.2007, 10:50 | ||
Помогите плиззз.Такая проблемка,сделал програмку для склада,прога работает так,загружается фаил в лист бокс,и потом человек в текст бокс считывает баркод с детали,если такой имеется то он стирается из файла если нет то Wrong!!!.Проблема в следующем,когда человек считывает баркод то это происходит очень медленно,а должно быть как пуля.Подскажите в чем проблема,где ошибка(за код сильно не ругайте,знаю что он корявенький).Зарание спасибо.Код:
|
| Автор: shark1 29.11.2007, 14:17 | ||||||
Попробовал сделать вот так :
|
| Автор: 1stain 29.11.2007, 14:32 |
| shark1, ужасно извеняйусь за свою непроходимую тупость, но где в коде собственно считывание баркода? |
| Автор: shark1 29.11.2007, 14:44 |
| Попробовал сделать вот так : if ((textBox1.Text.Length == lstFile.Items[i].ToString().Length) && (textBox1.Text.ToLower() == lstFile.Items[i].ToString().ToLower())) разделил проверки,ну еще чуток быстрее но все равно не то.Подскажите,спасибо. To 1stain : это не ты должен грешить на тупость а я,так что ... а баркод считывается здесь: textBox1.Text.ToLower() т.е у человека есть деталь с баркодом,и он с помощью баркод пистоля считывает баркод в textBox1.Спасибо. |
| Автор: 1stain 29.11.2007, 15:55 | ||
| все равно не ясно, как происходит считывание баркода, ну да бог с ним. имхо, лучше прочитать все строки из файла в List<String>, который биндим к контролу ListBox. Затем при получении новой строки с ридера он как я понял загоняется в текстбокс (Readonly), по событию TextChanged которого делаем
вобщем, примерно так з.ы. снова имхо: такие вещи лучше делать не через файлы, а через базы данных. |
| Автор: shark1 29.11.2007, 18:02 |
| Спасибо огромное за пример,только я его не могу к своему прикрутить.Если возможно и это не будет наглостью,можно я пришлю свой пример а вы его посмотрите пожалуста.Спасибо огромное. |
| Автор: shark1 3.12.2007, 16:56 |
| 1stain помоги плиззз,замучился,не выходит не чего .Уже и так и так пробовал.Как сделать так чтоб textBox получал полный стринг,а то при вводе так выглядет что происходит проверка каждой цифры.Помоги плиззз.Спасибо. |
| Автор: shark1 3.12.2007, 18:04 |
| ivashkanet ты прав 100%,так оно и задуманно чтоб человек не нажимал на Enter,но как ускорить считывание и проверку :( Как этого добится(Решение -- ждать интер и запускать метод только после этого, как во втором обработчике).Совсем мне плохо ,подскажите,спасибо. |
| Автор: ivashkanet 3.12.2007, 18:13 |
| shark1, а длина этого баркода не постоянна? Есть же стандарты... Добавлено через 3 минуты и 56 секунд Если не постоянна -- могу предложить ХАК (сразу говорю, это решение мне не нравится). Он заключается в том, что мы будем немножко ждать, прежде чем искать элемент в базе. Ждать, допустим, 0.1 сек. Это не совсем просто сделать (не создавая второй поток). Понадобиться флаг, цикл (ждущий 0,1 сек и выполняющий в себе Application.DoEvents()) |
| Автор: shark1 3.12.2007, 18:25 |
| ivashkanet длина баркода не постоянна,ну и если можешь давай попробуем,может так и будет нормально.Спасибо. |
| Автор: 1stain 3.12.2007, 18:28 | ||
если сканер при окончании ввода имитирует нажатие кнопки энтер в текстбоксе, то зачем в таком случае обработчик TextChanged?
|
| Автор: shark1 3.12.2007, 18:28 |
| ivashkanet если у тебя есть возможность посмотри мой пример,может ты подскажеш что не так.Спасибо. |
| Автор: ivashkanet 3.12.2007, 18:34 | ||||
Держи:
Добавлено через 1 минуту и 44 секунды
Меняя "сотню" нужно добиться, чтобы скан успевал произойти и пользователь не заметил задержки |
| Автор: shark1 3.12.2007, 19:24 | ||||
ivashkanet спасибо зделал как ты предложил :
но почемуто застряёт сдесь :( Выкидывает на Form_Wrong .
Добавлено через 9 минут и 51 секунду ivashkanet вот в чем проблема,он дает мне считать первый баркод,а на втором показывает ошибку :( ,подскажи,спасибо. |
| Автор: shark1 3.12.2007, 19:46 | ||
ivashkanet я код чуток поменял местами :
вроде бы побыстрее работает.Спасибо. |
| Автор: ivashkanet 3.12.2007, 19:55 | ||
Совсем не должно работать. Так как ты в любом случае ищешь элемент в таблице.
Рассказывай логику работы. По действиям: навели курсор туда-то, ввели баркод, нажали интер, удалили то что есть, ввлеи еще один... |
| Автор: shark1 3.12.2007, 20:36 |
| Логика такая,есть база в текстовом файле,загружаю ее в лист бокс,затем человек начинает считывать баркоды,должен считывать быстро,потому что это для склада прога,если он считывает и все правильно то номер кот. совпадает стирается из лист бокса и вносится в следующий(во временный),а если нет такого номера в лист боксе то Wrong !!!.В конце если все ок,то есть нопка ,нажал и все что было в временном текст боксе загружается в Access,а из текстового файла(из базы) стирается.Спасибо. |
| Автор: ivashkanet 4.12.2007, 08:40 |
| Так, бизнеслогика понятна. Меня интересует нажимается ли что-нить между двумя считываниями? Или они идут просто один за другим, а в случае если прога не реагирует пользователь нажимает интер чтобы сказать: "да, я ввел баркод, думай собака"? Тогда мой ХАК не подойдет (он работает только при одиночных считываниях). Есть еще идея: при формировании списка слов: а) можно вычислить всевозможные длины нужных баркодов и перед посимвольной проверкой сравнивать длину строки, а уже потом искать есть ли она. б) Вместо преребора всех значений листа лучше воспользоваться методом: lstFile.Items.IndexOf(textBox1.Text.ToLower()), учитывая то, что в списке все баркоды будут приведены к нижнему регистру в) Если же предыдущий пункт не даст ощутимой прибавки, есть вариант использовать хэш таблицу, тогда поиск элемента в листе будет выглядеть так: hashedList.ContainsKey(textBox1.Text.ToLower()) Удачи |
| Автор: shark1 4.12.2007, 10:12 |
| ivashkanet да ты прав все так и работает как ты предположил(они идут просто один за другим,и ни чего не нажимается)просто я отлавливаю Enter при считывании и курсор перескакивает в другой текст бокс,и все заново считали(споймал Enter)курсор перескачил в нужное место в textBox1 . т.д. А куда это нужно вставить lstFile.Items.IndexOf(textBox1.Text.ToLower()). Спасибо. |
| Автор: ivashkanet 4.12.2007, 10:15 | ||
вместо этих строчек |
| Автор: shark1 4.12.2007, 11:05 |
| ivashkanet сделал вот так : [code=csharp] bool next = false; bool notFound = true; private bool waitingForFullBarcode = false; private void textBox1_TextChanged(object sender, EventArgs e) { if (!waitingForFullBarcode) { // Сам момент ожидания waitingForFullBarcode = true; DateTime startWaitingTime = DateTime.Now; while (((TimeSpan)(DateTime.Now - startWaitingTime)).Milliseconds < 100) { Application.DoEvents(); } waitingForFullBarcode = false; // Подождали и поехали дальше notFound = true; base.OnTextChanged(e); if (next) { next = false; } lstFile.Items.IndexOf(textBox1.Text.ToLower()); notFound = false; return;code] скорость бешанная но больше не чего не делает(не убирает номер из лист бокса,еслли такой есть и т.д).Спасибо. |
| Автор: ivashkanet 4.12.2007, 11:33 | ||||
shark1, красавец, ты еще текст своей любимой книжки (не по .Net ) сюда вставь.
Я же сказал, что это не проходит --- удаляем. Я не сказал буквально вместо. Надо было чуть подумать... lstFile.Items.IndexOf(textBox1.Text.ToLower()) -- возвращает bool: true -- нашел, false -- не нашел. Поэтому нужно проверять его ифом. Вот тебе код, должен работать:
И есть вопрос: во втором обработчике (кстати, .Net не гарантирует, что он вызовется после первого, так как не гарантирует очередность при вызове событий) ты проверяешь на "13-й" символ. Кто его вводит? |
| Автор: shark1 4.12.2007, 11:53 |
| ivashkanet я извеняюсь на этой строке :if (lstFile.Items.IndexOf(textBox1.Text.ToLower())) ругается:Cannot implicitly convert type 'int' to 'bool' и не понимает что такое i.Спасибо. P.S:"13-й" символ это Enter на клавиатуре(его ни кто не вводит).Спасибо. |
| Автор: ivashkanet 4.12.2007, 12:20 | ||
| shark1, включай думалку Ну не тещу я каждый кусок кода, что пощу Заменить на
То что это интер я знаю. Я спрашиваю почему ты его проверяешь если его никто не вводит |
| Автор: thomas 4.12.2007, 14:08 |
| ivashkanet, Держись! Мы с тобой! |
| Автор: shark1 6.12.2007, 12:58 |
| Спасибо огромное ,все отлично работает.Огромное спасибо,извените что сразу не ответил,чуток приболел. |
| Автор: ivashkanet 6.12.2007, 13:30 |
| shark1, замечательно. Заходи еще ;-) P.S. Выздоравливай thomas, мы это сделали |
| Автор: shark1 8.12.2007, 16:13 |
| ivashkanet спасибо тебе огромное, и тебе thomas:да вы это сделали.Так что всем спасибо за помощь. |