Przechodzenie strzałkami jak tabulatorem FOCUSED ?

0

Witam,

Mam taki problem. Otóż mam w programie dwa elementy typu panel które na formatce ułożone są obok siebie. Na każdym z nich są elementy typu button, lub panel itp.
I teraz kiedy chcę przejść za pomocą klawiszy strzałek z jednego elementu na drugi w obrębie tego samego macierzystego panela no to wszystko działa, ale nie da się przejść za pomocą strzałek z jednego elementu na inny znajdując się w obrębie drugiego panela. Do tego muszę już posłużyć sie Tabulatorem.

Jak zrobić aby nie trzeba było uzywać tabulatora a wystarczył na przykład klawisz strzałki w bok?

Pozdrawiam

0

Musisz oprogramować zdarzenie naciśnięcia jakiegoś klawisza (np. strzałki) w danej kontrolce - czyli np. zdarzenie onKeyPress

if Key=klawisz_strzalki then
   nazwa_elementu_ktory_ma_byc_aktywny.SetFocus;

klawisz_strzalki - musisz sobie znaleźć wartość
nazwa_elementu_ktory_ma_byc_aktywny - zamiast tego wpisz nazwę komponentu np. Edit2

0

Myślałem raczej o czymś w rodzaku FindNextFocused? Nie mogę zlokalizować w helpie tego typu funkcji a wydaje mi się, że kiedyś cos takiego widziałem na forum.
Sprawa z OnKeyPres odpada, bo używam Paneli a te nie posiadają takiego zdarzenia.
Czy można jakoś przechwytywać wciśnięte klawisze w programie?

A może da się dodać w PoupMenu skrót klawiaturowy do Itema w postaci VK_LEFT lub VK_RIGHT?

Pozdrawiam

0

Mozna sprobowac to zrobic tak:
na formie ustawiamy właściwość "Key preview" na true i w zdarzeniu OnKeyDown wpisujemy

  case Key of
    VK_UP	: UstawNextF;
    VK_DOWN	: UstawPrevF;
  end

dodatkowo deklarujemy dwie procedurki:

procedure TForm1.UstawNextF;
var i,id : integer;
begin
  for i:=0 to ComponentCount-1 do
    if Components[i] is TWinControl then
      if TWinControl(Components[i]).Focused then begin
        id := i;
        break;
      end;
  i := id+1;
  if i > ComponentCount-1 then i := 0;
  while ((i=id) or not ((Components[i] is TWinControl) and (TWinControl(Components[i]).CanFocus))) do
  begin
    Inc(i);
    if i > ComponentCount-1 then i := 0;
  end;

  if i >=0 then
    TWinControl(Components[i]).SetFocus;

end;

procedure TForm1.UstawPrevF;
var i, id : integer;
begin
  for i:=0 to ComponentCount-1 do
    if Components[i] is TWinControl then
      if TWinControl(Components[i]).Focused then begin
        id := i;
        break;
      end;
  i := id-1;
    if i < 0 then i := ComponentCount-1;
  while ((i=id) or not ((Components[i] is TWinControl) and (TWinControl(Components[i]).CanFocus))) do
  begin
    Dec(i);
    if i < 0 then i := ComponentCount-1;
  end;

  if i >=0 then
    TWinControl(Components[i]).SetFocus;
end;

PS. pisalem szybko wiec prosze nie krytykowac ;P

Niestety sa problemy np z Memo, komponent przechwytuje komunikat klawisza.

0
Gothmog napisał(a)

nie ma jak komplikowanie sobie życia :P

Question/Problem/Abstract:

Users always ask for this functionality: Enter key functioning as Tab key (ie: jump to next input field); there's a number of ways to accomplish this, but I think this is the most practical (and centralized) one
Answer:


First, declare the following private proc. in your main form: 

{--snip--} 
procedure TMainForm.DoEnterAsTab(var Msg: TMsg; var Handled: Boolean); 
begin 
  if Msg.Message = WM_KEYDOWN then 
  begin 
    if Msg.wParam = VK_RETURN then 
      Keybd_event(VK_TAB, 0, 0, 0); 
  end; //if 
end; 
{--snip--} 

Now, all you have to do is: for the OnCreate event of the main form, code this assignment: 

{--snip--} 
  Application.OnMessage := DoEnterAsTab; 
{--snip--} 

And there it is! every time the app receives the WM_KEYDOWN message, if the key is VK_RETURN (#13), we simulate a keyboard event, sending VK_TAB as parameter. It wil

zamiast VK_RETURN wstaw swój klawisz i tyle

kod pochodzi z http://www.delphi3000.com/articles/article_663.asp?SK=

1 użytkowników online, w tym zalogowanych: 0, gości: 1