Формы/фреймы из dll

SanSYS

Есть такая тема - в dll необходимо хранить различные формы, которые будутвызываться из exe-шника, и родителем этих форм будет какая-нить панель.Предполагается, что подгруженые формы будут взаимодействовать с главной формой-родителем.вопрос: сможет ли подгруженная форма использовать компоненты главной формы? и чем это объясняется?
24 ответа

SanSYS

вопрос: сможет ли подгруженная форма использовать компоненты главной формы?
Да.
и чем это объясняется?
мнэ... архитектурой процессора?


SanSYS

а как же можно-то скомпилировать dll, если нет компонентов, к коим должн обращаться форма, 
раз уж они расположены на вызывающей форме?


SanSYS

Например можно передавать указатель на форму в dll и искать нужный компонент на переданной форме, или организовать обработку по сообщениям(из dll кидаем сообщение главной форме, в главной форме его ловим, обрабатываем его и выполняем какие-то действия)


SanSYS

предполагается, что подгруженые формы будут взаимодействовать с главной формой-родителем, вопрос: сможет ли подгруженная форма использовать компоненты главной формы?
Вопрос предполагает неудачную архитектуру решения. Даже без DLL одна форма не должна трогать компоненты другой формы.


SanSYS

[src delphi]а как же можно-то скомпилировать dll, если нет компонентов, к коим должн обращаться форма, раз уж они расположены на вызывающей форме?
И что? "ТэФорма есть реальность данная нам в ощущениях"(~с)?Вы уж выражайтесь точнее, а то RTFM.по поводу второго : Uses ... MyForm;а это как вариант : Uses ... InterfaceToMyForm;И насколько оно нужно. Может стоить пересмотреть архитектуру?


SanSYS

решил проблему
<b>library</b> ss;

<b>uses</b>
 SysUtils,
 Classes,
 forms,
 windows,
 stdctrls,
 ...;

<i>{$R *.res}</i>

<b>var</b>

Form: TsM;

<b>procedure</b> formshow(TsCom1: TsCom); stdcall; export;
<b>begin</b>

 usm.TFrPolycomCom1 := TsCom1;

 Form:=TsM.Create(Application);
 Form.Show;
<b>end</b>;

<b>exports</b> formshow;


<b>begin</b>



<b>end</b>.
т.е. в качестве параметра глупо передаю объект с полным доступом к нему (no conctant)только так работает при статической загрузке dll, а при динамической - нет! в чем проблема?


SanSYS

Вариантов много, приведенного кода мало.Поиск здесь по словам, например, "формы в dll" и т.п. пробовали? Тема довольно заезженная.


SanSYS

нашел проблему при динамическом вызове: я просто-напросто забыл stdcall, теперь все замечательно, даже лучше чем хотелось


SanSYS

я просто-напросто забыл stdcall
тоже позавчера полчаса не мог врубиться, откуда ошибка появилась (изменил прототип функции и забыл про stdcall)


SanSYS

честно говоря не очень понял как решили проблему((((мне тоже надо из dll поменять некоторые параметры компонент на форме (допустим поменять Caption на кнопках)передаю в функцию form1:TForm длл не компилится, т.к. нет этих кнопок(((передавать в функцию каждый элемент формы не хочется.как бы устроить поиск(допустим по имени) и оращение к элементам формы.


SanSYS

CraMas,почитать про ООП


SanSYS

...одна форма не должна трогать компоненты другой формы.
Вы имеете в виду, что другая форма должна предоставить методы "троганья"?


SanSYS

Вы имеете в виду, что другая форма должна предоставить методы "троганья"?
Примерно так, хотя не совсем. Правильно будет сказать так: любой объект (и форма в том числе) должен предоставлять публичный интерфейс доступа к себе. В принципе, этот интерфейс может включать в себя свойства и члены- компоненты. Однако! Однако, компоненты форм насильственно делаются published там, где по смыслу задачи они в 99% случаев должны быть protected. Соответственно, в этих 99% случаев доступ к ним извне будет архитектурно плохим решением.


SanSYS

softwarer> ...будет архитектурно плохим решением. В контексте published/protected я бы еще добавил - хацкерским.С другой стороны, плагины и т.п.Какая разница, внедрить свое окно в чужое или чужое окно в свое... Главное, "интерфейсы"


SanSYS

С другой стороны, плагины и т.п.
Они с той же стороны. Публичные интерфейсы и никаких гвоздей.


SanSYS

Не лучшее решение передавать в DLL указатели на экземпляры классов, строчки, динамические массивы. Я б даже сказал отвратительное решение :).


SanSYS

самая лучшая решение не трогать из длл-ки какой нить обект который лежит в главной форме, лучше при создании давать нужные данные в длл и использовать их при выполнение операции.----www.hramin.jino-net.ru


SanSYS

softwarer> компоненты форм насильственно делаются published там,softwarer> где по смыслу задачи они в 99% случаев должны быть protected.Что лично меня всегда напрягало куда больше, чем другие багофичи Delphi.


SanSYS

Что лично меня всегда напрягало куда больше, чем другие багофичи Delphi.
Не соглашусь. Этим всегда можно не пользоваться, а при использовании dll возникает физическая преграда. "Куда больше" меня всегда напрягало использование дружественности. Почему - потому что в результате некоторые нужные снаружи вещи остаются в private, и в работе "связанных пар классов" - скажем, TStatusBar/TStatusPanels/TStatusPanel - возникали/возникают моменты, которые просто невозможно откорректировать в наследниках.


SanSYS

Этим всегда можно не пользоваться
Можно не. А можно не не. :)
при использовании dll возникает физическая преграда.
Собсно, этот подход уже обсуждался и не вижу смысла поднимать обсуждение вновь.Если вкратце - оно того не стоит, Вы один из немногих его поклонников, а я - нет.
"Куда больше" меня всегда напрягало использование дружественности.
Это тоже. Хотя в тех редких случаях, когда это действительно важно - можнобыло (в т.ч. временно, хотя лишняя морока) разносить классы по модулям.


SanSYS

Хотя в тех редких случаях, когда это действительно важно - можнобыло (в т.ч. временно, хотя лишняя морока) разносить классы по модулям.
Классы из чужих библиотек, особенно из VCL, несколько проблематично "временно разносить по модулям".


SanSYS

Классы из чужих библиотек, особенно из VCL, несколько проблематично "временно разносить по модулям".
А какое отношение дружественность классов чужих библиотек имеет отношение к Вам?


SanSYS

А какое отношение дружественность классов чужих библиотек имеет отношение к Вам?
Я же уже объяснил: я хочу сделать наследника. И натыкаюсь на то, что нужный для взаимодействия функционал убран в private. Базовый класс обращается к нему, пользуясь дружественностью, а наследник получает жирную фигу.


SanSYS

Базовый класс обращается к нему, пользуясь дружественностью, а наследник получает жирную фигу.
Так это кривоумие разработчика этого базового класса.