Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

TShiftState   Найти похожие ветки 

 
Belorus ©   (2007-05-09 14:59) [0]

Как можно получить текущий TShiftState ?
Такой который передаётся в OnMouseMove на форме.
Можно конечно вручную написать проверку состояний нескольких клавиш, но не хотелось бы писать то что наверняка написано...

Или не написано ?


 
SergeyIT ©   (2007-05-09 15:05) [1]

А это не подходит?
SHORT GetKeyState(

   int nVirtKey  // virtual-key code
  );


 
SergeyIT ©   (2007-05-09 15:12) [2]

А в сорсах Делфи есть такая
function KeysToShiftState(Keys: Word): TShiftState;


 
X9 ©   (2007-05-09 15:14) [3]

Ставим Form.KeyPreview в True, на Form.OnKeyDown запоминаем ShiftState, на Form.OnKeyUp - очищаем.


 
X9 ©   (2007-05-09 15:15) [4]

> [1] SergeyIT ©   (09.05.07 15:05)
> А это не подходит?
> SHORT GetKeyState(
>
>   int nVirtKey  // virtual-key code
>  );

А где взять аргумент для данной функции?


 
Belorus ©   (2007-05-09 15:37) [5]

Нет, вы не поняли. Сохранять Shift я могу, но это просто глупо. Вручную перебирать клавиши мне тоже не хочется(не потому что лень, а потому что некрасиво). Нужно просто получить TShiftState в произвольный момент времени.


 
SergeyIT ©   (2007-05-09 15:43) [6]


> А где взять аргумент для данной функции?

Так это виртуальный код клавиши.
Virtual-Key Codes в Wn32 helpe.


 
X9 ©   (2007-05-09 15:52) [7]

> [5] Belorus ©   (09.05.07 15:37)
> Нет, вы не поняли. Сохранять Shift я могу, но это просто
> глупо.

Отчего ж глупо?

> [6] SergeyIT ©   (09.05.07 15:43)
>
> > А где взять аргумент для данной функции?
>
> Так это виртуальный код клавиши.
> Virtual-Key Codes в Wn32 helpe.

Ещё раз, откуда его брать?


 
{RASkov} ©   (2007-05-09 16:12) [8]

> [7] X9 ©   (09.05.07 15:52)
> Ещё раз, откуда его брать?

Аргумент этой функции - это код клавиши, которую необходимо проверить - нажата или нет.


 
X9 ©   (2007-05-09 16:19) [9]

> [8] {RASkov} ©   (09.05.07 16:12)

По какому событию его проверять?


 
X9 ©   (2007-05-09 16:21) [10]

Автор ведь не хочет использовать события, следовательно, придёться перебирать все нужные коды клавиш.


 
Belorus ©   (2007-05-09 16:39) [11]

>
> Отчего ж глупо?

Чтобы его сохранить нужно чтобы произошло событие на форме OnMouseMove (например).
А если нету формы ? Или если событие ни разу не произошло с момента создания формы ?

Вот мне очень нравится функция function KeysToShiftState(Keys: Word): TShiftState;
Но как достать для неё аргумент  ?


 
Belorus ©   (2007-05-09 16:40) [12]

Ой, не заметил предыдущего сообщения. В общем x9 прав.


 
{RASkov} ©   (2007-05-09 16:44) [13]

> [9] X9 ©   (09.05.07 16:19)

и для > [12] Belorus ©   (09.05.07 16:40)

Например так:
function GetShiftState: TShiftState;
begin
 Result := [];
 if GetKeyState(VK_CONTROL) < 0 then Include(Result, ssCtrl);
 if GetKeyState(VK_SHIFT) < 0 then Include(Result, ssShift);
 if GetKeyState(VK_LBUTTON) < 0 then Include(Result, ssLeft);
 if GetKeyState(VK_RBUTTON) < 0 then Include(Result, ssRight);
 if GetKeyState(VK_MBUTTON) < 0 then Include(Result, ssMiddle);
 if GetKeyState(VK_MENU) < 0 then Include(Result, ssAlt);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
//procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); //это как хочет автор.
var ShSt: TShiftState; S: String;
begin
 ShSt:=GetShiftState; S:="";
 if ssCtrl in ShSt then S:=S+"ssCtrl, ";
 if ssShift in ShSt then S:=S+"ssShift, ";
 if ssLeft in ShSt then S:=S+"ssLeft, ";
 if ssRight in ShSt then S:=S+"ssRight, ";
 if ssMiddle in ShSt then S:=S+"ssMiddle, ";
 if ssAlt in ShSt then S:=S+"ssAlt, ";
 Caption:=S;
end;


 
{RASkov} ©   (2007-05-09 16:48) [14]

> //procedure TForm1.FormMouseMove(Sender: TObject; Shift:
> TShiftState; X, Y: Integer); //это как хочет автор

Т.е. автор так не хочет, сорри, но он хочет TShiftState... он его получил.


 
Belorus ©   (2007-05-09 16:56) [15]

Огромное спасибо {RASkov} за усилия. Работает как часы.
Видимо придётся остановиться на этом варианте, т.к судя по всему нет стандартной функции в API или библиотеках Delphi реализующих то же самое, в виде Shift := GetCurrentShiftState(от балды придумал);

Ещё раз спасибо за участие.


 
begin...end ©   (2007-05-09 16:56) [16]

> {RASkov} ©   (09.05.07 16:44) [13]

> function GetShiftState: TShiftState;

KeyboardStateToShiftState (Forms.pas)


 
Belorus ©   (2007-05-09 16:57) [17]

Кстати , любопытства ради...
ssDouble добавляется при нажатии сразу двух кнопок мыши ? Просто интересен смысл этого флага..


 
Belorus ©   (2007-05-09 17:03) [18]

> KeyboardStateToShiftState (Forms.pas)

Вот, оказывается, где собака порылась.


 
{RASkov} ©   (2007-05-09 17:05) [19]

> [17] Belorus ©   (09.05.07 16:57)
ssDouble добавляется при нажатии сразу двух кнопок мыши ?

Нет... это двойной клик...

> [16] begin...end ©   (09.05.07 16:56)

Ну да... оттуда и переделал для ветки, автор не догадался/недодумался так сделать ;)

> [18] Belorus ©   (09.05.07 17:03)

Угу... трудно было посмотреть? ;)



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
15-1177613059
Некроман_тус
2007-04-26 22:44
2007.05.27
Архив...


15-1177187738
Petr V.Abramov
2007-04-22 00:35
2007.05.27
Теорема Ферма доказана или нет?


2-1178889302
Ezorcist
2007-05-11 17:15
2007.05.27
Можно отобразить в label текс шрифтом не в системе?


2-1178524785
Konus
2007-05-07 11:59
2007.05.27
работа с TEdit, формат числа 1.11


15-1177503414
Pazitron_Brain
2007-04-25 16:16
2007.05.27
FreeDOS