Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамически изменить обработчик события

19K
20 февраля 2008 года
Snikex
32 / / 03.04.2007
Сегодня столкнулся с проблемой: Имеется приложение с меню и подключаемая динамически библиотека dll, в эту библиотеку передается указатель на главную форму, требуется добавить несколько пунктов в меню этой формы и задать им обработчики. С добавлением все просто: получаю указатель на меню:
g_ModuleInfo - Структура с информацией для модуля.

void CModuleHandler::CreateMenu()
{
TForm * pForm = g_ModuleInfo.pMainForm;
CreateMenu(TMenuItem * pMenuOtcheti)
TMainMenu * pMainMenu = pForm->Menu;
TMenuItem * pWorkMenuItem = pMainMenu->Items->Items[3];
TMenuItem * pNewItem = new TMenuItem(pWorkMenuItem);
pWorkMenuItem->Add(pNewItem);
pNewItem->Caption = "Test";
pNewItem->OnClick = MenuTestClick;
}

Меня интерисует последний пункт. Можно ли назначить обработчик меню из другого класса (не из класса главной формы сменю). Вель обработчик "MenuTestClick" я делаю так:

class CModuleHandler : public TObject
{
__published:
void __fastcall MenuTestClick(TObject *Sender);

public:
void CreateMenu();
};

Если в обработчике MenuTestClick написать ShowMessage("Test") то при щелчке по меню покажется сообщение, а потом будет ошибка дроступа к памяти по нулевому адресу.

Если же ShowMessage заменить на MessageBox то все нормально.
Может кто нибудь занает что я делаю не так ?
11
20 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Snikex
Сегодня столкнулся с проблемой: Имеется приложение с меню и подключаемая динамически библиотека dll, в эту библиотеку передается указатель на главную форму, требуется добавить несколько пунктов в меню этой формы и задать им обработчики. С добавлением все просто: получаю указатель на меню:
g_ModuleInfo - Структура с информацией для модуля.

void CModuleHandler::CreateMenu()
{
TForm * pForm = g_ModuleInfo.pMainForm;
CreateMenu(TMenuItem * pMenuOtcheti)
TMainMenu * pMainMenu = pForm->Menu;
TMenuItem * pWorkMenuItem = pMainMenu->Items->Items[3];
TMenuItem * pNewItem = new TMenuItem(pWorkMenuItem);
pWorkMenuItem->Add(pNewItem);
pNewItem->Caption = "Test";
pNewItem->OnClick = MenuTestClick;
}

Меня интерисует последний пункт. Можно ли назначить обработчик меню из другого класса (не из класса главной формы сменю). Вель обработчик "MenuTestClick" я делаю так:

class CModuleHandler : public TObject
{
__published:
void __fastcall MenuTestClick(TObject *Sender);

public:
void CreateMenu();
};

Если в обработчике MenuTestClick написать ShowMessage("Test") то при щелчке по меню покажется сообщение, а потом будет ошибка дроступа к памяти по нулевому адресу.

Если же ShowMessage заменить на MessageBox то все нормально.
Может кто нибудь занает что я делаю не так ?



подключи в длл *.h/*.hpp того класса который в экзешнике, и общайся с ним наздоровье через указатель на этот класс

19K
20 февраля 2008 года
Snikex
32 / / 03.04.2007
Цитата: oxotnik333
подключи в длл *.h/*.hpp того класса который в экзешнике, и общайся с ним наздоровье через указатель на этот класс



Я бы рад, но у меня нет возможности получить исходные тексты exe файла.

1
20 февраля 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Snikex
Я бы рад, но у меня нет возможности получить исходные тексты exe файла.



Объясните по человечески - в чем ваша проблема? Вы вправе нахзначить обработчиком события любую функцию, которая вам нравиться. Лишь бы она соответствовала требованиям.
Ошибка, связанная с доступом к памяти может быть вызвана чем угодно - она проявляется только при выводе сообщения или же это частный случай?

1
20 февраля 2008 года
kot_
7.3K / / 20.01.2000
Оформляйте свои сообщения в соответтсвии с требованием правил топика.
19K
20 февраля 2008 года
Snikex
32 / / 03.04.2007
Проблема возникает при любом способе показать vcl форму. Форма появляется, работает, но при закрытии возникает ошибка доступа к памяти. На самом деле я не был уверен что можно назначать обработчиком события метод класса не являющегося классом формы, которой принадлежит менюшка. Насчет памяти: я везде создавал объекты операцией new и не удалял в целях отладки.
1
20 февраля 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Snikex
Проблема возникает при любом способе показать vcl форму. Форма появляется, работает, но при закрытии возникает ошибка доступа к памяти. На самом деле я не был уверен что можно назначать обработчиком события метод класса не являющегося классом формы, которой принадлежит менюшка. Насчет памяти: я везде создавал объекты операцией new и не удалял в целях отладки.


Не удалял в целях отладки - это прелестно :)
Скорей всего проблема в том что форма удаляется некорректно.

9.3K
25 февраля 2008 года
iridum
175 / / 26.08.2007
В дллке нужно чистить память помаксимуму. Всё удалять. И поменьше всего в DLL_PROCESS_ATTACH, и DLL_PROCESS_DETACH. Оно может и будет работать но не всегда верно, и возможно ошибка как раз в этом.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог