Конференция "Компоненты" » published property типа interface
 
  • StriderMan © (18.06.07 12:21) [0]
    Запостил в Основные, т.к. в компонентах никто не смотрит.

    Вобщем есть компоненты, у него property типа интерфейса. Как сделать эдитор для этого свойства, который бы показывал в  список объектов, поддерживающих этот интерфейс? Будет ли нормально сохранятся в поток такое свойство?
  • Сергей М. © (18.06.07 12:55) [1]

    > Как сделать эдитор для этого свойства, который бы показывал
    > в  список объектов, поддерживающих этот интерфейс?


    if Supports(SomeObject.ClassType, ISomeInterface) then
     объект SomeObject предоставляет интерфейс ISomeInterface


    > Будет ли нормально сохранятся в поток такое свойство?


    А смысл ?
    Интерфейс же есть по сути указатель...
  • DiamondShark © (18.06.07 13:07) [2]
    А как подсистема загрузки восстановит значение этого свойства?

    Лучше сделай published  свойство типа TComponent, в сеттере этого свойства проверяй, поддерживает ли присваиваемый компонент нужный интерфейс.
    Со ссылками на компоненты среда умеет разбираться со ссылками на компоненты по имени.
  • StriderMan © (18.06.07 13:09) [3]

    > А смысл ?

    а смысл в том чтобы в дизайн-тайме назначит свойство и сохранить в dfm :)))


    > if Supports(SomeObject.ClassType, ISomeInterface) then
    >  объект SomeObject предоставляет интерфейс ISomeInterface

    а как вообще обойти список доступных объектов?
    т.е. как это делается, например, при выборе DataSource'а для DBGrid'а?
  • Сергей М. © (18.06.07 13:48) [4]

    > смысл в том чтобы в дизайн-тайме назначит свойство и сохранить
    > в dfm


    Ну сохранишь ты в dfm некий указатель. Что дальше ? Что с этим указателем будешь делать при загрузке из dfm ?


    > как вообще обойти список доступных объектов?



    > как это делается, например, при выборе DataSource'а для
    > DBGrid'а?


    Примерно вот так:

     for i := 0 to ComponentCount-1 do //перебор всех компонентов на той же форме, на которой лежит DBGrid
      if Components[i] id TDataSource then
        ShowMessage(Components[i].Name);
  • StriderMan © (18.06.07 14:00) [5]

    > for i := 0 to ComponentCount-1 do //перебор всех компонентов
    > на той же форме, на которой лежит DBGrid

    это понятно, но в дизайн-тайме отображаются не только компоненты с формы, а еще со всех подключенных в uses модулей. вот это интересует.


    > Ну сохранишь ты в dfm некий указатель. Что дальше ? Что
    > с этим указателем будешь делать при загрузке из dfm ?

    если б из него выдернуть име компонента и модуля - можно было б сохранить. А что если в интерфейс добавить имя компонента?
  • Сергей М. © (18.06.07 14:28) [6]

    > в дизайн-тайме отображаются не только компоненты с формы,
    >  а еще со всех подключенных в uses модулей


    В дизайн-тайм перебираются не юниты, а формы и модули данных.
    И те и другие являются наслединками класса TComponent, а объекты этого класса имеют св-во Owner, по значеням которого построена древовидная иерархическая структура "владения" одних компонентов другими. Само собой напрашивается решение с рекурсивным обходом этого дерева с фильтрацией [4].


    > если б из него выдернуть име компонента и модуля - можно
    > было б сохранить


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


    Можно.
    Но это противоречит самой постановке задачи - сохранять в поток именно интерфейс.
    А то о чем ты говоришь сейчас, есть ничто иное, как сохранение в поток свойств объекта.
  • StriderMan © (18.06.07 14:57) [7]

    > Можно.
    > Но это противоречит самой постановке задачи - сохранять
    > в поток именно интерфейс.
    > А то о чем ты говоришь сейчас, есть ничто иное, как сохранение
    > в поток свойств объекта

    да, не так сформулировал. сам интерфейс хранить конечно не надо. Надо хранить ссылку на объект, поддерживающий такой интерфейс.


    > В дизайн-тайм перебираются не юниты, а формы и модули данных.

    а как получить список доступных дата-модулей и форм? Или лучше где это в VCL посмотреть. Пока поиски не увенчались успехом :(
  • StriderMan © (18.06.07 15:01) [8]

    > > В дизайн-тайм перебираются не юниты, а формы и модули
    > данных.
    >
    > а как получить список доступных дата-модулей и форм? Или
    > лучше где это в VCL посмотреть. Пока поиски не увенчались
    > успехом :(

    Application.Components

    ? в правильную сторону копаю?
  • Сергей М. © (18.06.07 15:07) [9]

    > Надо хранить ссылку на объект, поддерживающий такой интерфейс


    Это если под ссылкой подразумевать, например, уник. имя компонента на форме..
  • StriderMan © (18.06.07 15:13) [10]

    > Сергей М. ©   (18.06.07 15:07) [9]
    > Это если под ссылкой подразумевать, например, уник. имя  компонента на форме..

    да, именно так. Т.е. также как хранятся ссылки на компоненты. Тот же DBGrid.DataSource.
    при загрузке из потока можно будет из компонента получить нужный интерфейс.
  • jack128 © (18.06.07 22:10) [11]
    StriderMan ©   (18.06.07 14:00) [5]
    это понятно, но в дизайн-тайме отображаются не только компоненты с формы, а еще со всех подключенных в uses модулей. вот это интересует.


    помоему через IDesigner эта задача как то решается..
  • StriderMan © (19.06.07 10:44) [12]

    > jack128 ©   (18.06.07 22:10) [11]
    > помоему через IDesigner эта задача как то решается..

    В делфях по-идее такие проперти должны нормально разруливаться. Есть даже в эдиторах класс TInterfaceProperty. Но работает криво.

    У меня интерфейс натянут на Data-Модуль, и похоже он его не расчухивает
  • Сергей М. © (19.06.07 11:06) [13]

    > TInterfaceProperty.. работает криво


    Что значит "криво" ?

    Нормально он работает, по кр.мере в Д7


    > он его не расчухивает


    А метод QueryInterface кто за тебя будет реализовывать ? Пушкин ?
  • StriderMan © (19.06.07 11:30) [14]

    > Сергей М. ©   (19.06.07 11:06) [13]
    > А метод QueryInterface кто за тебя будет реализовывать ? Пушкин ?

    у меня интерфейс поддерживается дата-модулем, а он как известно наследник TComponent. в нем же все реализовано! или я ошибаюсь?
  • StriderMan © (19.06.07 11:46) [15]
    Кажется понял я в чем проблема.

    еще раз вкратце опишу ситуацию:

    есть интерфейс
     IDataModule = iterface
      [GUID]
      procedure DoSomething;
     end;



    есть дизайн-тайм компонент:

    TSomeComponent = class(TComponent)
    published
     property DataModule: IDataModule ....
    end;



    есть дата-модуль
     DataModule1 = class(TDataModule, ISomeInterface)
       procedure DoSomething;
     end;



    так вот, когда я кладу компонент TSomeComponent на форму, хочу чтоб при нажатии на стрелочку у свойства DataModule в Object Inspector'e выпадал список доступных дата-модулей, поддерживающих интерфейс IDataModule  

    прихожу к выводу что в таком виде реализовать не получится, потому что в дизайн-тайме у дата-модуля получить этот интерфейс нельзя. Я прав?
  • Сергей М. © (19.06.07 11:57) [16]

    > в нем же все реализовано! или я ошибаюсь?
    >


    Да, реализован.

    А ты GUID назначил своему интерфейсу ?
  • Сергей М. © (19.06.07 12:00) [17]

    > IDataModule = iterface


    > DataModule1 = class(TDataModule, ISomeInterface)


    Почему DataModule1 реализует совсем иной интерфейс ?
  • StriderMan © (19.06.07 12:15) [18]

    > Сергей М. ©   (19.06.07 12:00) [17]
    > Почему DataModule1 реализует совсем иной интерфейс ?

    пардон, ошибся. тот же самый IDataModule.
    DataModule1 = class(TDataModule, IDataModule)




    > Сергей М. ©   (19.06.07 11:57) [16]
    > Да, реализован.
    > А ты GUID назначил своему интерфейсу ?

    да, GUID есть.

    сделал такой тестик:
    создал еще один компонент, поддерживающий интерфейс IDataModule. бросил на форму.

    Так вот он в списке отображается.

    есть подозрение, что сами формы и дата-модули в такой список не загнать в принципе. Дата-модуль же еще не скомпилирован на этапе разработки, и какой у него есть интерфейс известно только по коду.
  • StriderMan © (19.06.07 12:19) [19]
    еще один пример

    TSomeComponent = class(TComponent)
    published
    property Frm: TForm....
    end;



    1. в дизайнере в список для свойства Frm форма на которой лежит компонент не попадает.
    2. другие формы попадают - но при попытке выбрать - Invalid property value
  • Сергей М. © (19.06.07 13:06) [20]

    > формы и дата-модули в такой список не загнать в принципе


    В TCustomForm перекрыт QueryInterface, смотри особенности его реализации.

    А TDataModule не попадает потому что либо его владелец не та форма, на которой лежит твой компонент с интерфейсным св-вом.
  • StriderMan © (19.06.07 13:17) [21]

    > А TDataModule не попадает потому что либо его владелец не
    > та форма, на которой лежит твой компонент с интерфейсным
    > св-вом.

    а как тогда в список попадают компоненты с других модулей? они же не лежат на родительской, но доступны через uses


    > сделал такой тестик:
    > создал еще один компонент, поддерживающий интерфейс IDataModule.
    >  бросил на форму.
    > Так вот он в списке отображается.

    при закрытии проекта - AV по адресу 00000000.

    Вобщем Сабж это зло. постараюсь обойтись без него.
  • Сергей М. © (19.06.07 13:24) [22]

    > как тогда в список попадают компоненты с других модулей?


    Значит твой TDataModule не соответствует предопределенной логике перебора/фильтрации.


    > Сабж это зло


    Эт точно)

    Дурней затеи, чем манипуляция run-time-интерфейсами в дизайн-тайм, трудно придумать)
  • jack128 © (20.06.07 00:19) [23]
    StriderMan ©   (19.06.07 11:46) [15]
    потому что в дизайн-тайме у дата-модуля получить этот интерфейс нельзя. Я прав?

    Прав. Потому что в дезин тайм - этого модуля в виде исполняемого кода - еще нет. Вот если ты зарегишь свой дата модуль в IDE, то возможно (точно не знаю, не проверял) у тя что и выдет..
  • имя (20.10.15 19:20) [24]
    Удалено модератором
 
Конференция "Компоненты" » published property типа interface
Есть новые Нет новых   [118241   +28][b:0][p:0.002]