Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к TAction в DLL 
:(
    Опции темы
GarryFV
Дата 26.9.2003, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.10.2002

Репутация: нет
Всего: нет



Суть в следующем:

Есть в программе кнопка и я хочу присвоить ей Action, находящийся в динамически подключаемой dll.

Создается и присваивается все нормально, но не изменяются некоторые свойства кнопки, которые изменяются, если Action в основном модуле. Например, Caption, Hint... Но все-таки Action отрабатывает при нажатии кнопки.

А вот если назначить этот Action пункту меню, то при нажатии (вызов метода Action.Execute) появляется бред в виде Exception - Invalid Typecast.

Если кто-нить разбирается во внутренностях VCL, напишите, plz - где ошибка?

Заранее благодарен.

P.S. И не надо говорить, что ошибка у меня в ДНК smile.gif. Это я и сам знаю smile.gif.

PM MAIL   Вверх
<Spawn>
Дата 26.9.2003, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Используй Package-и.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
GarryFV
Дата 30.9.2003, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.10.2002

Репутация: нет
Всего: нет



Те же яйца, только в профиль, однако.
А собственно, BPL- та же DLL (только в профиль smile.gif)

Я еще не сказал, что речь идет об интерфейсе plug-in -ов,
т.е. линковать нужно обязательно динамически.

Еще идеи есть?
PM MAIL   Вверх
dm9
Дата 30.9.2003, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



>А собственно, BPL- та же DLL

Я бы не сказал. BPL - очень удобный способ создавать плагины. Сложно будет передать куски интерфейса из dll в твою программу. С пакетами это - проще...
PM MAIL ICQ   Вверх
GarryFV
Дата 1.10.2003, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.10.2002

Репутация: нет
Всего: нет



Сложно... проще...

А можно поконкретнее что-нибудь, или где почитать, что-то в книгах эти темы не освещаются.
В лучшем случае просто говориться - чтобы создать пакет (или dll), делайте так! А нюансов никаких sad.gif

Так почему, когда назначаешь пункту меню основного приложения TAction, который находится в динамически подключаемой библиотеке,
происходит Exception - Invalid Typecast при обращении к этому пункту меню?

А если назначить этот Action кнопке, то все работает, НО кнопка не реагирует на Action.Enable / Disable ?
PM MAIL   Вверх
Dmitry V.Abramov
Дата 1.10.2003, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Цитата
Создается и присваивается все нормально, но не изменяются некоторые свойства кнопки, которые изменяются, если Action в основном модуле. Например, Caption, Hint... Но все-таки Action отрабатывает при нажатии кнопки.


Судя по тому, что не отрабатывают свойства с типом string, возникает глупый вопрос - с uses ShareMem все нормально?
--------------------
/DVA
PM MAIL WWW   Вверх
GarryFV
Дата 1.10.2003, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.10.2002

Репутация: нет
Всего: нет



Да, конечно с ShareMem все нормально - специально посмотрел в ProcessViewer-e юзается ли эта самая borlndmm.dll.

Причем смотрел RTTI объектов TAction созданных в основной форме и в DLL, типа:

var
ac: TAction;
ti: PTypeInfo;
td: PTypeData;

...

ac := Action1; // Action1 или в форме или в dll
ti := ac.ClassInfo();
td := getTypeData(ti);

При просмотре структуры в отладчике td^.r jбъекты в обоих случаях одинаковые за исключением одной вещи:

ClassType: TAction - для Action из формы и
ClassType: TClass($адрес) для Action из Dll

Во.

PM MAIL   Вверх
Fantasist
Дата 1.10.2003, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Давно изывестная вещь. Таблицы типов для dll и exe разные. То есть и тот и другой имеют эту таблицу, которую туда вкомпиливает компилятор. Так как делфи определяет тип простым сравнением указателей на таблицы, то объект одного и того же типа для dll и ехе будет иметь разный тип. То есть если ты создал в exe TAction и передал его в dll через параметр action, то проверка в dll: action is TAction вернет false. А приведение с использованием RTTI:
(action as TAction).DoSomething(); создаст исключение - плохой typecast. В то время как простой кастинг: TAction(action).DoSomething(); будет работать норамльно.
А пакеты как раз тем и отличаются, что они разделяют общую таблицу типов, и потому все в них происходит норамльно.



--------------------
Волны гасят ветер...
PM MAIL   Вверх
GarryFV
Дата 2.10.2003, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.10.2002

Репутация: нет
Всего: нет



Т.е. то, что я хочу невозможно в принципе. Ведь если я пункту меню из основной проги назначаю TAction из DLL, то при клике автоматом идет вызов (action as TAction).

Я пробовал это дело с run-time packag-ами. Разумеется и основной модуль и BPL, который plug-in.
Т.е. вышеупомянутая таблица у них должна быть одна.

Факт - exception не возникает, но все равно ничего не работает...
PM MAIL   Вверх
GarryFV
Дата 2.10.2003, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.10.2002

Репутация: нет
Всего: нет



Вот, что получилось.

Если передать в DLL форму из основного приложения и там создать Action с этим Owner-ом, то и действительно все работает smile.gif.

А я пытался в DLL создать Action и привязать его к форме в основном приложении, причем был вариант - пересылал в DLL Application и создавал Action с Owner=Application - не работало.

Усем бАльшой Тханкс!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.