Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 938

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

У меня возникла проблема при опросе клавиатуры.
Мне нужно в цикле опрашивать клавиатуру и при нажатии на кнопки выполнять какие-то действия. Допустим при первом нажатии на кнопку 1 - выдавать сообщение, а при повторном нажатии стирать.

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

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

Приложение:
  1. Uses Crt;
  2. Var Key : Char;
  3. I:boolean;
  4. Begin
  5.  
  6. Repeat
  7.  
  8. If KeyPressed Then Begin Key:=ReadKey;
  9.  
  10. Case Key Of
  11.  
  12. #45: Begin
  13. If I=False Then begin
  14. gotoxy(40,12);Write('******');
  15. i:=true;
  16. End;
  17. If I=true Then begin
  18. gotoxy(40,12);Write(' ');
  19. i:=fasle;
  20. End;
  21.  
  22. End;
  23.  
  24.  
  25. End;
  26. Until Key=#27;


NSS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: NSS (статус: Посетитель)
Вопрос отправлен: 21 января 2011, 11:02
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 23; последнее сообщение — 22 января 2011, 18:58; участников в обсуждении: 6.

Страницы: [1] [2] [Следующая »]

mirt.steelwater

mirt.steelwater (статус: Посетитель), 21 января 2011, 11:12 [#1]:

есть события OnKeyDown & OnKeyUp формы - используйте их
Ⓐ свобода сопротивление солидарность
Вадим К

Вадим К (статус: Академик), 21 января 2011, 11:26 [#2]:

:) смотрим внимательно, тут формы нет! тут консоль
Галочка "подтверждения прочтения" - вселенское зло.
NSS

NSS (статус: Посетитель), 21 января 2011, 11:37 [#3]:

Я бы даже сказал Pascal 7 )
min@y™

min@y™ (статус: Доктор наук), 21 января 2011, 11:54 [#4]:

Цитата (NSS):

Как мне опрашивать клавиатуру, чтобы моя программа видела когда кнопка нажата, а когда отпущена?

Чой-то мне кажется, что под TP7.0 это придётся делать через прерывания. Но за столько лет я, конечно, всё забыл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
NSS

NSS (статус: Посетитель), 21 января 2011, 11:56 [#5]:

А может тогда под делфийскую консоль что нибудь подскажите?
Или дадите пинок в нужном направлении к Ассемблеру?
min@y™

min@y™ (статус: Доктор наук), 21 января 2011, 12:15 [#6]:

Цитата (NSS):

А может тогда под делфийскую консоль что нибудь подскажите?

Программа должна быть обязательно консольной? Всё равно придётся регистрировать окно и петлю обработки сообщений.

Цитата (NSS):

Или дадите пинок в нужном направлении к Ассемблеру?

Нет, к сожалению, многое я подзабыл. Скинуть бы лет 10... Эх, молодость...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
NSS

NSS (статус: Посетитель), 21 января 2011, 13:45 [#7]:

Программа должна быть консольной. т.к. нужна высокая скорость обработки информации с LPT-порта (там оптический датчик).
Прогу я запускаю под Windows 98.
Апликашином конечно просто, но там таймер все дело портит, т.к. программа не успевает опрашивать изменения на датчике и пропускает его данные. Не помогает даже микросекундный таймер ((.
mirt.steelwater

mirt.steelwater (статус: Посетитель), 21 января 2011, 13:56 [#8]:

я вижу, что консоль
ну и что
все равно проще создать окошко и в его главной функции обрабатывать эти события
function WindowProc (WND: HWND; Msg: Cardinal; WParam: WParam; LParam: LParam) : LResult; stdcall;
    var
        Message  : TMessage;
    begin
        case Msg of
            WM_DESTROY:
            begin
                Result := 0;
                PostQuitMessage (0);
            end;
            WM_KEY_DOWN:
            begin
                Result := 0;
                //...
            end;
            WM_KEY_UP:
            begin
                Result := 0;
                //...
            end;
            else Result := DefWindowProc (WND,Msg,WParam,LParam);
        end;
        ProcessMessages;
    end;
 
...
 
            WC.cbSize := SizeOf (WC);
            WC.style := CS_HREDRAW or CS_VREDRAW;
            WC.lpfnWndProc := @WindowProc;
            WC.cbClsExtra := 0;
            WC.cbWndExtra := 0;
            WC.hInstance := hModule (M.AllocationBase); 
            WC.hIcon := 0;
            WC.hCursor := 0;
            WC.hbrBackground := COLOR_BTNFACE+1;
            WC.lpszMenuName := NIL;
            WC.lpszClassName := 'program name';
            RegisterClassEx (WC);
            WHandle := CreateWindowEx(0,
                                       WC.lpszClassName,
                                       PChar (  Format ('%s',[ WC.lpszClassName ])  ),
                                       WS_OVERLAPPEDWINDOW,
                                       0,
                                       0,
                                       0,
                                       0,
                                       0,
                                       0,
                                       WC.hInstance,
                                       nil);
Ⓐ свобода сопротивление солидарность
Вадим К

Вадим К (статус: Академик), 21 января 2011, 14:07 [#9]:

микросекундный драйвер под виндой? нет, нельзя с пользовательского приложения. виндовс не риалтайм система. Максимум, что можно выжать - это 50-100 мс. Да, не больше 0.05 секунды.
либо нужно брать dos (можно например взять freedos, который можно сделать 32битным, то есть, если все правильно сделать, то и на делфи консольное приложение запустить) или qnx.
Галочка "подтверждения прочтения" - вселенское зло.
NSS

NSS (статус: Посетитель), 21 января 2011, 14:14 [#10]:

а в FreeDos сетку трудно поднять?
А то я в Win98 решаю сразу два вопроса: есть сетка и консоль работает быстро. ))
Толяныч

Толяныч (статус: 4-ый класс), 21 января 2011, 14:20 [#11]:

Что-то непонятное - нехватает микросекундного быстродействия - и это при клавиатурном вводе? У меня не укладывается в голове человек, молотящий клаву с частотой 1 MHz.

Закинул хелпик, там по древним ОС много интересного :

http://zalil.ru/30376680
http://zalil.ru/30376687

Клавиатурного шпиона мастерим ? ;-)
Вадим К

Вадим К (статус: Академик), 21 января 2011, 14:32 [#12]:

Подымают люди. все возможно. Если сетевая ни какая то экзотическая, то очень большой шанс, что все будет поднято.
Галочка "подтверждения прочтения" - вселенское зло.
NSS

NSS (статус: Посетитель), 21 января 2011, 15:22 [#13]:

>Что-то непонятное - нехватает микросекундного быстродействия -
>и это при клавиатурном вводе? У меня не укладывается в голове
>человек, молотящий клаву с частотой 1 MHz.

В цикле с максимальной скоростью идет опрос датчика.
А клаву надо проверять в промежутках между или просто в подпрограмме меню.
mirt.steelwater

mirt.steelwater (статус: Посетитель), 21 января 2011, 15:28 [#14]:

возможно лучше опрашивать клавиатуру и снимать показания с датчика в двух параллельных потоках? На датчик выделить поток TIME_CRITICAL, а на клавиатуру LOWEST
дело в том, что если использовать сообщения windows, которые ставятся в очередь, а не прерывания, то вы ничего не пропустите даже с малым приоритетом потока опроса клавиатуры. конечно, между нажатием кнопки и событием на нее повешенным пройдет чуть больше времени - 10-15 мс, но при условии, что сообщения не теряются - не вижу зачем же так мгновенно реагировать на нажатия клавиш, ведь время срабатывания клавиши физически также порядка этой величины..
Ⓐ свобода сопротивление солидарность
NSS

NSS (статус: Посетитель), 21 января 2011, 15:52 [#15]:

Как раз опрос кнопок не требует огромного быстродействия, 100-300мс вполне достаточно, а вот опрос датчика должен происходить строго каждые 0.07мс иначе начинает пропадать информация.
Вот тут и начинается засада, Делфи постоянно тормозит, да и Windows непонятно что может творить и приостанавливать программу.
Одна надежда на Консоль, но и тут засада)))))
Вадим К

Вадим К (статус: Академик), 21 января 2011, 16:02 [#16]:

консоль работает под виндой и подчиняется всем правилам винды, как бы вы не хотели другого.
Галочка "подтверждения прочтения" - вселенское зло.
КМ

КМ (статус: Посетитель), 21 января 2011, 16:34 [#17]:

Если нужна спупер точная и быстродествующая система
без системы на железе не обойтись...
Добро пожаловать в мир микроконтроллеров...
ПЛИСов, DSP ))
mirt.steelwater

mirt.steelwater (статус: Посетитель), 21 января 2011, 17:37 [#18]:

поэтому я и предлагаю разделить задачи по потокам с разнымит приоритетами
для того, чтобы данные не терялись ваше устройство должно иметь буфер отправки данных и не просто слать их "куда подальше.. в порт", а отсылать по мере чтения и только после этого опустошать буфер, причем по-элементно и с конца
Ⓐ свобода сопротивление солидарность
Толяныч

Толяныч (статус: 4-ый класс), 21 января 2011, 23:23 [#19]:

КМ: Если нужна спупер точная и быстродествующая система
без системы на железе не обойтись...
Добро пожаловать в мир микроконтроллеров...
ПЛИСов, DSP ))

Присоединяюсь однозначно
NSS

NSS (статус: Посетитель), 22 января 2011, 15:58 [#20]:

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

Цитата:
> консоль работает под виндой и подчиняется всем правилам винды,
> как бы вы не хотели другого.

В винде от 2000 и выше программа притормаживает и теряет данные с датчика, а в винде 98 такого нет - прога работает без лагов.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.02 сек.