Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизAction из DLL Найти похожие ветки
← →
AlexG © (2004-06-22 16:02) [0]Как мне присвоить экшн элементу меню, если экшн находится в DLL?
← →
WondeRu © (2004-06-22 16:36) [1]самый простой вариант:
делаешь экспортируемую фунцкию в длл, которая бы возвращала указатель на твой "экшн" (MyAction)!
типа:
function GetClickAction: Pointer;export;
begin
Result := @MyAction;
end;
затем
в главной проге делаешь:
MenuItem1.OnClick := GetClickAction;
тока MyAction должен быть объявлен также как и OnClick, т.е.
procedure MyAction(Sender: TObject);
вроду так!
← →
AlexG © (2004-06-22 16:49) [2]Угу.... А если у меня элемент добавился путем автоматического Merge? Как у MDI-окон?
← →
wisekaa © (2004-06-22 17:03) [3]
> [2] AlexG © (22.06.04 16:49)
> Угу.... А если у меня элемент добавился путем автоматического
> Merge? Как у MDI-окон?
Так присваивать надо до Merge!
← →
AlexG © (2004-06-22 17:25) [4]Он и присвоин, только после merge теряется. Да, форма тоже в ДЛЛ и это меню - ее.
← →
WondeRu © (2004-06-22 17:51) [5]муть какая-то ничего не понял! причем тут длл тогда
← →
evvcom © (2004-06-22 17:53) [6]
> тока MyAction должен быть объявлен также как и OnClick,
> т.е.
> procedure MyAction(Sender: TObject);
Не так. OnClick объявлен как TNotifyEvent, а TNotifyEvent = procedure(Sender: TObject) of object! Т.е. как метод класса, а это разные вещи.
Вообще я бы не стал хранить объекты VCL в разных модулях. А уж если очень хочется, то включи использование runtime пакетов. Но учти, что эта dll сможет работать только с exe, откомпиленным в той же версии Delphi и с ее runtime bpl-ками.
← →
AlexG © (2004-06-22 20:44) [7]Я работаю без BPL. Похоже нужно получше объяснить ситуацию.
Я создал MDI-окно дочернее. Из главной формы загружаю его. В дочерней форме у меня есть определенные опреации, подцепленные ActionList"ом. В дочернюю форму я добавил MainMenu. Теперь, при открытии дочернего окна, к меню главной формы присоединяются элементы меню дочернего окна, но операции, связанные с этими пунктами меню, теряются, хотя в design-time все прописано как надо. Вот мне и интересно как все-таки заставить работать эти пункты меню по моим правилам?
← →
Arnold © (2004-06-22 21:14) [8]>Не так. OnClick объявлен как TNotifyEvent, а TNotifyEvent = >procedure(Sender: TObject) of object! Т.е. как метод класса, а >это разные вещи.
Не так. TNotifyEvent - к методу класса не какого отношения не имеет. На самом деле TNotifyEven - это ничто иное как указатель на метод. Т.е. надо объявлять как указатель на метод
← →
AlexG © (2004-06-23 12:20) [9]Не оффтопте, пожалуйста.
← →
Amoeba © (2004-06-23 12:23) [10]Ох уж эта любовь к формам в DLL! И сколько граблей в результате!
← →
AlexG © (2004-06-23 12:35) [11]Если эта грабля, то кто-то должен знать. Но никто мне не ответил до сих пор. Значит - это не грабля.
← →
evvcom © (2004-06-23 14:43) [12]
> TNotifyEvent - к методу класса не какого отношения не имеет.
Вот именно, что имеет.
> На самом деле TNotifyEven - это ничто иное как указатель
> на метод. Т.е. надо объявлять как указатель на метод
Вот это правильно.
> procedure MyAction(Sender: TObject);
А это не есть метод. Методом будет procedure TMyClass.MyAction(Sender: TObject);
> Не оффтопте, пожалуйста.
Прошу прощения. Но эти советы относились к Вам.
> Я работаю без BPL.
Ну а с dll работаете? Судя по
> Action из DLL
должны работать. BPL в принципе те же dll. Если с dll всё же работаете, то я уже писал:
> Вообще я бы не стал хранить объекты VCL в разных модулях.
> А уж если очень хочется, то включи использование runtime
> пакетов. Но учти, что эта dll сможет работать только с exe,
> откомпиленным в той же версии Delphi и с ее runtime bpl-ками.
← →
AlexG © (2004-06-23 15:37) [13]>evvcom
То, о чем вы рассуждаете, меня не интересует, т.к. я это знаю. Как описать метод, чтобы потом его подключить к событию - не проблема. У меня другой вопрос: AlexG © (22.06.04 20:44) [7] Там дальше первой строки нужно почитать. Так вот, все элементы для одного окна хранятся в одной DLL. Проблема возникает при операции Merge меню дочернего окна с главной формой. Пункты меню теряют привязанные им обработчики событий.
← →
evvcom © (2004-06-23 15:52) [14]Еще раз.
> Так вот, все элементы для одного окна хранятся в одной DLL.
> Проблема возникает при операции Merge меню дочернего окна
> с главной формой.
А главная форма где? В другом модуле exe-файле?
← →
AlexG © (2004-06-23 16:08) [15]Да.
← →
evvcom © (2004-06-23 16:32) [16]Тогда читай мои предыдущие посты!
← →
AlexG © (2004-06-23 16:40) [17]Там нет ответа на мой вопрос.
← →
evvcom © (2004-06-23 16:51) [18]Ответ в том, что
> Вообще я бы не стал хранить объекты VCL в разных модулях.
> А уж если очень хочется, то включи использование runtime
> пакетов. Но учти, что эта dll сможет работать только с exe,
> откомпиленным в той же версии Delphi и с ее runtime bpl-ками.
Хорошо, поясню. Если не использовать runtime-пакеты (*.bpl), то код методов одного и того же класса дублируется и в exe, и в dll, и по сути эти классы становятся двумя разными классами! Хотя и с полностью идентичным кодом. Когда работаешь c объектом одного класса в коде другого класса могут происходить абсолютно непредсказуемые вещи и практически всегда натыкаешься на полную неработоспособность кода.
Выход:
1. Не хранить никакие сложные объекты (в том числе и VCL) в разных модулях.
или
2. Использовать runtime библиотеки. Тогда дублирование кода класса исключается. Весь код хранится и корректно отрабатывает в runtime package.
← →
AlexG © (2004-06-23 16:57) [19]Эта та форма, которую я понял. Спасибо большое.
← →
WondeRu © (2004-06-23 17:14) [20]evvcom © versus AlexG ©
Who wins?
← →
AlexG © (2004-06-23 17:22) [21]WondeRu
Не было никакого версуса. evvcom © мне помог разобраться.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c