Динамически изменить обработчик события
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 то все нормально.
Может кто нибудь занает что я делаю не так ?
Цитата: 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 то все нормально.
Может кто нибудь занает что я делаю не так ?
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 того класса который в экзешнике, и общайся с ним наздоровье через указатель на этот класс
Цитата: oxotnik333
подключи в длл *.h/*.hpp того класса который в экзешнике, и общайся с ним наздоровье через указатель на этот класс
Я бы рад, но у меня нет возможности получить исходные тексты exe файла.
Цитата: Snikex
Я бы рад, но у меня нет возможности получить исходные тексты exe файла.
Объясните по человечески - в чем ваша проблема? Вы вправе нахзначить обработчиком события любую функцию, которая вам нравиться. Лишь бы она соответствовала требованиям.
Ошибка, связанная с доступом к памяти может быть вызвана чем угодно - она проявляется только при выводе сообщения или же это частный случай?
Оформляйте свои сообщения в соответтсвии с требованием правил топика.
Проблема возникает при любом способе показать vcl форму. Форма появляется, работает, но при закрытии возникает ошибка доступа к памяти. На самом деле я не был уверен что можно назначать обработчиком события метод класса не являющегося классом формы, которой принадлежит менюшка. Насчет памяти: я везде создавал объекты операцией new и не удалял в целях отладки.
Цитата: Snikex
Проблема возникает при любом способе показать vcl форму. Форма появляется, работает, но при закрытии возникает ошибка доступа к памяти. На самом деле я не был уверен что можно назначать обработчиком события метод класса не являющегося классом формы, которой принадлежит менюшка. Насчет памяти: я везде создавал объекты операцией new и не удалял в целях отладки.
Не удалял в целях отладки - это прелестно :)
Скорей всего проблема в том что форма удаляется некорректно.
В дллке нужно чистить память помаксимуму. Всё удалять. И поменьше всего в DLL_PROCESS_ATTACH, и DLL_PROCESS_DETACH. Оно может и будет работать но не всегда верно, и возможно ошибка как раз в этом.