|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Интерфейс для передачи класса в dll
добрый день. Суть проблемы такова. В книжке нашел пример:
procedure IsFont (O:TObject); begin if O is TFont then ShowMessage ('Font') else ShowMessage ('Not Font'); end; Когда данный пример в главной форме то все работает корректно, но стоит его поместить в dll и добавить в ней строчку: exports IsFont name 'IsFont'; потом вызвать функцию из главного модуля, так перестает работать. В книжке написано, что так и должно быть и спасение нужно искать в интерфейсах. Может что-то не так делаю, но создал в той же dll класс и описал в нем интерфейс, в котором и вышеупомянутую функцию + ее реализация в классе. и сделал экспорт функции, которая создает этот класс, чтобы из главного модуля можно было юзать интерфейс. снова вызываю из главной формы указатель_на_класс_в_dll. IsFont (Tfont) , и всё равно не работает. |
#2
|
|||
|
|||
В других форумах посоветовали поюзать bpl. пока не работал с ними, но попробую поэкспериментировать. В продолжение развития темы, вопрос, что описано в нижних строчках:
В первых двух строчках вообще не понятно что это, а в третьей не пойму где реализован интерфейс, как я уяснил, интерфейс это всего лишь методы, которые потом реализуются в классах. Класс вижу , вижу интерфейс, а реализации его (интерфейса) методов нет. Или он реализован где-то, и программа сама потом найдет в каком подключенном модуле он реализован и в каком классе? спасибо. type TMethodDataSetOpen = procedure of object; TFetchRowEvent = procedure(cRowsObtained: UInt) of object; TSequentialStreamAdapter = class(TStreamAdapter, ISequentialStream) end; |
#3
|
|||
|
|||
В первых двух строчках описаны процедурные типы. Например
var i: Integer; -тип Integer для переменной i. var s: TProc; - переменная s получает указатель на процедуру TProc. Если переменная это поле внутри объекта или класса, то она называется методом и должна иметь два указателя: на процедуру и (неявный) на экземпляр объекта. Для этого в описании процедурного типа добавляют 'of object'. Например: Код:
type TMethodDataSetOpen = procedure of object; type A = object s: TMethodDataSetOpen; end; |
#4
|
|||
|
|||
приведенный вами пример немного запутал, но, поправьте тогда. В нем имеем процедуру TMethodDataSetOpen , она входит в объект A. и эта процедура присвоена переменной S. и эта сама переменная будет иметь 2 указателя. и при обращении к ней, будет затребована ссылка на класс, а потом и на саму процедуру.
Прочитаю про процедурные типы на выходных, чтобы не задавать глупых и некорректных вопросов. А про интерфейся все же спрошу сейчас. В моем понмиании идет описание класса к которому мы прикручиваем интерфейс , потом ниже идет уже реализация вновь созданного нами класса. мне было бы более ясна третья строчка если она была бы ввиде: type ILoadable = interface ['{A10BFF6A-1C96-4401-87E6-10250D032448}'] procedure LoadStrings; end; TNewButton = class(TButton, ILoadable) public procedure LoadStrings; end; а в ранее приведенном примере все как-то запутано, не видно какие методы в интерфейсе, догадываюсь что они описаны в подлкючаемом модуле. но где реализация они прописаны в нвоом создаваемом классе TSequentialStreamAdapter ? |