Главная страница
    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.47 MB
Время: 0.007 c
14-74909
Anatoly Podgoretsky
2002-11-29 07:37
2002.12.23
Именинники 29 ноября


6-74872
Barman
2002-10-19 10:54
2002.12.23
Поймать сообщение net send


1-74631
Svin
2002-12-12 02:02
2002.12.23
Мате Матика


1-74671
^Sanya
2002-12-12 23:28
2002.12.23
ActionManager...


4-75038
eruc
2002-11-10 07:06
2002.12.23
блокируем все КЛАВИШИ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский