Ĺadny brzuch
Witam :) Mam aplikację MDI. Powiedzmy w oknie głównym (rodzicu) mam ShortCut'a na otwieranie pliku ustawionego na Ctrl+O. W zasięgu tej formy (kiedy jakiś komponent z tej formy głównej jest aktywny) oczywiście to działa.
A co zrobić, aby skróty klawiaturowe ustalone na formie głównej dla poszczególnych procedur miały zasięg w oknach potomnych (na moim przykładzie jest to edytor, na którym w na oknie potomnym jest kontrolka edycyjna, i nie mogę korzystać wtedy np. z zapisywania pliku poprzez Ctrl+S - co bardzo utrudnia pracę) ??
BTW: nie chcę się bawić w onkeydown kontrolki edycyjnej okna potomnego czy tam w art http://4programmers....ty_klawiaturowe ;]
Przecież możesz w obsłudze skrótu (np. Ctrl+S) sprawdzać, które z okien potomnych jest w danej chwili aktywne (może być tylko jedno) i zapisywać dokument z tego właśnie okna - w czym problem?
//edit - mam na myśli to, że obsługę skrótów robisz w głównym module (albo lepiej dla czytelności, w jakimś niezależnym module). Wystarcza wtedy zawsze najpierw wykryć aktywne okno potomne i później wszystko robić już dla tego okna ;)
Użytkownik Kokoszek edytował ten post 05 kwiecień 2006, 07:52
Hmm... Nie wiem nie wiem, ale jak to zrobić? ;)
Jakby co, ja wyobrażam sobie to tak, że mam np. MainMenu postawione i w nim np. pozycję Zapisz i ustawiony dla niej skrót Ctrl+S i użycie tego skrótu w oknie potomnym wywołuje tę właśnie procedurę...
Dajesz w głównej formie (Form1) taką przykładową procedurę:
procedure SaveFile(FileName: String); begin  //brak aktywnego okna MDI  if Form1.ActiveMDIChild = nil then Exit;  with (Form1.ActiveMDIChild as TTwojaFormaPotomna) do  begin   try    Memo1.Lines.SaveToFile(FileName);   except    //obsługa błędów zapisu   end;  end; end;
Uwaga - pisałem z głowy, więc niekoniecznie musi zadziałać, postaram się to sprawdzić dzisiaj ;)
edit// aha, zamiast TTwojaFormaPotomna dajesz nazwę klasy okna-dziecka.
Użytkownik Kokoszek edytował ten post 06 kwiecień 2006, 07:43
Hehe, znalazłem rozwiązaniem - mianowicie komponent ActionList :)
(ale dzięki Kokoszek za chęci ;))
Hehe, znalazłem rozwiązaniem - mianowicie komponent ActionList :)
(ale dzięki Kokoszek za chęci ;))
A co to za różnica. Jeśli będziesz zapisywał childa który nie jest otwarty to i tak musisz użyć wyjątków
O, przepraszam, działa, bo sprawdziłem. Jeśli okno potomne jest klasy TMDIChild, to jeśli podmienisz odpowiednią liniję kodu na:
with (Form1.ActiveMDIChild as TMDIChild) do
i przy założeniu, że na tej formie Memo ma nazwę Memo1, wszystko działa aż miło :P
BTW: Ja zrozumiałem Twojego posta tak, że problemem nie są same skróty, ale dostęp do komponentów w oknie potomnym - stąd taki właśnie kod. ActionList rzeczywiście jest wg mnie najlepszym sposobem na rozwiązanie problemów z poleceniami, które mają mieć skróty klawiaturowe, a ponadto mają pojawiać się w różnych menu, popupach i paskach narzędziowych :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
A co zrobić, aby skróty klawiaturowe ustalone na formie głównej dla poszczególnych procedur miały zasięg w oknach potomnych (na moim przykładzie jest to edytor, na którym w na oknie potomnym jest kontrolka edycyjna, i nie mogę korzystać wtedy np. z zapisywania pliku poprzez Ctrl+S - co bardzo utrudnia pracę) ??
BTW: nie chcę się bawić w onkeydown kontrolki edycyjnej okna potomnego czy tam w art http://4programmers....ty_klawiaturowe ;]
Przecież możesz w obsłudze skrótu (np. Ctrl+S) sprawdzać, które z okien potomnych jest w danej chwili aktywne (może być tylko jedno) i zapisywać dokument z tego właśnie okna - w czym problem?
//edit - mam na myśli to, że obsługę skrótów robisz w głównym module (albo lepiej dla czytelności, w jakimś niezależnym module). Wystarcza wtedy zawsze najpierw wykryć aktywne okno potomne i później wszystko robić już dla tego okna ;)
Użytkownik Kokoszek edytował ten post 05 kwiecień 2006, 07:52
Hmm... Nie wiem nie wiem, ale jak to zrobić? ;)
Jakby co, ja wyobrażam sobie to tak, że mam np. MainMenu postawione i w nim np. pozycję Zapisz i ustawiony dla niej skrót Ctrl+S i użycie tego skrótu w oknie potomnym wywołuje tę właśnie procedurę...
Dajesz w głównej formie (Form1) taką przykładową procedurę:
procedure SaveFile(FileName: String); begin  //brak aktywnego okna MDI  if Form1.ActiveMDIChild = nil then Exit;  with (Form1.ActiveMDIChild as TTwojaFormaPotomna) do  begin   try    Memo1.Lines.SaveToFile(FileName);   except    //obsługa błędów zapisu   end;  end; end;
Uwaga - pisałem z głowy, więc niekoniecznie musi zadziałać, postaram się to sprawdzić dzisiaj ;)
edit// aha, zamiast TTwojaFormaPotomna dajesz nazwę klasy okna-dziecka.
Użytkownik Kokoszek edytował ten post 06 kwiecień 2006, 07:43
Hehe, znalazłem rozwiązaniem - mianowicie komponent ActionList :)
(ale dzięki Kokoszek za chęci ;))
Hehe, znalazłem rozwiązaniem - mianowicie komponent ActionList :)
(ale dzięki Kokoszek za chęci ;))

A co to za różnica. Jeśli będziesz zapisywał childa który nie jest otwarty to i tak musisz użyć wyjątków

O, przepraszam, działa, bo sprawdziłem. Jeśli okno potomne jest klasy TMDIChild, to jeśli podmienisz odpowiednią liniję kodu na:
with (Form1.ActiveMDIChild as TMDIChild) do
i przy założeniu, że na tej formie Memo ma nazwę Memo1, wszystko działa aż miło :P
BTW: Ja zrozumiałem Twojego posta tak, że problemem nie są same skróty, ale dostęp do komponentów w oknie potomnym - stąd taki właśnie kod. ActionList rzeczywiście jest wg mnie najlepszym sposobem na rozwiązanie problemów z poleceniami, które mają mieć skróty klawiaturowe, a ponadto mają pojawiać się w różnych menu, popupach i paskach narzędziowych :)