Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1165668405
Сатир
2006-12-09 15:46
2006.12.31
Delphi 7 Build 4.453


15-1165349640
Lovd_E
2006-12-05 23:14
2006.12.31
Stringgrid


15-1165303847
Kerk
2006-12-05 10:30
2006.12.31
Сценарий телесериала "Бригада"


2-1165594616
a1lex
2006-12-08 19:16
2006.12.31
Работа с DBGrid


15-1165564392
vajo
2006-12-08 10:53
2006.12.31
Американцы собираются на луну в 20году





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский