Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.01.2014, 19:28
Аватар для casperock
casperock casperock вне форума
Прохожий
 
Регистрация: 23.09.2010
Адрес: Україна, Єнакієве
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
Радость Обработка нажатия и отпускания клавиш

Доброго времени суток всем.
Есть такой вопрос. К примеру, есть батон на форме, когда на нее нажимаешь - воспроизводиться файл, когда отпускаешь - воспроизведение прекращается. Это в общем не проблема, мышкой я сделал это через события OnMouseDown и OnMouseUp, сделать управление кнопкой через стрелочку на клавиатуре не выходит. Вот пример кода, который почемуто работает при нажатии Ctrl.

Код:
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if GetKeyState(VK_LEFT) <> 0 then
MediaPlayer1.FileName:='1.mp3';
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

Windows 7, Delphi 7.
Заранее благодарю за помощь.
__________________
"Если бы выборы и голосование приводили к положительному результату и радующим население переменам, их давно уже объявили бы противозаконными!"
Лайэм Галлахер
Ответить с цитированием
  #2  
Старый 04.01.2014, 21:03
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от casperock
Вот пример кода, который почемуто работает при нажатии Ctrl.

Код:
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if GetKeyState(VK_LEFT) <> 0 then
MediaPlayer1.FileName:='1.mp3';
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
Заключи в операторные скобки begin..end всё что должно выполниться при выполнении условия.
Ответить с цитированием
  #3  
Старый 05.01.2014, 22:30
Аватар для casperock
casperock casperock вне форума
Прохожий
 
Регистрация: 23.09.2010
Адрес: Україна, Єнакієве
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Заключи в операторные скобки begin..end всё что должно выполниться при выполнении условия.
Спасибо, но все равно не помогло. Вот весь код с импровизацией:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MPlayer, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    MediaPlayer1: TMediaPlayer;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Button1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MediaPlayer1.FileName:='1.mp3';
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MediaPlayer1.Stop;

end;

procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if GetKeyState(VK_LEFT) <> 0 then
begin;
MediaPlayer1.FileName:='1.mp3';
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
MediaPlayer1.Stop;
end;

end.
__________________
"Если бы выборы и голосование приводили к положительному результату и радующим население переменам, их давно уже объявили бы противозаконными!"
Лайэм Галлахер
Ответить с цитированием
  #4  
Старый 06.01.2014, 01:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Похоже здесь всё дело в повторах нажатия клавиши - даже при отпускании из буфера клавы идёт повтор на запуск, попробуйте вот так
Код:
var flg: boolean = true;
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if GetKeyState(VK_LEFT) <> 0 then flg:= true;
end;

procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
 if flg then
  begin
   MediaPlayer1.FileName:='1.mp3';
   MediaPlayer1.Open;
   MediaPlayer1.Play;
  end;
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  flg:= false;
 MediaPlayer1.Stop;
end;
не проверял, нечем, но так должно сработать

З.Ы. Косяк только сейчас заметил -

вместо
Код:
if GetKeyState(VK_LEFT) <> 0 then flg:= true;
нужно
Код:
if Key = VK_LEFT then flg:= true;

Последний раз редактировалось Alegun, 06.01.2014 в 02:08.
Ответить с цитированием
  #5  
Старый 06.01.2014, 02:06
Аватар для casperock
casperock casperock вне форума
Прохожий
 
Регистрация: 23.09.2010
Адрес: Україна, Єнакієве
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Похоже здесь всё дело в повторах нажатия клавиши - даже при отпускании из буфера клавы идёт повтор на запуск, попробуйте вот так
Код:
var flg: boolean = true;
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if GetKeyState(VK_LEFT) <> 0 then flg:= true;
end;

procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
 if flg then
  begin
   MediaPlayer1.FileName:='1.mp3';
   MediaPlayer1.Open;
   MediaPlayer1.Play;
  end;
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  flg:= false;
 MediaPlayer1.Stop;
end;
не проверял, нечем, но так должно сработать
Спасибо, попробовал. К сожалению не подошло, с мышки все работает отлично. А вот если зажать любую стрелочку на клавиатуре во время работы программы, никаких действий не происходит. А как только отпускаешь зажатую стрелочку - вылазит ошибка "No MCI device open". Как я понимаю, то что я отпустил кнопку программа видит и реагирует вот так:
Код:
procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
flg:= false;
MediaPlayer1.Stop;
end;
Но вылазит ошибка, т.к. программа почему-то не понимает когда я нажимаю клавишу, но отлично понимает когда я её отпускаю и соответственно дает команду компоненту TMediaPlayer прекратить воспроизведение трека, а компонент не понимает что от него хотят и выдает ерорр =((
__________________
"Если бы выборы и голосование приводили к положительному результату и радующим население переменам, их давно уже объявили бы противозаконными!"
Лайэм Галлахер
Ответить с цитированием
  #6  
Старый 06.01.2014, 02:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Извнт за ляп, тогда отмена, попробуйте вот так
Код:
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then
  begin
   MediaPlayer1.FileName:='1.mp3';
   MediaPlayer1.Open;
   MediaPlayer1.Play;
  end;
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then MediaPlayer1.Stop;
end;

З.Ы. Тяжело без делфи код под неё собирать, извнт :-)

Последний раз редактировалось Alegun, 06.01.2014 в 02:25.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
casperock (06.01.2014)
  #7  
Старый 06.01.2014, 02:32
Аватар для casperock
casperock casperock вне форума
Прохожий
 
Регистрация: 23.09.2010
Адрес: Україна, Єнакієве
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Извнт за ляп, тогда отмена, попробуйте вот так
Код:
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then
  begin
   MediaPlayer1.FileName:='1.mp3';
   MediaPlayer1.Open;
   MediaPlayer1.Play;
  end;
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then MediaPlayer1.Stop;
end;

З.Ы. Тяжело без делфи код под неё собирать, извнт :-)
Спасибо за старание помочь, но увы((
Сейчас заметил такую штуку, если запустить программу и сразу нажимать стрелочки - вылазит "No MCI device open", а если нажать мышкой, а потом стрелочки - ошибки уже нет. Но и воспроизведения тоже.

Это не может быть из-за того что у меня Window 7?
__________________
"Если бы выборы и голосование приводили к положительному результату и радующим население переменам, их давно уже объявили бы противозаконными!"
Лайэм Галлахер
Ответить с цитированием
  #8  
Старый 06.01.2014, 02:42
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот ещё вариант
Код:
procedure mpc (ds: boolean);
begin
 if ds then
begin;
 Form1.MediaPlayer1.FileName:='1.mp3';
 Form1.MediaPlayer1.Open;
 Form1.MediaPlayer1.Play;
end else
 begin
 Form1.MediaPlayer1.Stop;
 Form1.MediaPlayer1.Close;
 end;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mpc(true)
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mpc(false);
end;

procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then mpc(true);
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then mpc(false);
end;
будет работать?
Ответить с цитированием
  #9  
Старый 06.01.2014, 02:56
Аватар для casperock
casperock casperock вне форума
Прохожий
 
Регистрация: 23.09.2010
Адрес: Україна, Єнакієве
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Вот ещё вариант
Код:
procedure mpc (ds: boolean);
begin
 if ds then
begin;
 Form1.MediaPlayer1.FileName:='1.mp3';
 Form1.MediaPlayer1.Open;
 Form1.MediaPlayer1.Play;
end else
 begin
 Form1.MediaPlayer1.Stop;
 Form1.MediaPlayer1.Close;
 end;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mpc(true)
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mpc(false);
end;

procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then mpc(true);
end;

procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then mpc(false);
end;
будет работать?
Так же как и раньше. Только с отличием, теперь ошибка вылазить только на левую стрелку, а не на все стрелки как раньше. Но суть та же, ошибка((
__________________
"Если бы выборы и голосование приводили к положительному результату и радующим население переменам, их давно уже объявили бы противозаконными!"
Лайэм Галлахер
Ответить с цитированием
  #10  
Старый 06.01.2014, 04:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Возможное решение
1. Не используйте TButton, лучше напр. ТSpeedButton т.к. у него нет фокуса (по умолчанию Tab и стрелки переключают фокус между визуальными компонентами его имеющими)
2. Используйте процедуры Key/Mouse/Down/App у самой формы, код будет примерно такой
Код:
var flg: boolean = true;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then
  begin
   if flg then
    begin
     MediaPlayer1.FileName:='1.mp3';
     MediaPlayer1.Open;
     flg:=false;
    end;
   MediaPlayer1.Play;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_LEFT then
  begin
   MediaPlayer1.Close;
   flg:=true;
  end;
 end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MediaPlayer1.FileName:='1.mp3';
 MediaPlayer1.Open;
 MediaPlayer1.Play;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MediaPlayer1.Close;
end;
выходит не нужно каждый раз открывать MCI интерфейс проигрывателя, наверное так
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
casperock (06.01.2014)
  #11  
Старый 06.01.2014, 05:20
Аватар для casperock
casperock casperock вне форума
Прохожий
 
Регистрация: 23.09.2010
Адрес: Україна, Єнакієве
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Огромное спасибо!) Отлично помогло, буквально за 20 минут уже готовое решение.
__________________
"Если бы выборы и голосование приводили к положительному результату и радующим население переменам, их давно уже объявили бы противозаконными!"
Лайэм Галлахер
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025