Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
1-1088086666
FX
2004-06-24 18:17
2004.07.11
Preview


1-1088441797
NovaPS
2004-06-28 20:56
2004.07.11
Закрытие программы после ошибки


1-1088344540
Demion
2004-06-27 17:55
2004.07.11
доступ к объектам


14-1087913545
artis
2004-06-22 18:12
2004.07.11
Создание патча


14-1087924591
Zeqfreed
2004-06-22 21:16
2004.07.11
bmp2txt





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский