Zamykanie formy modalnej klawiszem Esc

0

Aplikacja zawiera formy fEditor i fGrab.

Forma główna, fEditor, posiada klasyczne Menu
menu.png
Jak widać, polecenie Exit posiada skrót Esc.

*fGrab *posiada tylko jeden komponent TImage.

Problem mam taki.
Ukrywam formę główną i otwieram drugą

  fEditor.Hide;
  fGrab.ShowModal;

Chciałbym *fGrab *zamykać klawiszem Esc.
Niestety, po otwarciu fGrab, forma główna nadal przechwytuje klawisz Esc i w efekcie aplikacja zamyka się.
Jak przechwycić klawisz Esc w formie modalnej zanim zrobi to forma główna?

0

fEditor.Hide;
fEditor.MenuEsc.Eanbaled:=false;
fGrab.ShowModal;
fEditor.MenuEsc.Eanbaled:=true;

0

Niestety.
Po tej modyfikacji TfGrab.FormKeyDown nadal reaguje na wszystko tylko nie na Esc

Zrobiłem tak

//...
  fGrab.KeyPreview:=True;
//...

procedure TfGrab.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin  
  if Key=VK_ESCAPE then Close;
end;

Owszem, teraz aplikacja nie zamyka się ale fGrab także nie.

1

Heh, ja myślałem że robisz to po ludzku :D
Wstawiasz na TfGrab PopupMenu w nim TMenuItem s Shortcut=ESC; Visible=false; Enable=true; nie zapomnij podłączyć Popupa do formy.

1

Przecież jeżeli do menu jest przypisany klawisz skrótu to nie trzeba kombinować z obsługą OnKeyDown wystarczy tylko obsłużyć zdarzenie OnClick menu np.:

procedure TfEditor.mnuExitClick(Sender: TObject);
begin
  if Self.Visible then
    Close
  else if fGrab.Visible then
  begin
    fGrab.ModalResult:= mrCancel; //lub po prostu fGrab.Close;
    Self.Show; //lub w OnClose fGrab
  end;
end;
0

@_13th_Dragon
Zdaje się, że o to chodziło :)
Potestuję dokładnie.
Przy okazji okazało się, że przy otwartej fGrab, główna forma przechwytuje wszystkie swoje skróty (teraz z wyjątkiem Esc) - przedtem tego nie sprawdzałem.
Czyli trzeba będzie na fGrab.PopupMenu dodać Itemy z tymi samymi skrótami co na głównej (Ctrl+O, Ctrl+S itd).

@kAzek
Raczej pokombinuję z Self.Active bo przed otwarciem fGrab, główną formę nie zawsze ukrywam.

0

Nie koniecznie, oprócz tych które główna forma poprawnie obsługuje.

2

WYMAGAM aby główna forma nie obsługiwała swoich skrótów gdy jest niewidoczna albo nieaktywna.

A możesz ją zablokować przez Enabled := False, po zamknięciu okna dialogowego przywrócić jej poprzedni stan? Jeśli będzie zablokowana (jako niewidoczna czy widoczna, aktywna czy nieaktywna) to nie powinna zbierać skrótów;

Nie rozumiem jednak dlaczego forma główna zbiera skróty, jeśli wyświetlona jest inna forma i to jeszcze modalnie... Czy formularz fGrab tworzony jest dynamicznie i zwalniany po wykorzystaniu, a także czy jego Owner = fEditor?

0

fGrab jest tworzona normalnie. Zauważyłem jeszcze, że główna forma nie zbiera skrótów, jeżeli pozostaje widoczna po otwarciu formy modalnej.
Rzeczywiście, ustawienie fEditor.Enabled:=False rozwiązuje mój problem (forma główna nie przechwytuje już skrótów niezależnie od tego czy jest widoczna czy nie).
Muszę teraz powalczyć z identycznym problemem w przypadku gdy otwieram fGrab.Show. Forma główna przechwytuje swoje skróty. Powyższe rozwiązanie w tym przyp. nie sprawdza się.

0

fGrab jest tworzona normalnie.

No wiesz, dla mnie "normalnie" znaczy dynamicznie ;)

Od dawna wykorzystuję własne okna dialogowe, które zawsze uruchamiam modalnie i jeszcze nigdy nie przydarzyło mi się, aby zablokowana forma zbierała skróty i inne komunikaty; Rodzic okna dialogowego wyświetlanego modalnie zawsze jest zablokowany, więc nie powinno się nic mieszać; Jednak nie potrzebowałem nigdy ukrywać formy-rodzica więc nie wiem, czy wtedy także będzie zablokowane, czy nie; Jeszcze można spróbować podczas wywoływania blokować menu formy rodzica - także powinno pomóc;

Niemniej jednak jeśli będziesz miał jeszcze jakiś problem z formularzami (z tego co napisałeś to raczej masz) to podaj trochę kodu żeby można było zobaczyć jak wywołujesz okna dialogowe;

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