| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Plugin |
| Автор: <Spawn> 28.6.2003, 10:25 | ||
Хочется сделать что то типа плагинов к своим прогам, но вот не поиму как, например, добавить из ДЛЛ еще один TTabSheet в TPageControl своей проги? Например, использование подобного кода приводит к ошибке.
|
| Автор: &-ray 28.6.2003, 13:18 | ||||
Скорее всего ошибка здесь:
Почему nil Здесь по-моему должен быть владелец твоего ttabsheet типа tpagecontrol А вообще в help'е в Делфях сказано так
|
| Автор: <Spawn> 28.6.2003, 13:33 | ||
Ну к примеру, если я передам PageControl по ссылке то вылетает Access Vialetion
|
| Автор: <Spawn> 28.6.2003, 13:39 |
| Если же передавать не по ссылке PageControl, то возникает ошибка EStackOverflow. |
| Автор: dm9 28.6.2003, 14:15 | ||
| ИМХО, так и не должно работать. Кто ж вызывает так метод Create? Надо, насколько я знаю, так:
Только: 1) Не забывай освобождать память. nil дело плохое. Лучше передавай в процедуру того, кто будет владельцем - потом проблем меньше будет. 2) Не уверен, что строка Result.Caption := 'TestTabSheet'; будет работать. Хотя, если откомпилирует, то всё ОК. Просто я не уверен, то можно так обращаться к переменное Result. Хотя хз. Делфей нет, проверить не могу. 3) Если передашь в процедуру того, кто будет Parent'ом, проблем будет меньше: он может быть Owner'ом и сразу скажешь, что он Parent. (Хотя нужен ли TabSheet'у Parent? Не помню |
| Автор: <Spawn> 28.6.2003, 14:24 |
| Дак записи типа Result:=TTabSheet.Create(nil) и with Result.Create(nil) do это одно и то же |
| Автор: dm9 28.6.2003, 14:26 |
| Тьфу ты, сорри. |
| Автор: dm9 28.6.2003, 16:32 | ||||
Я тут поразмышлял немного и понял, что был прав. Не одно это и то же. Ты пишешь код, эквивалентный этому:
Такое не работает по определению. Тогда уж так делай:
У тебя ошибка возникает при вызове ф-ции dll. В моём коде такой ошибки нет. Другое дело, что потом, уже в теле основной программы, я не могу ничего сделать с полученным указателем TabSheet := Proc; - работает TabSheet.PageControl := PageControl1; - возникает ошибка (cannot assign TFont to TFont) В чём дело - не пойму. Может, ещё какие директивы надо указывать? Я с dll очень мало работал... |
| Автор: &-ray 28.6.2003, 22:28 | ||||
| 2<Spawn> А вот так не пробовал
2dm9
Лично я не понял, что ты этим хотел сказать |
| Автор: Fantasist 30.6.2003, 17:18 | ||||||||||
Естесственно, это совсем НЕ одно и то же. Например, равносильны ли следующие строчки кода:
и
Бросте эту ерунду. Дело в том, что для с классами, которые возвращает dll не работает RTTI. То есть, так как дллка компилируется отдельно от ехе-шника, то в каждом из них создается своя таблица с информацией о классах. Эти таблицы сравниваются примитивно, по равности указателя на них. Так что даже если эти таблицы абсолютно идентичны, то они будут считаться как принадлежащие разным классам. VCL довольно плотно использует RTTI, например в процедуре Assign:
Так как процедура Assign скомпилированна в ехе, а Source в dll, то эта проверка обламывает присвоение на корню. Так что передавать туда-сюда ссылки (dll->exe и наоборот) на VCL-вские компоненты и пытаться их использовать гиблое дело. Плагины лучше писать при помощи пакетов. |
| Автор: Vyacheslav 8.7.2003, 08:22 | ||||
Эти вопросы легко снимаются, если для основного приложения и плагинов включить опцию "Build with runtime package". Во всяком случае это справедливо для Builder'а. В этом случае виртуальные таблицы классов (или как там они в Delphi называются) будут присутствовать для одинаковых классов в одном экземпляре |
| Автор: Fantasist 8.7.2003, 23:17 | ||
Да, я помниться, рекомендовал то же самое, однако, коли плагин пишиться для Delphi/Builder, то и оформить его логично в виде package'а, а не dll. |