![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перенаправить сообщение [D7, WinXP]
Alita © (2006-08-21 12:56:00)Есть форма, на ней ListBox. Когда нажимаешь на клавиатуре буквы "a" и "s" должно эмулироваться нажатие на кнопки со стрелками "вверх" и "вниз" соответственно, при этом на ListBox-е должно это отображаться. Как это сделать? Заранее спасибо.
Leonid Troyanovsky (2006-08-23 14:23:00) [1]
> 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.
Alita (2006-08-23 12:17:00) [2]Эта часть задачи такова: на форме три ListBox'а - Л1, Л2 и Л3 (или других подобных компонента). В Л1 идет перебор пунктов с помощью клавиш 'a' u 's'. При этом в Л2 должны отображаться подпункты Л1, которые, в свою очередь, должны перебираться с помощью 'd' u 'f'. При нажатии 'z' пункт из Л2 должен добавляться в Л3, при чем количество добавлений должно быть ограничено некоторым счетчиком, который увеличивается при нажатии на пробел. Коды клавиш, только перечисленные выше, так как сигнал с клавиатуры передается на некоторое устройство, которое зашито на клавиатуру.
Leonid Troyanovsky (2006-08-22 19:18:00) [3]
> Alita © (22.08.06 12:18) [22]
> Да, действительно работает. Я просто нашла у себя ошибку.
К сожалению, это, видимо, не единственная ошибка.
Т.к. появились подозрения в ошибочности дизайна.
Поэтому, IMHO, неплохо бы огласить всю задачу, с учетом уже
усвоенной в результате обсуждений информации.
--
Regards, LVT.
Ketmar (2006-08-22 19:14:00) [4]так же, как и VK_0..VK_9. %-)
Leonid Troyanovsky (2006-08-22 19:12:00) [5]
> Alita © (22.08.06 11:44) [16]
> клавиши вроде есть виртуальный код vk_a-vk_z. Через них
В дельфи их не определяли.
Cочли, что достаточно Ord('A')..Ord('Z')
--
Regards, LVT.
Leonid Troyanovsky (2006-08-22 19:02:00) [6]
> Ketmar © (22.08.06 18:56) [28]
> я отвечал исключительно на [25]. сорри.
Я тоже вынужден извиниться, бо говорил про исходную постановку.
А в [25] уже "он может не и меть фокуса ввода".
Т.е., sorry.
--
Regards, LVT.
Ketmar (2006-08-22 18:56:00) [7]> [27] Leonid Troyanovsky © (22.08.06 18:55)
я отвечал исключительно на [25]. сорри.
Leonid Troyanovsky (2006-08-22 18:55:00) [8]
> Ketmar © (22.08.06 18:27) [26]
> можно и в компоненте. кто мешает сделать в компоненте два
> поля, где запомнить нужные коды? и потом плодить себе хоть
> 100 компонентов.
Можно, конечно, и в контроле.
Но, исходная постановка задачи недвусмысленно намекает на то,
что управление листбоксами осуществляется на уровне формы.
Т.е., видимо, здесь будет весьма полезен TActionList & etc.
Конечно, тогда потребуются не сами клавиши, а комбинации типа Ctrl+A,
Ctrl+S & etc. Хотя, неопределенностей, связанных с нажатием одиночных
клавиш станет, IMHO, на порядок меньше.
--
Regards, LVT.
Ketmar (2006-08-22 18:27:00) [9]> [25] Alita © (22.08.06 12:28)
можно и в компоненте. кто мешает сделать в компоненте два поля, где запомнить нужные коды? и потом плодить себе хоть 100 компонентов.
Alita (2006-08-22 12:28:00) [10]Компонент у меня несколько и нужно, чтобы на "a" и "s" реагировал один компонент, на "d" и "f" другой и т.д. Поэтому в самом компоненте нельзя разместить, так как при нажатии на клавишу он может не и меть фокуса ввода.
P.S. Спасибо за помощь. И извинясь за опрометчивость в ответах.
novill (2006-08-22 12:23:00) [11]Если уже используешь
> Form.KeyPreview
то в условия добавь and listbox1.focused
иначе будут проблемы с вводом текста.
Лучше все же обработку разместить в событии самого компонетна.
novill (2006-08-22 12:20:00) [12]Свой вариант я уже писал в [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))
и посмотри какие коды вообще приходят.
Alita (2006-08-22 12:18:00) [13]Да, действительно работает. Я просто нашла у себя ошибку.
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;
clickmaker (2006-08-22 12:07:00) [14]
> [18] Alita © (22.08.06 11:58)
а как все это у тебя выглядит?
novill (2006-08-22 12:04:00) [15]> [18] Alita © (22.08.06 11:58)
> [1] и далее не работают.
тебе что, прогамму кинуть? где это всё работает?
novill (2006-08-22 12:03:00) [16]> [15] umbra © (22.08.06 11:11)
> а если CapsLock включен?
>
> P.S. Я не издеваюсь, просто эта задача немного (?) сложнее,
> чем кажется на первый взгляд
Код клавиши не зависит от положения CapsLock
Alita (2006-08-22 11:58:00) [17][1] и далее не работают. Делфи Key:=VK_DOWN и Key:=VK_UP не обрабатывает в OnKeyDown, OnKeyUp и OnKeyPress. После присваивания они не обрабатываются.
Ketmar (2006-08-22 11:46:00) [18]> [16] Alita © (22.08.06 11:44)
читать ответы религия запрещает? [1]. и далее.
Alita (2006-08-22 11:44:00) [19]А как тогда эту проблему решить? Я точно не знаю, но у каждой клавиши вроде есть виртуальный код
vk_a-vk_z. Через них можно?
umbra (2006-08-22 11:11:00) [20]а если
CapsLockвключен?
P.S. Я не издеваюсь, просто эта задача немного (?) сложнее, чем кажется на первый взгляд.