Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2009, 09:33   #1
marina15056
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 68
По умолчанию Долгое нажатие клавиши в KeyDown как одно нажатие

Приветствую всех

У меня такой вопрос:

Есть процедура

Цитата:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);

begin
MMplay.FileName:=inttostr(key)+'.wa v';
MMplay.Open;
MMplay.Play;
inc(i)
end;
всё работает как часы, только как сделать, что бы, если клавишу не отпускать, то это считалось как одно нажатие, и звук не начинался каждый раз снова, и счетчик с глобальной переменной не накручивался и увеличивался только один раз при каждом нажатии, независимо от времени этого самого нажатия.

Сорри что так путанно, старалась как можно доходчивей.

И еще, почему когда курсор в edit и нажимаешь клавишу "энтер", то появляется звуковой сигнил? Как его отключить, что бы procedure TForm1.EditKeyDown реагировал на нажатие энтера без звука?

Большое спасибо за помощь
marina15056 вне форума Ответить с цитированием
Старый 25.07.2009, 11:39   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Вводим глобальную переменную, например назовем ее _KeyDown, типом boolean, т.е. _KeyDown:boolean и при создании формы ее обнулим _KeyDown:=false;. Теперь изменим твою процедуру :
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
  if not _KeyDown then // выполняем операции только если наш флаг-переменная выключена
  begin
    MMplay.FileName:=inttostr(key)+'.wav';
    MMplay.Open;
    MMplay.Play;
    inc(i)
  end;
  _KeyDown:=true;// включили переменную т.к. клавишу нажали и обязательно после выполнения наших операций
end;

// вводим еще функцию "отжатия" клавиши
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
  _KeyDown:=false;// здесь просто "выключаем" наш флаг - переменную
end;

Цитата:
И еще, почему когда курсор в edit и нажимаешь клавишу "энтер", то появляется звуковой сигнил? Как его отключить, что бы procedure TForm1.EditKeyDown реагировал на нажатие энтера без звука?
Нетривиальный способ из букваря :
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if ((UpCase(Key) < 'A') or (UpCase(Key) > 'Z')) then Key := #0;
end;
т.е. здесь мы ограничиваемся вводом знаков латинского алфавита, а все "остальное" получит на выходе код #0 - пустой символ, т.е. на все остальные клавиши не будет ни звука ни действия. Все что тебе нужно это расширить диапазон "разрешенных" символов для твоего Edit`а
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if  Key = #13 then Key := #0;// если нажата Enter - молчать и ничего не делать..
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 25.07.2009, 11:48   #3
marina15056
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
Вводим глобальную переменную, например назовем ее _KeyDown, типом boolean, т.е. _KeyDown:boolean и при создании формы ее обнулим _KeyDown:=false;. Теперь изменим твою процедуру :
Всё гениальное просто, огромное спасибо.

А со вторым советом я что-то не "вкурила", но сейчас помучаю его. Ведь там будут не только буквы латинского алфавита, а еще и иероглифы

Ну всё равно спасибо, и вам, и всем кто не жалеет своего времени на чайников
marina15056 вне форума Ответить с цитированием
Старый 25.07.2009, 11:53   #4
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Тогда второй пример кода посмотри.
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if  Key = #13 then Key := #0;// если нажата Enter - молчать и ничего не делать..
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 25.07.2009, 12:01   #5
marina15056
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
Тогда второй пример кода посмотри.
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if  Key = #13 then Key := #0;// если нажата Enter - молчать и ничего не делать..
end;
Заработало
marina15056 вне форума Ответить с цитированием
Старый 15.08.2009, 22:42   #6
Kukkk
Форумчанин
 
Регистрация: 28.06.2007
Сообщений: 123
По умолчанию

А у меня такой пример не работает! if Key = #13 then Key := #0; ругается на несовместимость word and char, а просто if Key = 13 then Key := 0; все-равно звук остается((
Kukkk вне форума Ответить с цитированием
Старый 15.08.2009, 23:14   #7
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

To Kukkk - У Kotofff процедура KeyPress , а у Вас (видимо) KeyDown. А у этих процедур переменная Key имеет разный тип. Обратите внимание на скобки в процедурах.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 16.08.2009, 00:22   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вообще по-хорошему никаких флагов не надо, в сообщении WM_KEYDOWN уже есть вся необходимая информация

Код:
type
  TForm1 = class(TForm)
     ...
  public
    { Public declarations }
    procedure WmKeyDown(var msg: TMessage); message WM_KEYDOWN;
  end;

  ...

procedure TForm1.WmKeyDown(var msg: TMessage);
begin
  //если 30й бит lParam не равен 0, значит клавиша уже была нажата
  if msg.lParam and (2 shl 29) = 0 then
  Begin
    MMplay.FileName:=inttostr(msg.wParam)+'.wav';
    MMplay.Open;
    MMplay.Play;
    inc(i);
  end;
end;
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие клавиши (Delphi) VadEr Помощь студентам 3 08.06.2009 17:00
Как зарегестрировать нажатие произвольной клавиши по досом Артем125 Общие вопросы C/C++ 1 10.04.2009 22:52
В OleContainer документ Word, как в нем контролировать нажатие клавиши? Djonik Общие вопросы Delphi 0 16.03.2009 18:38
Как перехватить нажатие клавиши Windows? UnD)eaD)Snake Win Api 3 16.03.2009 18:21
Нажатие клавиши format Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 05.05.2008 15:25