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

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

TShiftState


Belorus ©   (2007-05-09 14:59:00) 

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

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


{RASkov}   (2007-05-09 17:05:00) [1]

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

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

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

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

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

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


Belorus   (2007-05-09 17:03:00) [2]

> KeyboardStateToShiftState (Forms.pas)

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


Belorus   (2007-05-09 16:57:00) [3]

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


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

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

> function GetShiftState: TShiftState;

KeyboardStateToShiftState (Forms.pas)


Belorus   (2007-05-09 16:56:00) [5]

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

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


{RASkov}   (2007-05-09 16:48:00) [6]

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

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


{RASkov}   (2007-05-09 16:44:00) [7]

> [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;


Belorus   (2007-05-09 16:40:00) [8]

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


Belorus   (2007-05-09 16:39:00) [9]

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

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

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


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

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


X9   (2007-05-09 16:19:00) [11]

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

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


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

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

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


X9   (2007-05-09 15:52:00) [13]

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

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

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

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


SergeyIT   (2007-05-09 15:43:00) [14]


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

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


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

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


X9   (2007-05-09 15:15:00) [16]

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

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


X9   (2007-05-09 15:14:00) [17]

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


SergeyIT   (2007-05-09 15:12:00) [18]

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


SergeyIT   (2007-05-09 15:05:00) [19]

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

   int nVirtKey  // virtual-key code
  );


Наверх

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