-
Запостил в Основные, т.к. в компонентах никто не смотрит.
Вобщем есть компоненты, у него property типа интерфейса. Как сделать эдитор для этого свойства, который бы показывал в список объектов, поддерживающих этот интерфейс? Будет ли нормально сохранятся в поток такое свойство?
-
> Как сделать эдитор для этого свойства, который бы показывал > в список объектов, поддерживающих этот интерфейс?
if Supports(SomeObject.ClassType, ISomeInterface) then объект SomeObject предоставляет интерфейс ISomeInterface
> Будет ли нормально сохранятся в поток такое свойство?
А смысл ? Интерфейс же есть по сути указатель...
-
А как подсистема загрузки восстановит значение этого свойства?
Лучше сделай published свойство типа TComponent, в сеттере этого свойства проверяй, поддерживает ли присваиваемый компонент нужный интерфейс. Со ссылками на компоненты среда умеет разбираться со ссылками на компоненты по имени.
-
> А смысл ?
а смысл в том чтобы в дизайн-тайме назначит свойство и сохранить в dfm :)))
> if Supports(SomeObject.ClassType, ISomeInterface) then > объект SomeObject предоставляет интерфейс ISomeInterface
а как вообще обойти список доступных объектов? т.е. как это делается, например, при выборе DataSource'а для DBGrid'а?
-
> смысл в том чтобы в дизайн-тайме назначит свойство и сохранить > в dfm
Ну сохранишь ты в dfm некий указатель. Что дальше ? Что с этим указателем будешь делать при загрузке из dfm ?
> как вообще обойти список доступных объектов?
> как это делается, например, при выборе DataSource'а для > DBGrid'а?
Примерно вот так:
for i := 0 to ComponentCount-1 do //перебор всех компонентов на той же форме, на которой лежит DBGrid if Components[i] id TDataSource then ShowMessage(Components[i].Name);
-
> for i := 0 to ComponentCount-1 do //перебор всех компонентов > на той же форме, на которой лежит DBGrid
это понятно, но в дизайн-тайме отображаются не только компоненты с формы, а еще со всех подключенных в uses модулей. вот это интересует.
> Ну сохранишь ты в dfm некий указатель. Что дальше ? Что > с этим указателем будешь делать при загрузке из dfm ?
если б из него выдернуть име компонента и модуля - можно было б сохранить. А что если в интерфейс добавить имя компонента?
-
> в дизайн-тайме отображаются не только компоненты с формы, > а еще со всех подключенных в uses модулей
В дизайн-тайм перебираются не юниты, а формы и модули данных. И те и другие являются наслединками класса TComponent, а объекты этого класса имеют св-во Owner, по значеням которого построена древовидная иерархическая структура "владения" одних компонентов другими. Само собой напрашивается решение с рекурсивным обходом этого дерева с фильтрацией [4].
> если б из него выдернуть име компонента и модуля - можно > было б сохранить
> А что если в интерфейс добавить имя компонента?
Можно. Но это противоречит самой постановке задачи - сохранять в поток именно интерфейс. А то о чем ты говоришь сейчас, есть ничто иное, как сохранение в поток свойств объекта.
-
> Можно. > Но это противоречит самой постановке задачи - сохранять > в поток именно интерфейс. > А то о чем ты говоришь сейчас, есть ничто иное, как сохранение > в поток свойств объекта
да, не так сформулировал. сам интерфейс хранить конечно не надо. Надо хранить ссылку на объект, поддерживающий такой интерфейс.
> В дизайн-тайм перебираются не юниты, а формы и модули данных.
а как получить список доступных дата-модулей и форм? Или лучше где это в VCL посмотреть. Пока поиски не увенчались успехом :(
-
> > В дизайн-тайм перебираются не юниты, а формы и модули > данных. > > а как получить список доступных дата-модулей и форм? Или > лучше где это в VCL посмотреть. Пока поиски не увенчались > успехом :(
Application.Components ? в правильную сторону копаю?
-
> Надо хранить ссылку на объект, поддерживающий такой интерфейс
Это если под ссылкой подразумевать, например, уник. имя компонента на форме..
-
> Сергей М. © (18.06.07 15:07) [9] > Это если под ссылкой подразумевать, например, уник. имя компонента на форме..
да, именно так. Т.е. также как хранятся ссылки на компоненты. Тот же DBGrid.DataSource. при загрузке из потока можно будет из компонента получить нужный интерфейс.
-
StriderMan © (18.06.07 14:00) [5] это понятно, но в дизайн-тайме отображаются не только компоненты с формы, а еще со всех подключенных в uses модулей. вот это интересует.
помоему через IDesigner эта задача как то решается..
-
> jack128 © (18.06.07 22:10) [11] > помоему через IDesigner эта задача как то решается..
В делфях по-идее такие проперти должны нормально разруливаться. Есть даже в эдиторах класс TInterfaceProperty. Но работает криво.
У меня интерфейс натянут на Data-Модуль, и похоже он его не расчухивает
-
> TInterfaceProperty.. работает криво
Что значит "криво" ?
Нормально он работает, по кр.мере в Д7
> он его не расчухивает
А метод QueryInterface кто за тебя будет реализовывать ? Пушкин ?
-
> Сергей М. © (19.06.07 11:06) [13] > А метод QueryInterface кто за тебя будет реализовывать ? Пушкин ?
у меня интерфейс поддерживается дата-модулем, а он как известно наследник TComponent. в нем же все реализовано! или я ошибаюсь?
-
Кажется понял я в чем проблема. еще раз вкратце опишу ситуацию: есть интерфейс 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 прихожу к выводу что в таком виде реализовать не получится, потому что в дизайн-тайме у дата-модуля получить этот интерфейс нельзя. Я прав?
-
> в нем же все реализовано! или я ошибаюсь? >
Да, реализован.
А ты GUID назначил своему интерфейсу ?
-
> IDataModule = iterface
> DataModule1 = class(TDataModule, ISomeInterface)
Почему DataModule1 реализует совсем иной интерфейс ?
-
> Сергей М. © (19.06.07 12:00) [17] > Почему DataModule1 реализует совсем иной интерфейс ?
пардон, ошибся. тот же самый IDataModule. DataModule1 = class(TDataModule, IDataModule) > Сергей М. © (19.06.07 11:57) [16] > Да, реализован. > А ты GUID назначил своему интерфейсу ?
да, GUID есть. сделал такой тестик: создал еще один компонент, поддерживающий интерфейс IDataModule. бросил на форму. Так вот он в списке отображается. есть подозрение, что сами формы и дата-модули в такой список не загнать в принципе. Дата-модуль же еще не скомпилирован на этапе разработки, и какой у него есть интерфейс известно только по коду.
-
еще один пример TSomeComponent = class(TComponent)
published
property Frm: TForm....
end; 1. в дизайнере в список для свойства Frm форма на которой лежит компонент не попадает. 2. другие формы попадают - но при попытке выбрать - Invalid property value
|