Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Технологии
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2007, 00:39
alolya alolya вне форума
Прохожий
 
Регистрация: 25.09.2007
Сообщения: 5
Репутация: 10
По умолчанию Интерфейс для передачи класса в 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  
Старый 04.12.2007, 23:41
alolya alolya вне форума
Прохожий
 
Регистрация: 25.09.2007
Сообщения: 5
Репутация: 10
По умолчанию

В других форумах посоветовали поюзать bpl. пока не работал с ними, но попробую поэкспериментировать. В продолжение развития темы, вопрос, что описано в нижних строчках:

В первых двух строчках вообще не понятно что это, а в третьей не пойму где реализован интерфейс, как я уяснил, интерфейс это всего лишь методы, которые потом реализуются в классах. Класс вижу , вижу интерфейс, а реализации его (интерфейса) методов нет. Или он реализован где-то, и программа сама потом найдет в каком подключенном модуле он реализован и в каком классе?

спасибо.


type

TMethodDataSetOpen = procedure of object;

TFetchRowEvent = procedure(cRowsObtained: UInt) of object;

TSequentialStreamAdapter = class(TStreamAdapter, ISequentialStream)

end;
Ответить с цитированием
  #3  
Старый 05.12.2007, 12:20
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

В первых двух строчках описаны процедурные типы. Например
var i: Integer; -тип Integer для переменной i.
var s: TProc; - переменная s получает указатель на процедуру TProc. Если переменная это поле внутри объекта или класса, то она называется методом и должна иметь два указателя: на процедуру и (неявный) на экземпляр объекта. Для этого в описании процедурного типа добавляют 'of object'. Например:
Код:
type
TMethodDataSetOpen = procedure of object;
type
    A = object
      s: TMethodDataSetOpen;
    end;
Третье описание - это класс. В скобках указан его родитель и интерфейс, функции которого он должен реализовать или наследовать.
Ответить с цитированием
  #4  
Старый 06.12.2007, 00:52
alolya alolya вне форума
Прохожий
 
Регистрация: 25.09.2007
Сообщения: 5
Репутация: 10
По умолчанию

приведенный вами пример немного запутал, но, поправьте тогда. В нем имеем процедуру TMethodDataSetOpen , она входит в объект A. и эта процедура присвоена переменной S. и эта сама переменная будет иметь 2 указателя. и при обращении к ней, будет затребована ссылка на класс, а потом и на саму процедуру.
Прочитаю про процедурные типы на выходных, чтобы не задавать глупых и некорректных вопросов.

А про интерфейся все же спрошу сейчас. В моем понмиании идет описание класса к которому мы прикручиваем интерфейс , потом ниже идет уже реализация вновь созданного нами класса. мне было бы более ясна третья строчка если она была бы ввиде:

type
ILoadable = interface
['{A10BFF6A-1C96-4401-87E6-10250D032448}']
procedure LoadStrings;
end;
TNewButton = class(TButton, ILoadable)
public
procedure LoadStrings;
end;

а в ранее приведенном примере все как-то запутано, не видно какие методы в интерфейсе, догадываюсь что они описаны в подлкючаемом модуле. но где реализация они прописаны в нвоом создаваемом классе TSequentialStreamAdapter ?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter