![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Хочется сделать что то типа плагинов к своим прогам, но вот не поиму как, например, добавить из ДЛЛ еще один TTabSheet в TPageControl своей проги? Например, использование подобного кода приводит к ошибке.
Это сообщение отредактировал(а) <Spawn> - 28.6.2003, 10:25 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| &-ray |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 406 Регистрация: 15.4.2003 Где: Казахстан, г Аста на Репутация: нет Всего: нет |
Скорее всего ошибка здесь:
Почему nil Здесь по-моему должен быть владелец твоего ttabsheet типа tpagecontrol А вообще в help'е в Делфях сказано так
-------------------- "Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б. -------------------- И снова мышь беру я в руки Куда иду? - Конечно в сруки! |
||||
|
|||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Ну к примеру, если я передам PageControl по ссылке то вылетает Access Vialetion
Это сообщение отредактировал(а) <Spawn> - 28.6.2003, 13:35 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Если же передавать не по ссылке PageControl, то возникает ошибка EStackOverflow.
Это сообщение отредактировал(а) <Spawn> - 28.6.2003, 13:40 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 6 Всего: 137 |
ИМХО, так и не должно работать.
Кто ж вызывает так метод Create? Надо, насколько я знаю, так:
Только: 1) Не забывай освобождать память. nil дело плохое. Лучше передавай в процедуру того, кто будет владельцем - потом проблем меньше будет. 2) Не уверен, что строка Result.Caption := 'TestTabSheet'; будет работать. Хотя, если откомпилирует, то всё ОК. Просто я не уверен, то можно так обращаться к переменное Result. Хотя хз. Делфей нет, проверить не могу. 3) Если передашь в процедуру того, кто будет Parent'ом, проблем будет меньше: он может быть Owner'ом и сразу скажешь, что он Parent. (Хотя нужен ли TabSheet'у Parent? Не помню Это сообщение отредактировал(а) dm9 - 28.6.2003, 14:17 |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Дак записи типа
Result:=TTabSheet.Create(nil) и with Result.Create(nil) do это одно и то же -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 6 Всего: 137 |
Тьфу ты, сорри.
|
|||
|
||||
| dm9 |
|
||||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 6 Всего: 137 |
Я тут поразмышлял немного и понял, что был прав. Не одно это и то же. Ты пишешь код, эквивалентный этому:
Такое не работает по определению. Тогда уж так делай:
У тебя ошибка возникает при вызове ф-ции dll. В моём коде такой ошибки нет. Другое дело, что потом, уже в теле основной программы, я не могу ничего сделать с полученным указателем TabSheet := Proc; - работает TabSheet.PageControl := PageControl1; - возникает ошибка (cannot assign TFont to TFont) В чём дело - не пойму. Может, ещё какие директивы надо указывать? Я с dll очень мало работал... |
||||
|
|||||
| &-ray |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 406 Регистрация: 15.4.2003 Где: Казахстан, г Аста на Репутация: нет Всего: нет |
2<Spawn>
А вот так не пробовал
2dm9
Лично я не понял, что ты этим хотел сказать Это сообщение отредактировал(а) &-ray - 28.6.2003, 22:31 -------------------- "Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б. -------------------- И снова мышь беру я в руки Куда иду? - Конечно в сруки! |
||||
|
|||||
| Fantasist |
|
||||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Естесственно, это совсем НЕ одно и то же. Например, равносильны ли следующие строчки кода:
и
Бросте эту ерунду. Дело в том, что для с классами, которые возвращает dll не работает RTTI. То есть, так как дллка компилируется отдельно от ехе-шника, то в каждом из них создается своя таблица с информацией о классах. Эти таблицы сравниваются примитивно, по равности указателя на них. Так что даже если эти таблицы абсолютно идентичны, то они будут считаться как принадлежащие разным классам. VCL довольно плотно использует RTTI, например в процедуре Assign:
Так как процедура Assign скомпилированна в ехе, а Source в dll, то эта проверка обламывает присвоение на корню. Так что передавать туда-сюда ссылки (dll->exe и наоборот) на VCL-вские компоненты и пытаться их использовать гиблое дело. Плагины лучше писать при помощи пакетов. -------------------- Волны гасят ветер... |
||||||||||
|
|||||||||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 59 |
Эти вопросы легко снимаются, если для основного приложения и плагинов включить опцию "Build with runtime package". Во всяком случае это справедливо для Builder'а. В этом случае виртуальные таблицы классов (или как там они в Delphi называются) будут присутствовать для одинаковых классов в одном экземпляре -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Да, я помниться, рекомендовал то же самое, однако, коли плагин пишиться для Delphi/Builder, то и оформить его логично в виде package'а, а не dll. -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |