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

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

Operator not applicable to this operand type [D6, WinXP]


Страницы:   1 2 3

XP ©   (2005-03-01 12:24:00) 

Надоело об стену стучаться головой. Подскажите, пожалуйста.

unit urInterfaces;

interface

type
 IrIniFile = interface
   function GetData: string; stdcall;
 end;

...


//-----------------------------------------

unit urIniFile;

interfaces

uses
 urInterfaces;

type
 TrIniFile = class(TObject, IrIniFile)
 protected
   function GetData: string; stdcall;
 end;

implementation

uses
 urCore;

...


//-----------------------------------

unit urCore;

interface
 
uses
 urInterfaces, urIniFile;

type  
 TrCore = class
 private
   m_IniFile: IrIniFile;
 public
   constructor Create;
 end;

implementation

constructor TrCore.Create;
begin
 m_IniFile := TrIniFile.Create as IrIniFile; // остановка компилятора
end;


На месте остановки пишет: Operator not applicable to this operand type

Вместе с тем, TrIniFile явно объявлен как class(TObject, IrIniFile).

Кроме того, IDE упорно отказывается "ходить" по исходникам по Ctrl + LeftClick.

Все файлы лежат в одной папке. Больше нигде исходников нет - только в этой папке. То-есть, использование разных DCU исключено - специально перепроверил.

Что он хочет-то?... Где это я так сильно споткнулся?...


Димон   (2005-03-01 14:27:00) [1]


>  [45] Набережных С. ©   (01.03.05 14:25)

Спасибо. Вообще говоря логично :)))

Полезная информация.

Где тут оценки ставят как на RSDN? :)))


Набережных С.   (2005-03-01 14:25:00) [2]


> Димон   (01.03.05 14:20) [42]

Да, если Object as interface. Если interface as interface, то вызывается метод самого исходного интерфейса.


Набережных С.   (2005-03-01 14:22:00) [3]

Просто надо вспомнить, что каждый интерфейс в классе - таблица, и в каждой из них свои AddRef, Release и все остальные унаследованные интерфейсом методы.


Набережных С.   (2005-03-01 14:22:00) [4]

Просто надо вспомнить, что каждый интерфейс в классе - таблица, и в каждой из них свои AddRef, Release и все остальные унаследованные интерфейсом методы.


Димон   (2005-03-01 14:20:00) [5]


> [37] Набережных С. ©   (01.03.05 14:13)


Этта что получается, что все as для интерфейсов "ходят" через метод QueryInterface относительно IUnknown?


Digitman   (2005-03-01 14:18:00) [6]


> Надоело об стену стучаться головой


конечно же больно)
нет бы - хрясь ! - легким движением руки унаследовать свой класс от TInterfacedobject ... так ведь - нет ! мы легких путей не ищем) ... нам геморрой в причинном месте дороже)


Набережных С.   (2005-03-01 14:17:00) [7]


> XP   (01.03.05 14:13) [36]
> IrIniFile порожден от IrComponent, который, в свою очередь,
> порожден от IUnknown

С точки зрения реализации интерфейса объектом, это не имеет никакого значеня. Реализован только тот, который явно объявлен в классе или в его, класса, предках. Все предки интерфейса - побоку.


vuk   (2005-03-01 14:17:00) [8]

to Digitman:
>декларация метода класса, реализующего интерфейс, должна в
>точности соответствовать декларации соотв.метода в декларации
>интерфейса, реализуемого этим классом
Значит так. Метод не может быть объявлен virtual при объявлении в интерфейсе (если так можно сказать, они там все virtual), но при реализации в классе метод может иметь любыемодификаторы, которые не влияют на способ передачи параметров. В приведенном примере virtual написано именно в реализации.


Димон   (2005-03-01 14:14:00) [9]


> 34] Набережных С. ©   (01.03.05 14:05)

да, интересная информация. Никогда об этом не задумывался, т.к. всегда iunknown реализовывал, даже если не пользовался TIntefacedObject.

Благодарю :)


XP   (2005-03-01 14:13:00) [10]

TrIniFile = class(TObject, IUnknown, IrIniFile)

IrIniFile порожден от IrComponent, который, в свою очередь, порожден от IUnknown. См. [7].
Смысл?

2 Digitman ©   (01.03.05 13:59) [25]

VCL - Classes.pas

TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
 ...
 { IInterface }
 function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;  
 ...
end;


Что сие может обозначать?...


Набережных С.   (2005-03-01 14:13:00) [11]


> Димон   (01.03.05 14:06) [35]

Дык время посмотри:) Когда писал, [33] еще не было. Да вроде и ничего такого не сказал...Но если все-таки обидел - искренние извинения, совершенно не хотел.

> Ты выразился не вполне понятно просто

Да, бывает со мной. Кажется, если мне очевидно, то и другим тоже. Есть такой грех:(


Димон   (2005-03-01 14:06:00) [12]


>  [34] Набережных С. ©   (01.03.05 14:05)

Я ужо извинился. Ты выразился не вполне понятно просто :)))


Набережных С.   (2005-03-01 14:05:00) [13]


> Димон   (01.03.05 14:03) [31]

Да ты проверь, дяденька, попробуй, в CPU View загляни, ага. Хуже-то от этого не будет:)


Димон   (2005-03-01 14:05:00) [14]


>  [30] Набережных С. ©   (01.03.05 14:03)

А... так более понятно:) Прости, не понял сначала


Набережных С.   (2005-03-01 14:04:00) [15]

Или TInterfacedObject и не маяться...ну сами знаете чем:)


Димон   (2005-03-01 14:03:00) [16]


>  [28] Набережных С. ©   (01.03.05 14:01)

Не-е-е-е, Ты что-то не то говоришь:))) Наверное в приведенном коде не до конца разобрался. :)


>  [29] Digitman ©   (01.03.05 14:02)

Да знаю я :) Это наводящий вопрос бы [27] :)


Набережных С.   (2005-03-01 14:03:00) [17]

В общем, надо объявить так
TrIniFile = class(TObject, IUnknown, IrIniFile)


Digitman   (2005-03-01 14:02:00) [18]


> Димон   (01.03.05 13:59) [27]


> просто interface не эквивалент interface(IInteface)?


объявление IMyInterface = interface;
эквивалентно IMyInterface = interface(IUnknown);

подобно тому, что объявление TMyObject = class;
эквивалентно TMyObject = class(TObject);


Набережных С.   (2005-03-01 14:01:00) [19]


> Димон   (01.03.05 13:59) [27]

А какая разница, аналог или нет? TObject никакой не реализует.


Digitman   (2005-03-01 13:59:00) [20]


> К чему это выделение virtual? Чем это может помешать?


разуваем глаза, читаем справку :

Methods cannot be declared as virtual, dynamic, abstract, or override. Since interfaces do not implement their own methods, these designations have no meaning.

декларация метода класса, реализующего интерфейс, должна в точности соответствовать декларации соотв.метода в декларации интерфейса, реализуемого этим классом


Страницы:   1 2 3

Наверх

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