Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совет по вводу в Edit, Узнать что конец 
V
    Опции темы
Алкоголик
Дата 18.5.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 26.1.2004

Репутация: нет
Всего: нет



Здраствуйте.
Проблема такая есть программа где используются магниотные ридеры(для считывания дисконтных карт). Раньше эти ридеры были через COM порт и все было замечательно, а тут озадачили через USB. Никакой документации не нашел что бы программа непосредственно с ридером работала по этому пллюнул и решил делать через одно место.
Вообщем когда проводишь карточкой, то ридер работает как обычная клавиатура, по этому решил считывать в Edit. Строка такого вида ;778=153010001=160? Вот последние 160 и есть номер карты(может быть еще 5-значное число) Но возникла проблема, как мне узнать что наступил конец ввода(ридер передает не всю строку, а по одному символу), что бы начать отбор номера карты. 
Есть идеи?
 
PM MAIL   Вверх
Alexeis
Дата 18.5.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Можно в OnChange засечь время, например GetTickCount, символы поступают сравнительно равномерно, поэтому интервал между ними будет колебаться в небольших пределах, после каждого OnChange запускать таймер на время в 5-10 раз большее чем время между приходом очередного символа, если символ пришел раньше, то отменяем таймер и перезапускам. После прихода последнего символа через указанное время таймер сработает (ведь его некому будет его отменить) и в его обработчике можно смело анализировать строку.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Алкоголик
Дата 18.5.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 26.1.2004

Репутация: нет
Всего: нет



Спасибо
PM MAIL   Вверх
Akella
Дата 18.5.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Засечь среднее время ввода символов. Например 1 раз в 2 секунды проверять TEdit на наличие двух знаков равно.

Добавлено через 55 секунд
Должна быть возможность настроить ридер на паузу. Т.е. провели пропуск - пауза 2 секунды - провели пропуск - пауза 2 секунды.
PM MAIL   Вверх
dizJis
Дата 18.5.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



ИМХО, проще должно быть... После ввода последнего символа ридер "ентер" не нажимает? Либо другие спецсимволы не выводит? 
PM MAIL   Вверх
Akella
Дата 18.5.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Когда я работал со сканером штрих-кодов, то сканер "нажимал" Enter. 
Я ловил vk_return в событиях TEdit`а

К сожалению, Алкоголик не сообщил ничего по поводу Enter.
PM MAIL   Вверх
Алкоголик
Дата 22.5.2009, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 26.1.2004

Репутация: нет
Всего: нет



Да, идет Enter идет в конце. Я сделал вот так вот:
Код

procedure TFSplash.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
s,card:string;
begin
if key = 191 then begin
   num:=NumCard(Edit1.Text);
    Dcard.Text:=num;
       if Dcard.Text<>'' then  begin
        s:='';
        s:=GetDataQ('SELECT discountno FROM cardss WHERE card='+Dcard.Text);
       if s='' then s:='15';
       FSplash.EDiskontValue.Text:=s;
         FSplash.Ename.Text:=Dcard.Text+' '+GetDataQ('SELECT name FROM cardss WHERE card='+Dcard.Text);
      end;
    key:=0;
    Showmessage('');
  end;

end;





Это сообщение отредактировал(а) Алкоголик - 22.5.2009, 06:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1213 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.