Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Классы [D5, Win95/98]


dakus ©   (2002-12-10 11:33:00) 

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


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

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


han_malign   (2002-12-10 15:37:00) [2]

Никакую - наследование подразумевает повторное использование исходного кода, а значит перекомпиляцию.
З.Ы. Хотя при изменениикласса в 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 15:17:00) [3]

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


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

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


Skier   (2002-12-10 13:21:00) [5]

>dakus

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


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

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


han_malign   (2002-12-10 12:43:00) [6]

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


dakus   (2002-12-10 12:20:00) [7]

То Skier:

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


dakus   (2002-12-10 12:18:00) [8]

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


han_malign   (2002-12-10 12:12:00) [9]

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 одинакова.


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо