Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.052 c
4-1085918432
Piter
2004-05-30 16:00
2004.07.11
Передача фокуса


3-1087192084
Tariel
2004-06-14 09:48
2004.07.11
InterBase - Сколько раз выполняется вложенный запрос в where


1-1088486764
ABL
2004-06-29 09:26
2004.07.11
Как из одного richedita передать часть текста в другой


1-1088136020
student__
2004-06-25 08:00
2004.07.11
Недоступно свойство потока Terminated


4-1085812822
Micah'GF
2004-05-29 10:40
2004.07.11
Как отловить перемещения мыши по экрану