![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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
);