Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Создание компонента через dll   Найти похожие ветки 

 
Nert   (2004-05-14 10:21) [0]

Нужно вызвать из dll функцию, которая создаст на форме (на любом родителе) компонент (например TLabel). У меня никак не получается, подскажите что не так делаю?

unit1.pas:

....
type
CreateLabel = procedure(hOwner: hInst; Owner: TComponent; Parent: TWinControl);
.....

procedure TForm1.FormCreate(Sender: TObject);
var
h: integer;
begin
LoadLibrary("myLib.dll");
ModuleInit(GetProcAddress(h, "ModuleInit"))(Owner, Form1);
end;
/////////////////////
/////////////////////
myLib.dpr:

library myLib;

uses
windows, StdCtrls, Classes, Controls;

var
L: TLabel;

procedure ModuleInit(Owner: TComponent; Parent: TWinControl);
begin
L:=TLabel.Create(Owner);
L.Caption:="Label1";
L.Parent:=Parent;
end;

exports
ModuleInit;

begin
end.

Сообщение о ошибке: Cannot assign a TFont to a TFont, хотя Label на форме появляется


 
jack128 ©   (2004-05-14 10:29) [1]

компилируй основную прогу и dll c run time packages


 
Reindeer Moss Eater ©   (2004-05-14 11:27) [2]

Чего никогда не понимал, так это мудрость создания экземпляров классов в DLL и возврат указателей на них в приложение.


 
Mim1 ©   (2004-05-14 13:16) [3]

[2] Reindeer Moss Eater ©   (14.05.04 11:27)

А чего тут непонятного?


 
Mim1 ©   (2004-05-14 13:58) [4]

Nert   (14.05.04 10:21)

Попробуйте, вдруг порокатит

procedure ModuleInit(Owner: TComponent; Parent: TWinControl);
begin
L:=TLabel.Create(Owner);
L.Caption:="Label1";
L.PARENTFONT := FALSE:
L.Parent:=Parent;
end;


 
Reindeer Moss Eater ©   (2004-05-14 14:01) [5]

Непонятно зачем это делать.

Допустим есть DLL, которая создает экземпляр TSomeCllass и возвращает указатель на него в основное приложение.
Основное приложение, если оно хочет работать с возвращенным экземпляром как с членом класса TSomeCllass должно при компиляции иметь в uses SomeClass.pas.

Спрашивается: зачем длл, если весь код класса прикомпилирован в exe?


 
jack128 ©   (2004-05-14 14:07) [6]


> Основное приложение, если оно хочет работать с возвращенным
> экземпляром как с членом класса TSomeCllass должно при компиляции
> иметь в uses SomeClass.pas.
>
> Спрашивается: зачем длл, если весь код класса прикомпилирован
> в exe?
вот из-за этого и нефига не работает у автора.  То что в класс дублируется и в exe и в DLL накладывает некоторые ограничения, практически смертельные для VCL - классов.


 
Mim1 ©   (2004-05-14 14:09) [7]

[5] Reindeer Moss Eater ©   (14.05.04 14:01)

Вот смотрите вкак устроена delphi. В BPL (такой же dll) имеется компонент TButton, а сама среда работает с ним оперируя методами предка и изменяя published свойства.
Похожая работа.

В общем же я согласен, автору не надо иметь экземпляр класса tfont дважды, выход тут имхо один - runtime пакеты.


 
Игорь Шевченко ©   (2004-05-14 14:15) [8]


>  В BPL (такой же dll) имеется компонент TButton, а сама
> среда работает с ним оперируя методами предка и изменяя
> published свойства.


Эт как ?


 
Mim1 ©   (2004-05-14 14:23) [9]

Я про дизайн тайм пакеты. Типо все отображаемые в списке компоненты наследники одного общего класса, грузятся они из BPL.


 
y-soft ©   (2004-05-14 14:33) [10]

В Dll не составляет никаких трудностей засунуть оконный контрол.
Тогда достаточно передавать в нее хендл родительского окна и прямоугольник отрисовки. При этом не надо мудрить с возвращением объектных ссылок - в Dll пусть будут свои классы (или чистый WinAPI), а в вызывающей программе свои, совершенно независимые классы-оболочки. Примерно таким образом, как организована в VCL работа со стандартными TEdit, TComboBox, контролами из ComCtl32.dll, стандартными диалогами etc...


 
y-soft ©   (2004-05-14 14:39) [11]

(Продолжение)

Под контролом в Dll, естественно подразумевается окно Windows, а не потомок TWinControl...


 
Reindeer Moss Eater ©   (2004-05-14 14:44) [12]

Нужно вызвать из dll функцию, которая создаст на форме (на любом родителе) компонент (например TLabel).

Итого имеем:
1. Экземпляр родителя определенного класса
2. Тип контрола, который необходимо создать в качестве чайлд контрола

Зачем передавать в DLL эти два параметра что бы все это произошло?
Что это дает?


 
evvcom ©   (2004-05-14 17:12) [13]

Подитожу. Если уж так надо, то выход

> jack128 ©   (14.05.04 10:29) [1]
> компилируй основную прогу и dll c run time packages

Но я солидарен с Reindeer Moss Eater ©   (14.05.04 11:27) [2]


 
sniknik ©   (2004-05-14 18:42) [14]

http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1070358516&n=0


 
Nert   (2004-05-14 18:51) [15]

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

Может есть более простой способ?

y-soft покажи небольшой пример


 
jack128 ©   (2004-05-14 20:33) [16]


> sniknik ©   (14.05.04 18:42)
скачал, в Dll при создании Application.CreateForm(TGridForm, GridForm); исключение EReadError in module MyDll.dll ;-)

> Подитожу. Если уж так надо, то выход
>
> > jack128 ©   (14.05.04 10:29) [1]
> > компилируй основную прогу и dll c run time packages>
> Но я солидарен с Reindeer Moss Eater ©   (14.05.04 11:27)
> [2]
при выполнении выделенного условия доводы RME станут некоректны ;-)


 
y-soft ©   (2004-05-14 20:49) [17]

>Nert   (14.05.04 18:51) [15]

Небольшого не получится :(

Посмотрите, как реализовано в VCL, это образцовые примеры. В Вашем конкретном случае совсем не обязательно реализовывать все, только обеспечить перерисовку при обновлении и инициализации.

TLabel не оконный контрол, с ним мороки больше, хотя можно наследовать класс-оболочку от TGraphicControl, в котором в методе Paint передавать в Dll хендл канвы и прямоугольник вывода, а уж там можно рисовать все, что угодно. Dll при необходимости можно грузить динамически. Придется, конечно, немного повозится с написанием и отладкой класса, но в результате - пара десятков килобайт Dll против нескольких мегабайт BPL...      

Еще вариант - в Delphi прекрасный визард для создания ActiveX из оконных контролов и есть примеры, но возникнут неудобства с необходимостью регистрации OCX...


 
sniknik ©   (2004-05-15 01:57) [18]

> скачал, в Dll при создании Application.CreateForm(TGridForm, GridForm); исключение EReadError in module MyDll.dll ;-)
?
не замечал. подробнее ошибку и версии виндов и дельфей pls.


 
Mim1 ©   (2004-05-15 14:42) [19]

Вместо Parent используйте ParentWindow.


 
evvcom ©   (2004-05-15 15:01) [20]


> jack128 ©   (14.05.04 20:33) [16]
> ... доводы RME станут некоректны


Вообще-то там вообще никаких доводов. Я могу привести свои некоторые (далеко не все) доводы.
минусы "создания экземпляров классов в DLL и возврат указателей на них в приложение" (RME [2]) даже при использовании run-time package: данную dll можно будет использовать только с exe, откомпилированными в той же версии Delphi, поэтому время жизни такой dll сильно ограничено.
плюсы: 1. Размер. Он важен, если делать постоянно апдейты и передавать их через Интернет, хотя бы на время тестирования.
2. Опять же размер. Если пишется "супер"-проект из множества exe, dll и т.д.

Если же пишется проект из одного exe и одной dll и не предполагается каждый день-два-неделю выкладывать апдейт в интернет, то я вообще не вижу смысл использования runtime package.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.037 c
4-1082118280
juiceman
2004-04-16 16:24
2004.05.30
Перехватывать ВСЕ сообщения


1-1084998752
Жека
2004-05-20 00:32
2004.05.30
Не понятен текст проги на TP.


9-1074697548
TButton
2004-01-21 18:05
2004.05.30
delphiX вывод текста


1-1084971857
sesh
2004-05-19 17:04
2004.05.30
Как быстро и просто сохранить 4 грида в 1 тектстовый файл


4-1082045074
Ирина Р.
2004-04-15 20:04
2004.05.30
Как отличить корзину от каталога





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский