Форум: "Основная";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
ВнизКак поместить класс в Dll или пакет? Найти похожие ветки
← →
Kolan © (2006-03-26 13:54) [0]Здравствуйте,
Например есть у меня класс:
TMyClass = class
public
function Foo: Integer;
end;
Я хочу использовать его во многих своих приложения.
Вариант 1.
Просто добавить Pas файл в проект, создать экземпляр (MyClass
) и писать...
Хотелось бы не включать его в проект а убрать в отдельный файл.
Вариант 2.
Можно использовать Dll(Не пробовал может тоже не получистя)
Тогда я в Dll создам экземпляр и сделаю интерфейс к нему.
Напримерfunction Foo: Integer;
begin
Result := MyClass.Foo ;
end;
Как правильнее это сделать?
А как с пакетами? Ну созунил я файл с классом вContains
пакета, скомпилировал, получил *.dpk...
Что дальше?
← →
Cash © (2006-03-26 21:21) [1]А где суть вопроса?
Имеешь ввиду, использовать неопределенное количество классов или их
потомков в своей проге?
← →
Kolan © (2006-03-26 22:46) [2]Нет.
Вот есть у меня класс
TMyClass = class
public
function Foo: Integer;
end;
с реализованой функциейFoo
Хотелось бы раз и навсегда скомпилировать этот класс, а потом подключать к проектам.
А где суть вопроса?
Суть вопроса - как это сделать...
Если я сделаю как в Варианте1, то при компиляции он будет каждый раз компилирроваться(Если вообще скомпилируется)...
Имеешь ввиду, использовать неопределенное количество классов или их
потомков в своей проге?
Нет мне нужен только один экземпляр. И без потомков. Просто интерфйс к нему. Блин незнаю как сказать...
← →
Lamer@fools.ua © (2006-03-27 09:37) [3]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
← →
Cash © (2006-03-27 09:58) [4]Kolan © (26.03.06 22:46) [2]:
Во! Сам ответил на свой вопрос! >> ... Просто интерфйс к нему ... :)
Сделай COM, или не COM, но, Interface, а методы к нему имплементируй
в своей DLL-ке!
Не нравится???
Хорошо!
В Dll-ку имплементируешь весь класс, но только этот класс должен быть
наследником от какого нибудь известного проге класса.
А для создания экземпляра этого длльного класса используй
функцию, которая возвращает уже готовый указатель на экземпляр.
Мутарно???
Ну... ладно!
Опять, берешь свой (за)конченный класс :))), и кладешь его в Dll-ку,
а по begin-у в Dll-ке говоришь RegisterClassEx с этим своим классом,
вроде так у меня прокатывало, а потом достаточно найти сам класс по
его строковому названию и вызывать конструктор.
... Да, только надо ShareMem использовать и в проекте, и в Dll-ке,
а при этом придется borlandmm.Dll пихать в свой проект.
Фу-у-у-у-у... вроде все рассказал. :)
Вроде ничё не соврал. :)))
← →
Kolan © (2006-03-27 22:17) [5]Kolan © (26.03.06 22:46) [2]:
Во! Сам ответил на свой вопрос! >> ... Просто интерфйс к нему ... :)
Сделай COM, или не COM, но, Interface, а методы к нему имплементируй
в своей DLL-ке!
Вот этот вариант нравится больше всего. Надо разобраться, благодарю за помощь :)
← →
TUser © (2006-03-28 08:18) [6]Используй bpl.
← →
Kolan © (2006-03-28 19:47) [7]TUser © (28.03.06 08:18) [6]
Есть! :)
Lamer@fools.ua © (27.03.06 09:37) [3]
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
Шас дочитаю. Постараюсь понять.... :)
← →
Kolan © (2006-03-28 20:23) [8]Еще раз вопрос для тупых...
Вот в этом примере:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274
1. Я получил 3 модуляUPlainFileExporter, UExporter, UClassManager.
Что теперь с ними делать? Я так понял, что чтобы использовать плагины достаточно иметь bpl файл. А как его получить?
2.GetClassManager.Add(TPlainFileExporter);
А вот это как понять. Что я добавляю в список?
← →
Kolan © (2006-03-28 21:18) [9]Вроде с 1. из [8] разобрался. Не понял только почему у автора статьи в программе есть:
uses
UClassManager, UExporter, UPlainFileExporter;
Если это плагин. Он там не нужен как я понял....?
Остал ся теперь вопрос 2...
← →
GanibalLector © (2006-03-29 01:27) [10]Вот еще очень занятное чтиво : http://forum.tvercity.ru/index.php?showtopic=1345
Рекомендую ;)
← →
Kolan © (2006-03-29 14:04) [11]Блин, ничего не понимаю...
Удалил я из проекта, который загружает плагины, модуль UPlainFileExporter. Так и должно быть как я понимаю. Ведь программа ничего о конкретных плагинах плагинах не знает.
Теперь естественно этот код не выполняется:initialization
GetClassManager.Add(TPlainFileExporter);
finalization
GEtClassManager.Remove(TPlainFileExporter);
Так и должно быть, ведь это в плагине...
Загружаю плагинprocedure TForm1.BitBtn1Click(Sender: TObject);
begin
PluginModule := LoadPackage(ExtractFilePath(ParamStr(0))
+ "KPlugin.bpl");
RefreshPluginList;
end;
Ну и теперь естественно ничего нет в списке плагинов...procedure TForm1.RefreshPluginList;
var
i : Integer;
begin
PluginsBox.Items.Clear;
for i := 0 to GetClassManager.Count - 1 do
PluginsBox.Items.Add(TExporterClass(GetClassManager[i]).ExporterName);
end;
Объясните как это работает.. Нифига не понимаю..
И что значит
Add(TPlainFileExporter);
?
← →
Cash © (2006-03-29 15:04) [12]Kolan © (29.03.06 14:04) [11]:
Уф-ф-ф-ф,... чес-слово, именно по этому не люблю чужие издания на
эиту тему! :)))
← →
Kolan © (2006-03-29 15:24) [13]Наверно я неправильно группу создал... Сечас скомпилил пример. Там 2 плагина.
Один вообще подключен в uses, а второй нет.
И у второго в секцию инициализации заходишь только при его загрузки.
А у первого при старте приложения.
Но что конкретно я не так сделал пока мне не понятно.
← →
Kolan © (2006-03-29 16:05) [14]Приблизительно понял как работает пример...
Так что если использовать пакеты и в каждом подключить модуль вида:
Цитата из статьи{ ============================================= }
unit UClassManager;
{ ============================================= }
{ ============================================= }
interface
{ ============================================= }
uses
Classes;
type
TClassManager = class(TList);
function ClassManager: TClassManager;
{ ============================================= }
implementation
{ ============================================= }
var
Manager: TClassManager;
function ClassManager: TClassManager;
begin
Result := Manager;
end;
{ ============================================= }
initialization
{ ============================================= }
Manager := TClassManager.Create;
{ ============================================= }
finalization
{ ============================================= }
Manager.Free;
end{ ========================================== }.
ОбъектManager
будет на всех один? И в каждом пакете саой создан не будет?
← →
Reindeer Moss Eater © (2006-03-29 16:20) [15]Один на процесс
← →
Kolan © (2006-03-29 16:22) [16]Один на процесс
Благодарю за разяснения.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c