Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > D2007 Горячие клавиши в TAction


Автор: ShadeSt 5.9.2008, 10:50
Маленькая предистория:

В существующем проекте используется следующая схема создания форм:
  •  есть Главная форма(далее MAIN) типа MDIForm. Это главная форма приложения, на ней меню с кучей пунктов.
  •  реакция почти на каждый пункт меню Главной формы - открытие формы MDIChild на которой присутствует таблица с данными(далее GRID_FORM)
  •  для каждой строки таблицы можно открыть форму редактирования данных(далее DATA_EDIT_FORM). форму редактирования можно открывать сколько угодно много раз одновременно.
  •  при закрытии GRID_FORM все дочерние формы редактирования (DATA_EDIT_FORM) закрываются за счет того, что при их создании GRID_FORM указан владельцем:
    Код

    var
      Form : TForm;
    begin
    ...
      Form := TDATA_EDIT_FORM.Create(GRID_FORM);
    ...
    end;

Описание проблемы:

На форме 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 ведёт себя как минимум странно:
  • после открытия формы (аналог GRID_FORM) ShortCut в ней работает, но так же работает и в основной форме приложения, если фокус находится на её компонентах.
  • после открытия двух форм(аналогов GRID_FORM)  в каждой срабатывает свой обработчик, но если фокус на основной форме приложения, то срабатывает обработчик формы, созданной первее.
  • после создания двух форм(аналогов GRID_FORM) и в каждой из них дочерних форм(аналогов DATA_EDIT_FORM) нажатия горячих клавиш в них, так же, ведут себя странно...

Хочется в 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
выход тут один создавать с другим овнером и убивать формы которые породил ручками

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)