Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработать Ctrl+1 
V
    Опции темы
Akella
  Дата 21.11.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Есть код, который срабатывает при нажатии на Enter или Shift+Enter
Код

procedure TfmAdd.FormKeyPress(Sender: TObject; var Key: Char);
begin
  //Enter as Tab
  if (Key = #13) then begin

      if GetKeyState(VK_Shift) and $8000 <> 0 then
        PostMessage(Handle, WM_NEXTDLGCTL, 1, 0)
      else
        PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);

      Key := #0;
  end;

Код этот нормально работает.

Так вот, на примере его я хочу отлавливать нажатие Ctrl+1, Ctrl+2 ... Ctrl+6
Код

  if key = '1' then
    if GetKeyState(VK_CONTROL) and $8000 <> 0 then
       cboxPn.Checked := not cboxPn.Checked;

Но код не срабатывает. Может есть у кого пример?
PM MAIL   Вверх
pseud
Дата 21.11.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



видимо кто-то перехватывает раньше и не передает сюда

быстрое решение: использовать OnKeyUp
работает

Код

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = Ord('1') then
    if GetKeyState(VK_CONTROL) and $8000 <> 0 then
       ShowMessage('ctrl+1');
end;


можно Shift использовать вместо GetKeyState



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alexeis
Дата 21.11.2007, 10:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

  if (Key = Ord('1'))and (ssCtrl in Shift)
  then
    ShowMessage('ctr+1');



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 21.11.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Та так знаю, но слишком просто, а настоящие герои всегда идут в обход.  smile

Добавлено через 40 секунд
Цитата(pseud @  21.11.2007,  10:13 Найти цитируемый пост)
идимо кто-то перехватывает раньше и не передает сюда

 smile хто? я ж один за компом smile 
PM MAIL   Вверх
Snowy
Дата 21.11.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ну может у тебя где-то хоткей такой прописан.
Он срабатывает и дальше не пускает.
PM MAIL   Вверх
Akella
Дата 21.11.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



нет, Ctrl+1 нигде не прописан
Код

 if key = '1' then
    if GetKeyState(VK_CONTROL) and $8000 <> 0 then
       cboxPn.Checked := not cboxPn.Checked;


дебаггер останавливается на первой строчке, а if GetKeyState(... пропускает, всмысле перепрыгивает

Добавлено через 1 минуту и 23 секунды
Ну я сделал через KeyDown, т.е. проблема как бы решена. Но через KeyPress так и не смог. Спасибо, всем  smile 
PM MAIL   Вверх
ama_kid
Дата 21.11.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(Akella @  21.11.2007,  11:34 Найти цитируемый пост)
дебаггер останавливается на первой строчке, а if GetKeyState(... пропускает, всмысле перепрыгивает
А разве Ctrl+1 соответствует какому-либо ASCII-символу? Из справки Delphi:
Цитата
Keys that don't correspond to an ASCII Char value (Shift or F1, for example) don't generate an OnKeyPress event




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Akella
Дата 21.11.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ama_kid @  21.11.2007,  11:51 Найти цитируемый пост)
А разве Ctrl+1 соответствует какому-либо ASCII-символу?

а как же это?
Ord('1')

Добавлено через 1 минуту и 5 секунд
Цитата

Keys that don't correspond to an ASCII Char value (Shift or F1, for example) don't generate an OnKeyPress event


тем не менее, как видно из примера, можно и Shift обрабатывать и F1 думаю, что тоже
PM MAIL   Вверх
ama_kid
Дата 21.11.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(Akella @  21.11.2007,  12:19 Найти цитируемый пост)
а как же это?
Ord('1')
Ord('1') - это код символа, соответствующего нажатию просто клавиши '1' - в любом редакторе эта клавиша выдаст этот символ... А вот Ctrl+1 нигде никакого символа не напишет - это  типа какая-нить "управляющая комбинация" и OnKeyPress, по идее, не должен генерироваться, что кстати и подтвержается у меня опытом (но вокруг меня только ноутбуки и я не уверен, что аналогично происходит на десктопе)...

Цитата(Akella @  21.11.2007,  12:19 Найти цитируемый пост)
тем не менее, как видно из примера, можно и Shift обрабатывать и F1 думаю, что тоже 
голый Shift OnKeyPress не генерит, а вот Shift+a -  генерит (большая буква А), поэтому конечно можно... Насчет F1 - есть сомнения... 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
pseud
Дата 21.11.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  21.11.2007,  11:34 Найти цитируемый пост)
Ну я сделал через KeyDown,


зря

а теперь попробуй нажать Ctrl+1 и не отпускать
и сколько раз у тебя ето все дело выполнится? ну сколько успеет, во всяком случае больше одного

а вот с KeyPress и KeyUp - только один


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 21.11.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ama_kid @  21.11.2007,  12:31 Найти цитируемый пост)
Ctrl+1

ну дык... это сочетание клавишь, а кодов сочетаний нет как таковых

Добавлено через 2 минуты и 4 секунды
Цитата(pseud @  21.11.2007,  12:34 Найти цитируемый пост)
а теперь попробуй нажать Ctrl+1 и не отпускать
и сколько раз у тебя ето все дело выполнится?

та отож :(

Добавлено через 3 минуты и 51 секунду
Цитата(ama_kid @  21.11.2007,  12:31 Найти цитируемый пост)
. А вот Ctrl+1 нигде никакого символа не напишет - это  типа какая-нить "управляющая комбинация" и OnKeyPress, по идее, не должен генерироваться, 

по нажатию на Ctrl не генерируется, а вот по нажатию на 1 генерируется, и вот здесь ты уже проверяешь, держит ли юзер Ctrl или Alt или Shift

Добавлено через 4 минуты и 47 секунд
Цитата(ama_kid @  21.11.2007,  12:31 Найти цитируемый пост)
что кстати и подтвержается у меня опытом

Т.е. по твоим убеждениям
Код

procedure TfmAdd.FormKeyPress(Sender: TObject; var Key: Char);
begin
  //Enter as Tab
  if (Key = #13) then begin
      if GetKeyState(VK_Shift) and $8000 <> 0 then
        PostMessage(Handle, WM_NEXTDLGCTL, 1, 0)
      else
        PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
      Key := #0;
  end;

неработоспособен  smile ?
PM MAIL   Вверх
ama_kid
Дата 21.11.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Akella, в отличие от Ctrl+1 - Enter генерирует ASCII символ (перевод строки), поэтому данный код жизнеспособен и правилен... по моим убеждениям неработоспособной является проверка Ctrl+1 в обработчике OnKeyPress, ибо эту комбинацию нельзя отловить в принципе в данном обработчике (опять же, по моим убеждениям) т.к. ASCII-символ не генерится (ты можешь спокойно проверять это все дело в обработчиках OnKeyUp\Down, ибо туда приходят уже все нажатия любых клавиш, что собсно в итоге ты и сделал, но не все комбинации вызывают OnKeyPress, а только те, которые генерят ASCII-символы)... Поэтому меня и удивило, что ты тут написал, что у тебя "дебаггер останавливается...", хотя по идее - обработчик не должен был вообще срабатывать (у меня не срабатывает)... Вот у меня и возник вопрос - какому ASCII символу соответствует данная комбинация, если у тебя вызвалось событие OnKeyPress при нажатии Ctrl+1?... Или я что-то не так понял?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Akella
Дата 21.11.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ama_kid @  21.11.2007,  14:32 Найти цитируемый пост)
в отличие от Ctrl+1 - Enter генерирует ASCII символ

а цифирЯ "1", значит-с, не генерирует?

Добавлено через 1 минуту и 34 секунды
см. обведенное красным  smile 

user posted image

Добавлено через 3 минуты и 41 секунду
Цитата(ama_kid @  21.11.2007,  14:32 Найти цитируемый пост)
что ты тут написал, что у тебя "дебаггер останавливается...",

а ты сам попробуй smile

Добавлено через 5 минут и 23 секунды
Цитата(ama_kid @  21.11.2007,  14:32 Найти цитируемый пост)
хотя по идее - обработчик не должен был вообще срабатывать 

клавиша 1 нажата??????? НАЖАТА!!!! значит происходит OnKeyPress, значит эта строка выполнится:
Код

if key = '1' then


Добавлено через 6 минут и 8 секунд
а дальше проверяем нажата ли Ctrl, вот у меня именно с этим проблемы, с определением нажата ли ctrl, в одном примере работает, а в другом нет
PM MAIL   Вверх
ama_kid
Дата 21.11.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Блин, я видимо никак не могу донести свою мысль... Ладно, продемонстрирую на примере свою линию размышления. Вызов OnKeyPress является ответом на приход сообщения WM_CHAR (в исходниках VCL - это файл Controls.pas строки 7098-7126 для Delphi 7). Дальше, я создаю новый пустой проект и перекрываю это сообщение следующим образом:
Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMChar(var Mes:TWMChar); message WM_CHAR;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMChar(var Mes: TWMChar);
begin
 ShowMessage(IntToStr(Mes.CharCode));
 inherited;
end;

end.

Запускаю, появляется пустая форма... Нажимаю просто одну клавишу '1'. Вылезает ShowMessage c надписью '49' (ASCII-код символа '1'). Это все понятно. Но вот нажимаю Ctrl+1 - не вылезает вообще никакого сообщения - это значит, что WM_CHAR не приходит, следовательно никакого OnKeyPress не должно быть... (Про WM_KEYUP\WM_KEYDOWN в данном случае я вообще ничего не говорю - они приходят исправно)... И я просто не могу понять, почему тебе приходит WM_CHAR при нажатии на Ctrl+1 (раз обработчик срабатывает), а у меня нет?

Это сообщение отредактировал(а) ama_kid - 21.11.2007, 16:23


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Akella
Дата 21.11.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ama_kid @  21.11.2007,  16:07 Найти цитируемый пост)
перекрываю это сообщение следующим образом:

зачем его прекрывать? smile

я и не говорил ни разу здесь о перекрытии

Добавлено через 40 секунд
ты создай пустой проект без всяких перекрытий
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.