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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема в XE2: создание фрейма из dll 
V
    Опции темы
Alexeyt
Дата 6.2.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

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



есть форма, в которой создается фрейм. В фрейме вся "работа". Форма - дочерняя по отн. к главной форме (WS_CHILD or WS_MAXIMIZE в CreateParams ставится).

Delphi7:
вариант создания формы в .exe: все ОК
вариант создания формы в .dll (там нет главной формы- вместо нее наша форма стала дочерней по отн. к Totalcmd Lister): все ОК

XE2:
вариант создания формы в .exe: ОК
вариант создания формы в .dll: не работает.
Ошибка создания фрейма. Exception "Control EdFrame has not parent window" при создании класса фрейма в перекрытом конструкторе Create:

Код

constructor TEdFrame.Create(AOwner: TComponent); ///override;
begin
  inherited Create(AOwner);
  ....ставятся свойства фрейма....
end;


при вызове inherited Create(AOwner)- exception и фрейм то ли не создался, то ли просто не виден (Show не помогает). Если спрятать этот exception- лучше не становится.

В чем м.б. дело?

  
PM WWW   Вверх
dvamaster
Дата 6.2.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexeyt @  6.2.2012,  15:08 Найти цитируемый пост)
Exception "Control EdFrame has not parent window"

Тут все так и написано, свойство Parent не содержит родителя, т.е. той формы на которую кидается фрейм, XE2 его не устанавливает.
Придется его присвоить самостоятель.

Если парент и есть AOwner, то
Код

constructor TEdFrame.Create(AOwner: TComponent); ///override;
begin
  Parent := AOwner;
  ParentFont := false; // <-- и это обязательно, иначе ошибки полезут
  inherited Create(AOwner);
  ....ставятся свойства фрейма....
end;


И ЕЩЕ установи сразу фрейму ParentFont в FALSE, иначе и тут полезут ошибки, проверено.

Это сообщение отредактировал(а) dvamaster - 6.2.2012, 13:56


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Alexeyt
Дата 6.2.2012, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

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



хм. при вызове Parent:= AOwner as TWinControl получается "AV. read of addr 00000000".
Ты уверен что ДО вызова конструктора можно делать доступ к полям-методам? я нет.
Объект еще не создан

(Пробовал еще CreateParented((AOwner as TWincontrol).Handle))

PM WWW   Вверх
Alexeyt
Дата 6.2.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

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



Parent у меня ставится и так(ПОСЛЕ конструктора ес-но). Т.е. во время вызова конструктора Parent
не должен быть задан. А ошибка "no parent window". Может update XE2 ставить?
PM WWW   Вверх
bems
Дата 7.2.2012, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Alexeyt @  6.2.2012,  14:30 Найти цитируемый пост)
хм. при вызове Parent:= AOwner as TWinControl получается "AV. read of addr 00000000".
и не удивительно. Операторы as и is сравнивают указатели на типы (ну в конечном счете все приходит к сравнению указателей). Но TWinControl который предок овнера это указатель на класс в экзе, а TWinControl к которому ты пытаешься привести это указатель куда-то внутрь длл (ну или наоборот). Ясное дело что их сравнение никогда не даёт положительного результата. Более того, TWinControlы экзешника и дллки не обязаны быть идентичными, даже когда скомпилены одной версией компилятора с одной версией vcl
Сколько уже раз говорилось, что никогда нельзя передавать объекты через границы модулей, и использовать для этого нужно или интерфейсы, или bpl. Предупреждая вопрос почему в старой версии всё работало, отвечаю: это рандом. Классы не обязаны совпадать, но ты можешь не "зацепить" отличия между ними. Тогда до поры до времени всё будет работать.


Это сообщение отредактировал(а) bems - 7.2.2012, 11:19


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeyt
Дата 7.2.2012, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

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



из твоего объяснения понял только - нельзя передавать объекты в DLL. Но я и не передаю, все внутри одного модуля dll. Т.ч. твой текст не понял

решил. сделал вместо TEdFrame=class(TFrame) -- TEdFrame=class(TForm).

Добавлено через 2 минуты и 54 секунды
Цитата

Ясное дело что их сравнение никогда не даёт положительного результата. 


Тогда ошибка от as доблжна быть(Invalid type cast)
PM WWW   Вверх
bems
Дата 7.2.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Alexeyt @  7.2.2012,  12:45 Найти цитируемый пост)
Тогда ошибка от as доблжна быть(Invalid type cast) 
вообще да, недочитал. 

Цитата(Alexeyt @  7.2.2012,  12:45 Найти цитируемый пост)
Но я и не передаю, все внутри одного модуля dll
а как ты тогда взаимодействуешь с приложением?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeyt
Дата 7.2.2012, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

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



взаимодействую просто. У меня Totalcmd Lister plugin. Я создаю форму и передаю через API хендл
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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