| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > D2007 Горячие клавиши в TAction |
| Автор: ShadeSt 5.9.2008, 10:50 | ||
| Маленькая предистория: В существующем проекте используется следующая схема создания форм:
Описание проблемы: На форме GRID_FORM есть TActionList в котором есть несколько TAction для обработки горячих клавиш (ShortCut) При сборке проекта в Delphi 7 действие горячих клавиш распространялось только на форму GRID_FORM (т.е. форму владельца TActionList) При переходе на Delphi 2007 схема обработки горячих клавиш ломается, и они начинают ловиться в дочерних формах, что приводит к очень нежелательным последствиям. На просторах интернета упоминание нашли тут http://newsgroups.cryer.info/borland/public.delphi.vcl.components.using.win32/200707/13/0707134938.html Пример проблемы: В приложенном к данному сообщению файлику лежит исходный код тестового проекта и несколько собранных версий - одна в D7, другая в D2007. Проект, собранный в D7 особого интереса не представляет, т.к. в нем все работает так, как ожидается. А проект, собранный в D2007 ведёт себя как минимум странно:
Хочется в Delphi 2007 добиться поведения, аналогичного тому, что было... Большая просьба, если кто-нибудь сталкивался с таким - отпишитесь! Так же, если кто-либо знает решение, либо сталкивался с информацией по данному вопросу на просторах интернета - поделитесь решением/ссылками. |
| Автор: Frees 5.9.2008, 11:11 |
| В D2006 turbu если написать TempForm := TForm2.Create(Application);//а не self то не будет токого поведение |
| Автор: ShadeSt 5.9.2008, 19:56 |
| Frees, в том то и дело, что необходимо именно описанное выше поведение, т.к. в дочерние формы (DATA_EDIT_FORM) в некоторых случаях передаются указатели на область памяти, где лежат данные. Таким образом закрытие основной формы (GRID_FORM) повлечет освобождение данной памяти и соответственно проблемы в формах (DATA_EDIT_FORM), если они не будут закрываться. Все это криво конечно, если поразмыслить... но по факту так есть. Да и чисто логически форма родитель должна закрывать своих потомков. То, что все формы будут уничтожаться при закрытии приложения - это как-то криво. |
| Автор: Frees 8.9.2008, 06:21 |
| ShadeSt, TForm2.Create(Application); так создавать формы только GRID_FORM, а DATA_EDIT_FORM с указанием Self в кострукторе получится закрыв GRID_FORM все DATA_EDIT_FORM закроются |
| Автор: ShadeSt 9.9.2008, 10:43 |
| Frees, спасибо! Данное решение действительно решает описанную мной проблему. Но тут есть другая проблемка... если ActionList будет на дочерней форме (на DATA_EDIT_FORM), то его ShortCut будет обрабатываться и в GRID_FORM... |
| Автор: Frees 9.9.2008, 12:42 |
| выход тут один создавать с другим овнером и убивать формы которые породил ручками |