Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.23;
Скачать: CL | DM;

Вниз

Классы   Найти похожие ветки 

 
dakus   (2002-12-10 11:33) [0]

Необходимо вынести классы в отдельные модули
для использования в других Delphi и Cbuilder
программах.
Как я понимаю dll для этого не подходит?
Какую технологию использовать


 
Skier ©   (2002-12-10 11:45) [1]

>dakus
Пакеты.
На этом сайте есть статья поэтому поводу...Пошукай...


 
han_malign ©   (2002-12-10 12:12) [2]

COM, OLE, ActiveX - универсально(для Must Die), полезно разобраться, но гемморойно.
DLL - вполне подходит, но нужно грамотно строить абстрактный интерфейс:

{ObjIFace.pas}
unit ObjIFace;
interface
type TObjIFace = class
public
function Method1(...): TType1;virtual; abstract;
................
function MethodN(...): TTypeN;virtual; abstract;
end;
end;

{ObjImplementation.dpr}
library ObjImplementation;
uses
type TObjImpl = class(TObjIFace)
public
constructor Create; //абстрактный конструктор и деструктор - думаю перебор - для них обертка обычно делается
destructor Destroy;override;
function Method1(...): TType1;override;
................
function MethodN(...): TTypeN;override;
end;
constructor TObjImpl.Create;
begin ... end;
destructor TObjImpl.Destroy;
begin ... end;
function TObjImpl.Method1(...): TType1;
begin ... end;
................
function TObjImpl.MethodN(...): TTypeN;override;
begin ... end;
//обертка для конструктора и деструктора
function CreateObj: TObjIFace;
begin Result:=TObjImpl.Create;end;
Procedure FreeAndNilObj(var aObj: TObjIFace);
begin aObj.Free; aObj:=nil; end;
end.

{Main.pas}
unit Main;
implemantation
uses ObjIFace;
function CreateObj: TObjIFace;external "ObjImplementation";
Procedure FreeAndNilObj(var aObj: TObjIFace);external "ObjImplementation";
var _obj: TObjIFace;
begin
_obj:=CreateObj;
_obj.Method...
FreeAndNilObj(_obj);
end.

- соответственно определяешь абстрактный интерфей для CBilder-а, структура классов и RTTI у них с Delphi одинакова.


 
dakus   (2002-12-10 12:18) [3]

to han_malign:
А наследование в программе от класса в Dll, я могу делать?


 
dakus   (2002-12-10 12:20) [4]

То Skier:

если я поменял что-то в пакете, ехе нужно перекомпилять?


 
han_malign ©   (2002-12-10 12:43) [5]

А вот это уже фигушки, только аггрегацию(спользовать оберточный класс одним из private полей которого будет импортируемый, и делать для каждого метода обертку).
Вообще DLL используется для полной инкапсуляции класса во внешней библиотеке(для PlugIn-ов скажем, вместо старого overload), для возможности наследования - 100% BPL, причем линкуемый статически.


 
Skier ©   (2002-12-10 13:21) [6]

>dakus

> А наследование в программе от класса в Dll, я могу делать?


Существует 4 ограничения на экспорт объектов DLL :

1) Объекты должны создаваться внутри DLL
2) Host-приложение может использовать лишь виртуальные методы
класса
3) Экспортируемый объект должен быть объявлен и внутри DLL и
внутри Host-приложения, причём объявление методов и там там
должно быть строго в одном и том же порядке
4) Нельзя создавать объект-потомок из объекта в DLL


 
dakus   (2002-12-10 14:19) [7]

Так какую технологию лучше использовать если:
1. нужно наследование
2. при изменении в классе, не перекомпилять exe


 
dakus   (2002-12-10 15:17) [8]

Мастера, Вы где?
Помогите.


 
han_malign ©   (2002-12-10 15:37) [9]

Никакую - наследование подразумевает повторное использование исходного кода, а значит перекомпиляцию.
З.Ы. Хотя при изменении класса в DLL, если не изменялся интерфейс, достаточно перекомпилять DLL. (выделяешь реализацию(implementation) класса в отдельный модуль(unit), если нужно делаешь новый модуль в котором наследуешься и компилишь очередную DLL с нужным модулем, или фабрику классов делаешь)

{ObjImplementation13.dpr}
library ObjImplementation13;
uses ObjImpl13;
function CreateObj: TObjIFace;
begin Result:=TObjImpl13.Create;end;
Procedure FreeAndNilObj(var aObj: TObjIFace);
begin aObj.Free; aObj:=nil; end;
end.

- при этом замена с переименованием DLL - приведет к изенению функциональности использующей программы(а-ля PlugIn), можно держать набор DLL для использования, скажем, разных девайсин, и непосредственной адаптации программного пакета для каждого конкретного клиента.
З.З.Ы. Интересно как ты хочешь пронаследовать класс в программе и при этом не перекомпилить ее???


 
dakus   (2002-12-10 17:04) [10]

Меняется реализация функции set какого-либо свойства из private класса.
Вызов остался старый - зачем менять основную прогу?
И все-таки если нужно наследование, но класс
что бы был в отделном модуле, как делать?



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

Текущий архив: 2002.12.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
6-74862
evgeniy1
2002-10-26 03:30
2002.12.23
Почта


3-74594
Tiny
2002-12-04 08:31
2002.12.23
DBGrid и картинки....


6-74865
MK
2002-10-20 19:02
2002.12.23
IP в доменное имя


1-74686
viper
2002-12-13 12:18
2002.12.23
Проблема с переносами!


8-74850
Вован2
2002-09-08 19:25
2002.12.23
Поворот изображения