Po wciśnięciu klawisza okno się pojawia po zwolnieniu klawisza znika.Jak to zrobić?

0

Potyanko takie same jak w temacie. Chodzi oto że jak mam nowy Form1 i ort! tworzę frame1 , to chcę zrobić tak że po wciśnięciu np. klawisza TAB pojawia się Frame a jak go zwolnię to frame znika. Coś podobnego jest w grze counter-strike z podglądem statów.Z góry dziękuję za pomoc:)

0

KeyPreview:= True (fromy) i przechwycić TAB, akcja na KeyDown i KeyUp

1

zbynio: jak masz pisać niesprawdzone bzdury to lepiej nic nie pisz. Do pytającego: z formatkami VCL i klawiszem TAB. jest tak że jeśli chcesz
go przechwycić musisz obslużyć komunikat CM_DIALOGKEY. Przykład kodu poniżej. Niestety nie wychwycisz wtedy, a przynajmniej ja nie wiem w
jaki sposób to zrobić, momentu wcisnięcia klawisza TAB oraz jego puszczenia. A do tego celu proponuje zastosować globalny hook na klawisze.
Poniżej masz też przykładowy kod. Sprawdzanie okna na pierwszym planie jest po to bo Hook działa w calym systemie dopóki go nie wyłaczysz.

Sposób z CM_DIALOGKEY (jeżeli chcesz przekierować obslugę klawisza dalej to użyj slowa kluczowego inherited):

//...
  public
    procedure CMDialogKey(var Msg : TWMKey); message CM_DIALOGKEY;
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.CMDialogKey(var Msg : TWMKEY);
begin
  if (Msg.Charcode = VK_TAB) then
  begin
    // ...
  end;
end;

Sposób z gloablnym hookiem na klawisze. Sprawdzilem dla zwykłego Penelu i działa, ale jak potrzebujesz to
możesz pokazywać inny komponent o ile ma on możliwość pokazania go i ukrycia na przykład przez Visible:

//...
const
  WH_KEYBOARD_LL = $000D;

type
  tagKBDLLHOOKSTRUCT = packed record
    vkCode : DWord;
    ScanCode : DWord;
    Flags : DWord;
    Time : DWord;
    dwExtraInfo : integer;
  end;
  KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

var
  Form1 : TForm1;
  HKHook : HHook;

implementation

{$R *.dfm}

function LowLevelKeyboardProc(nCode : Integer; wParam : Integer; lParam : Integer) : Integer; stdcall; export;
var
  Hook : PKBDLLHOOKSTRUCT;
begin
  Hook := Pointer(lParam);
  case nCode of
    HC_ACTION :
      begin
        Form1.Panel1.Visible := (GetForeGroundWindow = Form1.Handle)
          and (Hook.vkCode = VK_TAB) and (Hook.Flags = 0);
      end;
  end;
  Result := CallNextHookEx(HKHook, nCode, wParam, lParam);
end;

procedure HookIt;
begin
  HKHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
end;

procedure UnHookIt;
begin
  UnHookWindowsHookEx(HKHook);
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  Hookit;
  Panel1.Visible := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnHookit;
end;
1

Oj tam zaraz hooki na takie głupoty ;)
Proponuję coś takiego:

[***ciach***]
  private
    { Private declarations }
    procedure AppMessage(var Msg:TMsg;var Handled:Boolean);
[***ciach***]
implementation

{$R *.dfm}

procedure TForm1.AppMessage(var Msg:TMsg;var Handled:Boolean);
begin
  if ((Msg.message = WM_KEYDOWN) and (Msg.wParam= VK_TAB)) then
  begin
    Memo1.Lines.Add('TAB DOWN');
    //Handled:= True;
  end
  else if ((Msg.message = WM_KEYUP) and (Msg.wParam= VK_TAB)) then
  begin
    Memo1.Lines.Add('TAB UP');
    //Handled:= True;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:=AppMessage;
end;
[***ciach***]

Usuń komentarze przed Handled:= True jak chcesz się pozbyć domyślnego działania klawisza Tab czyli przechodzenia pomiędzy kontrolkami

EDIT// Oczywśicie to samo można uzyskać poprzez użycie ApplicationEvents

1
  1. co Ty kAzek, spać po nocach nie umiesz :P uprzedziłeś mnie bo chciałem zaproponować "coś w ten deseń" :P
  2. a czy nie prościej byłoby użyć innego klawisza ? Cuba napisał np. TAB

pozdro

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