Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Основна";
Поточний архів: 2002.12.23;
Завантажити: [xml.tar.bz2];

Вниз

Класи Знайти схожі гілки


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;
Завантажити: [xml.tar.bz2];

Вгору





Пам'ять: 0.58 MB
Час: 0.056 c
14-74945
Марконі
2002-12-02 20:31
2002.12.23
а як? можливо користувачі задають дуже багато запитань!


14-74899
hedgehoge
2002-12-04 12:41
2002.12.23
Перекомпіліть


1-74766
JC
2002-12-06 12:42
2002.12.23
Як призупинити виконання процедури, щоб всі інші


1-74650
harismatik
2002-12-12 18:50
2002.12.23
Позиціонування курсора в ListView


1-74680
світлячок
2002-12-13 11:21
2002.12.23
Редактор форм ... чи





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська