Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить TShiftState который в OnMouseDown используется ? [D7]


Enabled ©   (2005-01-09 01:52:00) 

Я хочу его значения в таймере использовать. Просто он удобнее, чем опрашивать клавиатуру и мышь по отдельности.


Благодарный пользователь   (2005-01-21 04:01:00) [1]


> ЮЮ ©   (17.01.05 04:25) [12]

Спасибо, ЮЮ !


ЮЮ   (2005-01-17 04:25:00) [2]


procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
 Shift: TShiftState);
begin
 if not (csNoStdEvents in ControlStyle) then
   with Message do
     if (Width > 32768) or (Height > 32768) then
       with CalcCursorPos do
         MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
     else
       MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;

Итак, обработчик соообщения Windows DoMouseDown формирует привычный для VCL TShiftState, и вызывает метод MouseDown, который вызывает уже знакомый обработчик OnMouseDown:

procedure TControl.MouseDown(Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;


Enabled   (2005-01-17 03:02:00) [3]


> ЮЮ ©   (13.01.05 07:16) [9]
>  Если уж хочещь TShiftState, то и делай как в VCL, благо
> код доступен, обрабаьывая соответствующие сообщения Windows

А где этот код, который доступен ? Можно его сюда запостить ?


asafr   (2005-01-13 12:02:00) [4]

Ну а так? Зачем Timer-то?
 public
   procedure WMLBUTTONDBLCLK (var Message: TMessage); message WM_LBUTTONDBLCLK;
   { Public declarations }
 end;
.........
.........
implementation
{$R *.dfm}
procedure TForm1.WMLBUTTONDBLCLK(var Message: TMessage);
begin
Label1.Caption:='Ура!';
end;


ЮЮ   (2005-01-13 07:16:00) [5]

>Ну, так сделай для ssDouble, если можно.

Типа DoubleClick по таймеру обнаружить? :) Если уж хочещь TShiftState, то и делай как в VCL, благо код доступен, обрабаьывая соответствующие сообщения Windows, а не опрашивая устройства в таймере


Enabled   (2005-01-13 06:57:00) [6]


> Gero ©   (12.01.05 17:18) [7]
> if GetKeyState(VK_SHIFT) < 0

Надо не VK_SHIFT, а TShiftState, в котором много параметров.


> asafr ©   (12.01.05 12:18) [6]
> аналогии можно поступить с остальными кнопками, описаными
> в TShiftState...

Ну, так сделай для ssDouble, если можно.


Gero   (2005-01-12 17:18:00) [7]

if GetKeyState(VK_SHIFT) < 0


asafr   (2005-01-12 12:18:00) [8]

Вот пример функции, отлавливающей нажатие Shift и заталкиваешь в обработку таймера. По аналогии можно поступить с остальными кнопками, описаными в TShiftState...

function TForm1.ShiftKeyDown : boolean;
begin
result:=(Word(GetKeyState(VK_SHIFT)) and $8000)<>0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if ShiftKeyDown then Label1.Caption:='Ура!';
end;


begin...end   (2005-01-12 08:56:00) [9]

> [4] Enabled   (12.01.05 01:34)

Тогда попробуйте GetKeyboardState.


Enabled   (2005-01-12 01:34:00) [10]

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


Дмитрий В. Белькевич   (2005-01-09 06:12:00) [11]

F1?


Enabled   (2005-01-09 02:46:00) [12]

function GetAsyncKeyState(vKey: Integer): SHORT; stdcall;

И что это ? Какой vKey ей посылать ? И как ею воспользоваться вообще ?


Kerk   (2005-01-09 01:53:00) [13]

GetAsyncKeyState


Наверх

Титульная страница Поиск, карта сайта Написать письмо