Конференция "Corba" » интерфейс объекта с полем типа "массив" [Delphi, Windows]
 
  • MerkulovVV © (27.08.08 11:55) [0]
    вопрос таков, из кода будет ясно, думаю:

    класс (BaseInstrClass.pas)
     TPayTool = class (TInterfacedObject, IPayTool)

     APayTool = array of TPayTool;

     TCardInstruments = class (TInterfacedObject, ICardInstruments)
      private
       FPayTool: APayTool;
       function GetPayTools: APayTool;
       procedure SetPayTools (new: APayTool);
      public
       property PayTools: APayTool read GetPayTools write SetPayTools;
     end;

    интерфейс
     IPayTool = interface (IInterface)

     APayTool = array of IPayTool;

     ICardInstruments = interface (IInterface)
      ['{6C1FC184-EBA3-4EAB-9A26-BC693A49642A}']
       function GetPayTools: APayTool;
       procedure SetPayTools (new: APayTool);
       property PayTools: APayTool read GetPayTools write SetPayTools;
      end;

    явно что-то не то в интерфейсе.
    ошибка при компиляции
    [Error] BaseInstrClass.pas(133): Declaration of 'GetPayTools' differs from declaration in interface 'ICardInstruments'
    [Error] BaseInstrClass.pas(133): Declaration of 'SetPayTools' differs from declaration in interface 'ICardInstruments'

    Подскажите, как правильно организовать работу? Плиз код, а не советы "почитать", копал в инете, не накопал.
  • Сергей М. © (27.08.08 12:22) [1]
    type

    IPayTool = interface (IInterface)
    end;

    TPayTool = class (TInterfacedObject, IPayTool);

    APayTool = array of TPayTool;

    ICardInstruments = interface (IInterface)
     ['{6C1FC184-EBA3-4EAB-9A26-BC693A49642A}']
      function GetPayTools: APayTool;
      procedure SetPayTools (new: APayTool);
      property PayTools: APayTool read GetPayTools write SetPayTools;
     end;

    TCardInstruments = class (TInterfacedObject, ICardInstruments)
     private
      FPayTool: APayTool;
      function GetPayTools: APayTool;
      procedure SetPayTools (new: APayTool);
     public
      property PayTools: APayTool read GetPayTools write SetPayTools;
    end;



    Все чудесно компилируется, не вижу никаких проблем.
  • MerkulovVV © (27.08.08 12:30) [2]
    проблема в том, что это разные юниты.
    Предполагается объект хранить в одной dll, а через интерфейс получать доступ к нему из других dll.
    В таком случае при описании интерфейса я не могу писать

    APayTool = array of TPayTool;

    ICardInstruments = interface (IInterface)
    ...
    property PayTools: APayTool
    ...

    так как это включит код TPayTool во вторую dll, чего необходимо избежать.
  • Сергей М. © (27.08.08 13:13) [3]
    Разнеси декларацию и реализацию классов и декларацию интерфейсов по разным юнитам.
  • Сергей М. © (27.08.08 13:21) [4]

    > APayTool = array of TPayTool;


    А это вообще выкини за ненадобностью.
  • Сергей М. © (27.08.08 13:25) [5]
    Кстати, библиотека с реализованным интерфейсным объектом CardInstruments будет использоваться только дельфийскими вызывающими модулями ?

    Если нет, то это работать не будет, даже будучи успешно скомпилированным.
  • MerkulovVV © (27.08.08 17:21) [6]
    "Разнеси декларацию и реализацию классов и декларацию интерфейсов по разным юнитам."

    Так и сделано уже.

    "> APayTool = array of TPayTool;
    А это вообще выкини за ненадобностью."

    Кхм. А массив-то где я объявлю? В модуле с интерфейсом, останется APayTool = array of IPayTool ?

    Планируется только в Делфи использовать.
  • Сергей М. © (27.08.08 20:56) [7]

    > В модуле с интерфейсом, останется APayTool = array of IPayTool
    > ?


    Да.
    А разве этого недостаточно ?


    > Планируется только в Делфи использовать


    А как остоит дело насчет единоэкземплярности BMM ?
  • MerkulovVV © (28.08.08 12:14) [8]
    Такс, в общем и целом я проблему решил иначе.
    Массив не виден в интерфейсе, сделал функцию доступа к элементу массива по индексу.

    А что есть ВММ?
  • Сергей М. © (28.08.08 12:17) [9]

    > Массив не виден в интерфейсе, сделал функцию доступа к элементу
    > массива по индексу


    И это правильное решение.


    > что есть ВММ?


    Borland Memory Manager
  • MerkulovVV © (29.08.08 10:51) [10]
    А какую роль играет единоэкземплярность BMM??
  • Сергей М. © (29.08.08 11:14) [11]
    Выделение и последующее перераспределение или освобождение ранее выделенного или перераспределенного блока памяти долнжо осуществляться одним и тем же экземпляром менеджера.
 
Конференция "Corba" » интерфейс объекта с полем типа "массив" [Delphi, Windows]
Есть новые Нет новых   [120355   +33][b:0][p:0.001]