Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> D2007 Горячие клавиши в TAction, Как отключить действие в дочерних формах 
:(
    Опции темы
ShadeSt
Дата 5.9.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Маленькая предистория:

В существующем проекте используется следующая схема создания форм:
  •  есть Главная форма(далее 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 схема обработки горячих клавиш ломается, и они начинают ловиться в дочерних формах, что приводит к очень нежелательным последствиям.

На просторах интернета упоминание нашли тут Shortcuts dispatched recursively in Delphi2007

Пример проблемы:
В приложенном к данному сообщению файлику лежит исходный код тестового проекта и несколько собранных версий - одна в D7, другая в D2007.
Проект, собранный в D7 особого интереса не представляет, т.к. в нем все работает так, как ожидается.
А проект, собранный в D2007 ведёт себя как минимум странно:
  • после открытия формы (аналог GRID_FORM) ShortCut в ней работает, но так же работает и в основной форме приложения, если фокус находится на её компонентах.
  • после открытия двух форм(аналогов GRID_FORM)  в каждой срабатывает свой обработчик, но если фокус на основной форме приложения, то срабатывает обработчик формы, созданной первее.
  • после создания двух форм(аналогов GRID_FORM) и в каждой из них дочерних форм(аналогов DATA_EDIT_FORM) нажатия горячих клавиш в них, так же, ведут себя странно...

Хочется в Delphi 2007 добиться поведения, аналогичного тому, что было...
Большая просьба, если кто-нибудь сталкивался с таким - отпишитесь!
Так же, если кто-либо знает решение, либо сталкивался с информацией по данному вопросу на просторах интернета - поделитесь решением/ссылками.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  testPrj.rar 365,46 Kb


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Frees
Дата 5.9.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



В D2006 turbu

если написать 
TempForm := TForm2.Create(Application);//а не self

то не будет токого поведение  



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ShadeSt
Дата 5.9.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Frees, в том то и дело, что необходимо именно описанное выше поведение, т.к. в дочерние формы (DATA_EDIT_FORM) в некоторых случаях передаются указатели на область памяти, где лежат данные. 
Таким образом закрытие основной формы (GRID_FORM) повлечет освобождение данной памяти и соответственно проблемы в формах (DATA_EDIT_FORM), если они не будут закрываться.
Все это криво конечно, если поразмыслить... но по факту так есть.

Да и чисто логически форма родитель должна закрывать своих потомков. То, что все формы будут уничтожаться при закрытии приложения - это как-то криво.



--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Frees
Дата 8.9.2008, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



ShadeSt, TForm2.Create(Application); так создавать формы только GRID_FORM, а DATA_EDIT_FORM с указанием Self в кострукторе

получится закрыв GRID_FORM все  DATA_EDIT_FORM закроются

Это сообщение отредактировал(а) Frees - 8.9.2008, 06:21


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ShadeSt
Дата 9.9.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Frees, спасибо!
Данное решение действительно решает описанную мной проблему.
Но тут есть другая проблемка... если ActionList будет на дочерней форме (на  DATA_EDIT_FORM), то его ShortCut 
будет обрабатываться и в GRID_FORM...



--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Frees
Дата 9.9.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



выход тут один создавать с другим овнером и убивать формы которые породил ручками


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1060 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.