Непонятная проблема с интерфейсами.
От: VinniTheBEAR Россия  
Дата: 20.04.05 08:18
Оценка:
Доброго времени суток.

Ситуевина такая:

Есть два пакета, в них два компонента:

Пакет №1
ILogger = interface
  ['{2499D7B5-7836-4BAA-8BAF-6A58F1C89C9A}']
  procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
end;

TComponentA = class(TComponent)
private
  FLogger: ILogger;
published
  property Logger: ILogger read FLogger write FLogger;
end;


Пакет №2
ILogger = interface
  ['{2499D7B5-7836-4BAA-8BAF-6A58F1C89C9A}']
  procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
end;

TComponentB = class(TComponent, ILogger)
published
  procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
end;


Оба пакета скомпилены и инсталлены. Делаю новый ProjectGroup, в ней новый проект и открываю пакет №1(активный), на форму кидаю ComponentA и ComponentB, в компоненте A.Logger выбираю компонент B.
Сохраняюсь. Компилирую пакет №1. И вот, вылезает Access violation в rtl70.bpl и дельфа уходит в задумчивый ступор.

Подскажите, в чем собака порылась.

З.Ы. Если на свойство Logger не выбрано (nil), тогда никаких глюков не вылезает.
Re: Непонятная проблема с интерфейсами.
От: vav Россия  
Дата: 20.04.05 08:38
Оценка:
VTB>Есть два пакета, в них два компонента:

и декларации зачем-то 2..
оставь одну и будет счастье.
Re[2]: Непонятная проблема с интерфейсами.
От: Danchik Украина  
Дата: 20.04.05 14:03
Оценка:
Здравствуйте, vav, Вы писали:

VTB>>Есть два пакета, в них два компонента:


vav>и декларации зачем-то 2..

vav>оставь одну и будет счастье.
Полностью с тобой согласен

Но решение в другом: сделай третий пакет в котором и будет твой интерфейс

Пакет №1
ILogger = interface
  ['{2499D7B5-7836-4BAA-8BAF-6A58F1C89C9A}']
  procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
end;


Пакет №2
TComponentA = class(TComponent, ILogger)
published
  procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
end;


Пакет №3
TComponentB = class(TComponent, ILogger)
published
  procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
end;
Re[3]: Непонятная проблема с интерфейсами.
От: alive Россия  
Дата: 21.04.05 08:28
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Но решение в другом: сделай третий пакет в котором и будет твой интерфейс


А что объявление интерфейса в отдельном юните для пакетов не сработает?
Keep yourself alive
Re[4]: Непонятная проблема с интерфейсами.
От: Danchik Украина  
Дата: 21.04.05 12:37
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Danchik, Вы писали:


D>>Но решение в другом: сделай третий пакет в котором и будет твой интерфейс


A>А что объявление интерфейса в отдельном юните для пакетов не сработает?


Смотри сюда:
Если ты подключиш этот юнит в свои пакеты то они им и будут владеть. Как правило Delphi не даст тебе этого сделать (в том случае если два пакета подключены одновременно).
Я неуверен что будет работать но можно сделать WeakPackage Unit:

{$WEAKPACKAGEUNIT ON}
unit CommonIntf;

interface

type
  ILogger = interface
    ['{2499D7B5-7836-4BAA-8BAF-6A58F1C89C9A}']
    procedure Log( Sender: TObject; ASeverity: integer; AMessage: string );
  end;

implementation

end;


И все таки я думаю что это работать не будет Получится тот же вариант что был у тебя до того.
Re[5]: Непонятная проблема с интерфейсами.
От: alive Россия  
Дата: 21.04.05 13:28
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Смотри сюда:

D>Если ты подключиш этот юнит в свои пакеты то они им и будут владеть. Как правило Delphi не даст тебе этого сделать (в том случае если два пакета подключены одновременно).
Просто ни разу не использовал связку пакет+интерфейс вот и спросил.

D>И все таки я думаю что это работать не будет Получится тот же вариант что был у тебя до того.

Не я был инициатором темы
Keep yourself alive
Re[6]: Непонятная проблема с интерфейсами.
От: VinniTheBEAR Россия  
Дата: 26.04.05 04:29
Оценка:
Всем спасибо за участие.
Вынесение декларации в отдельный юнит помогло, просто я подумал, что Дельфа считает интерфейсы с одинаковым ГУИДом одним интерфейсом.

Но вот засада, всплыла другая проблема

Задача прежняя:
Есть компонент с публичным свойством типа интерфейс, есть другой компонент, реализующий этот интерфейс, и вот ... если в дизайнере выбрать второй компонент в свойстве первого, то начинают валиться Access violation, то при компиляции, то во время выполнения, причем закономерности я почему-то не увидел.

Кто-нибудь сталкивался с подобным?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.