Форум: "WinAPI";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизПеренаправить сообщение Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.043 c