Форум: "Основная";
Текущий архив: 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.036 c