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

Вниз

Перенаправить сообщение   Найти похожие ветки 

 
Alita ©   (2006-08-21 12:56) [0]

Есть форма, на ней ListBox. Когда нажимаешь на клавиатуре буквы "a" и "s" должно эмулироваться нажатие на кнопки со стрелками "вверх" и "вниз" соответственно, при этом на ListBox-е должно это отображаться. Как это сделать? Заранее спасибо.


 
novill ©   (2006-08-21 14:26) [1]

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if key=83 then Key:=VK_DOWN;
if key=65 then Key:=VK_UP;
end;


 
Alita ©   (2006-08-21 17:25) [2]

Так не работает. Такие коды клавиш Delphi не обрабатывает.


 
clickmaker ©   (2006-08-21 17:41) [3]

+ к [1] надо еще в OnKeyPress
if (Key = "a") or (Key = "s") then Key := #0;
чтобы отключить контекстный поиск по умолчанию


 
Leonid Troyanovsky ©   (2006-08-21 19:07) [4]


> clickmaker ©   (21.08.06 17:41) [3]

> чтобы отключить контекстный поиск по умолчанию


Для полноты, видимо, еще нужно обработать OnKeyUp,
дабы не было OnKeyUp.

Скорее всего, задача решается просто для стиля LBS_NODATA
(or not LBS_HASSTRING), где-нибудь в районе WM_CHARTOITEM,
но, проверять ломает :)

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-08-21 19:15) [5]


> Alita ©   (21.08.06 17:25) [2]

> Так не работает. Такие коды клавиш Delphi не обрабатывает.


Почему ж не обрабатывает?
Просто зовут их обычно, скажем как Ord("s"), Ord("a") & etc

--
Regards, LVT.


 
Alita ©   (2006-08-22 09:26) [6]

Не обрабатывает нажатие на клавиши "вверх" и "вниз". Я уже на шла решение (вернее подсказали):

Свойство Form.KeyPreview = True


procedure TMyForm.OnKeyPress(Sender: TObject; var Key: Char);
begin
   if UpperCase(Key) = "A" then
       ListBox1.Perform(WM_KEYDOWN, VK_UP, 0)
   else if UpperCase(Key) = "S" then
       ListBox1.Perform(WM_KEYDOWN, VK_DOWN, 0);
end;


 
umbra ©   (2006-08-22 09:53) [7]


> Я уже на шла решение (вернее подсказали)

а если раскладка клавиатуры русская? :)


 
Alita ©   (2006-08-22 10:26) [8]

Очевидно, что тогда:


procedure TMyForm.OnKeyPress(Sender: TObject; var Key: Char);
begin
  if (UpperCase(Key) = "A") or (UpperCase(Key) = "Ф") then
      ListBox1.Perform(WM_KEYDOWN, VK_UP, 0)
  else if (UpperCase(Key) = "S") or (UpperCase(Key) = "Ы") then
      ListBox1.Perform(WM_KEYDOWN, VK_DOWN, 0);
end;


Или есть другое решение?


 
clickmaker ©   (2006-08-22 10:28) [9]


> Или есть другое решение?

тебе уже давно написали решение. [1] + [3]


 
Ketmar ©   (2006-08-22 10:31) [10]

> [8] Alita ©   (22.08.06 10:26)
"других решений" всегда есть. а вот ты точно хочешь их узнать? %-)


 
DprYg ©   (2006-08-22 10:33) [11]

Кстати [8] тоже работать не будет:)


 
umbra ©   (2006-08-22 10:48) [12]

2 Alita ©   (22.08.06 10:26) [8]

а если раскладка украинская? :)


 
Alita ©   (2006-08-22 11:00) [13]

А так? Вроде должно.


procedure TForm1.Form1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if key=83 then
     ListBox1.Perform(WM_KEYDOWN, VK_UP, 0)
 else iif key=83 then
     ListBox1.Perform(WM_KEYDOWN, VK_DOWN, 0);
end;


 
Alita ©   (2006-08-22 11:03) [14]

Ошиблась немного


....
else if key=65 then
    ListBox1.Perform(WM_KEYDOWN, VK_DOWN, 0);
end;


 
umbra ©   (2006-08-22 11:11) [15]

а если CapsLock включен?

P.S. Я не издеваюсь, просто эта задача немного (?) сложнее, чем кажется на первый взгляд.


 
Alita ©   (2006-08-22 11:44) [16]

А как тогда эту проблему решить? Я точно не знаю, но у каждой клавиши вроде есть виртуальный код vk_a-vk_z. Через них можно?


 
Ketmar ©   (2006-08-22 11:46) [17]

> [16] Alita ©   (22.08.06 11:44)
читать ответы религия запрещает? [1]. и далее.


 
Alita ©   (2006-08-22 11:58) [18]

[1] и далее не работают. Делфи  Key:=VK_DOWN и Key:=VK_UP не обрабатывает в OnKeyDown, OnKeyUp и OnKeyPress. После присваивания они  не обрабатываются.


 
novill ©   (2006-08-22 12:03) [19]

> [15] umbra ©   (22.08.06 11:11)
> а если CapsLock включен?
>
> P.S. Я не издеваюсь, просто эта задача немного (?) сложнее,
> чем кажется на первый взгляд

Код клавиши не зависит от положения CapsLock


 
novill ©   (2006-08-22 12:04) [20]

> [18] Alita ©   (22.08.06 11:58)
> [1] и далее не работают.

тебе что, прогамму кинуть? где это всё работает?


 
clickmaker ©   (2006-08-22 12:07) [21]


> [18] Alita ©   (22.08.06 11:58)

а как все это у тебя выглядит?


 
Alita ©   (2006-08-22 12:18) [22]

Да, действительно работает. Я просто нашла у себя ошибку.

Form.KeyPreview = false

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
   if key=83 then Key:=VK_DOWN;
   if key=65 then Key:=VK_UP;
     DirList.OnKeyDown(self,Key, []);
end;


 
novill ©   (2006-08-22 12:20) [23]

Свой вариант я уже писал в [1]

Вот еще вариант, так же работает:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if chr(key)="A" then Key:=VK_DOWN;
If chr(key)="S" then Key:=VK_UP;
end;


Если вообще нифига не получается  - кинь на форму мемо и а в ListBox1KeyDown помести  Memo1.Lines.Add(IntToStr(key))
и посмотри какие коды вообще приходят.


 
novill ©   (2006-08-22 12:23) [24]

Если уже используешь
> Form.KeyPreview
то в условия добавь and listbox1.focused
иначе будут проблемы с вводом текста.

Лучше все же обработку разместить в событии самого компонетна.


 
Alita ©   (2006-08-22 12:28) [25]

Компонент у меня несколько и нужно, чтобы на "a" и "s" реагировал один компонент, на "d" и "f" другой и т.д. Поэтому в самом компоненте нельзя разместить, так как при нажатии на клавишу он может не и меть фокуса ввода.

P.S. Спасибо за помощь. И извинясь за опрометчивость в ответах.


 
Ketmar ©   (2006-08-22 18:27) [26]

> [25] Alita ©   (22.08.06 12:28)
можно и в компоненте. кто мешает сделать в компоненте два поля, где запомнить нужные коды? и потом плодить себе хоть 100 компонентов.


 
Leonid Troyanovsky ©   (2006-08-22 18:55) [27]


> Ketmar ©   (22.08.06 18:27) [26]

> можно и в компоненте. кто мешает сделать в компоненте два
> поля, где запомнить нужные коды? и потом плодить себе хоть
> 100 компонентов.


Можно, конечно, и в контроле.
Но, исходная постановка задачи недвусмысленно намекает на то,
что управление листбоксами осуществляется на уровне формы.
Т.е., видимо, здесь будет весьма полезен TActionList & etc.
Конечно, тогда потребуются не сами клавиши, а комбинации типа Ctrl+A,
Ctrl+S & etc. Хотя, неопределенностей, связанных с нажатием одиночных
клавиш станет, IMHO, на порядок меньше.

--
Regards, LVT.


 
Ketmar ©   (2006-08-22 18:56) [28]

> [27] Leonid Troyanovsky ©   (22.08.06 18:55)
я отвечал исключительно на [25]. сорри.


 
Leonid Troyanovsky ©   (2006-08-22 19:02) [29]


> Ketmar ©   (22.08.06 18:56) [28]

> я отвечал исключительно на [25]. сорри.


Я тоже вынужден извиниться, бо говорил про исходную постановку.
А в [25] уже "он может не и меть фокуса ввода".
Т.е., sorry.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-08-22 19:12) [30]


> Alita ©   (22.08.06 11:44) [16]

> клавиши вроде есть виртуальный код vk_a-vk_z. Через них


В дельфи их не определяли.
Cочли, что достаточно Ord("A")..Ord("Z")

--
Regards, LVT.


 
Ketmar ©   (2006-08-22 19:14) [31]

так же, как и VK_0..VK_9. %-)


 
Leonid Troyanovsky ©   (2006-08-22 19:18) [32]


> Alita ©   (22.08.06 12:18) [22]

> Да, действительно работает. Я просто нашла у себя ошибку.


К сожалению, это, видимо, не единственная ошибка.
Т.к. появились подозрения в ошибочности дизайна.

Поэтому, IMHO, неплохо бы огласить всю задачу, с учетом уже
усвоенной в результате обсуждений информации.

--
Regards, LVT.


 
Alita ©   (2006-08-23 12:17) [33]

Эта часть задачи такова: на форме три ListBox"а - Л1, Л2 и Л3 (или других подобных компонента). В Л1 идет перебор пунктов с помощью клавиш "a" u "s".  При этом в Л2 должны отображаться подпункты Л1, которые, в свою очередь, должны перебираться с помощью "d" u "f". При нажатии "z" пункт из Л2 должен добавляться в Л3, при чем количество добавлений должно быть ограничено некоторым счетчиком, который увеличивается при нажатии на пробел. Коды клавиш, только перечисленные выше, так как сигнал с клавиатуры передается на некоторое устройство, которое зашито на клавиатуру.


 
Leonid Troyanovsky ©   (2006-08-23 14:23) [34]


> Alita ©   (23.08.06 12:17) [33]

> Эта часть задачи такова: на форме три ListBox"а - Л1, Л2
> и Л3 (или других подобных компонента). В Л1 идет перебор
> пунктов с помощью клавиш "a" u "s".  При этом в Л2 должны


ApplicationEvents1.OnShortCut

const
 Chars: set of Char = ["A", "S", "D", "F"];

procedure TForm1.ApplicationEvents1ShortCut(var Msg: TWMKey;
 var Handled: Boolean);
begin
 Handled := Char(msg.CharCode) in Chars and (..) ;
 if Handled then
   case Char(msg.CharCode) of
     "A":
        with ListBox1 do
          ItemIndex := ItemIndex +1;
     "S":
        with ListBox1 do
          ItemIndex := ItemIndex -1;
     "D":
        with ListBox2 do
          ItemIndex := ItemIndex +1;
     "F":
        with ListBox2 do
          ItemIndex := ItemIndex -1;
   end;
end;


--
Regards, LVT.



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

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

Наверх




Память: 0.55 MB
Время: 0.048 c
15-1165000028
ProgRAMmer Dimonych
2006-12-01 22:07
2006.12.31
Тут на форуме много-много людей с разными никами...


15-1164733693
VictorT
2006-11-28 20:08
2006.12.31
И на RC-форумах бывает прикольный стёб :D


2-1165897576
Монг
2006-12-12 07:26
2006.12.31
Работа с датой.


2-1165948805
GEN++
2006-12-12 21:40
2006.12.31
NMStrmServ


1-1163360090
RASkov
2006-11-12 22:34
2006.12.31
"Всплывающее окно"