Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Поддерживает ли об ект интерфейс ?   Найти похожие ветки 

 
val_5 ©   (2005-03-11 04:53) [0]

Как определить поддерживает ли форма заданный интерфейс ?
Например :                                            

type
 IFormDB = interface
   ["{31E10702-B99C-42B9-BD95-3DE0EB1E27B2}"]
   function DataSource: TDataSource;
   ...
 end;

 TFormDB = class(TForm, IFormDB)
   function DataSource: TDataSource;
   ...
 end;

...

if < Screen.Forms[I] поддерживает IFormDB > then
 ShowMessage( (Screen.Forms[I] as IFormDB).DataSource.DataSet.Name );


Что написать вместо "< Screen.Forms[I] поддерживает IFormDB >" ?


 
Defunct ©   (2005-03-11 05:41) [1]

а нельзя ли зарезервировать сообщение, ответив на которое форма уведомит о поддержке интерфейса?

if SendMessage( Screen.Forms[i].Handle, WM_INTERFACEQUERY, 0, 0) = <Ваш, заранее определенный ответ > then
  ShowMessage( (Screen.Forms[I] as IFormDB).DataSource.DataSet.Name );


 
Fay ©   (2005-03-11 05:52) [2]

if Supports(Screen.Forms[I], IFormDB) then


 
WondeRu ©   (2005-03-11 09:46) [3]

if QueryInterface(StringToGUID("31E10702-B99C-42B9-BD95-3DE0EB1E27B2"), obj) = E_NoInterface then
ShowMessage( (Screen.Forms[I] as IFormDB).DataSource.DataSet.Name );


 
WondeRu ©   (2005-03-11 09:48) [4]

WondeRu ©   (11.03.05 9:46) [3]
пропустил чуть-чуть

if Screen.Forms[I].QueryInterface(StringToGUID("31E10702-B99C-42B9-BD95-3DE0EB1E27B2"), obj) = E_NoInterface then
ShowMessage( (obj as IFormDB).DataSource.DataSet.Name );


еще можно проще сделать проверку
if (Screen.Forms[I] as IFormDB) <> nil then ...


 
Virgo_Style ©   (2005-03-11 10:02) [5]


> if (Screen.Forms[I] as IFormDB) <> nil then ...

А почему не .. IS .. ?


 
Poirot ©   (2005-03-11 10:06) [6]

to [5]потомучто F1!!!
Смысл другой - в данном случае "as" вызывает QueryInterface
т.е [4] оба варианта впринципе одинаковы!


 
Virgo_Style ©   (2005-03-11 10:34) [7]

Логично :-)


 
Набережных С. ©   (2005-03-11 11:02) [8]


> Virgo_Style ©   (11.03.05 10:02) [5]
>
> > if (Screen.Forms[I] as IFormDB) <> nil then ...
>
> А почему не .. IS .. ?

А что, IS уже можно применять к интерфейсам? Новая новость:))
Но еще интереснее, почему IF и <>nil:))

> Poirot ©   (11.03.05 10:06) [6]

А больше AS ничего не делает?


 
Poirot ©   (2005-03-11 11:06) [9]

[8]
Ас?:)_) Многое - гы:) В данном контексте подробнее не надо говорить об этом по моему:)


 
Набережных С. ©   (2005-03-11 11:18) [10]


> Poirot ©   (11.03.05 11:06) [9]
> Многое - гы:) В данном контексте подробнее не надо говорить
> об этом по моему:)

Да ну? А что, например? И почему не надо? Имхо, чего точно не надо делать, так это глупостей говорить. А надо, как ты и советовал, но сам почему-то не сделал, посмотреть справку. А в [4], как и в [3], полная ерунда написана, в обоих вариантах, от начала и до конца.


 
Poirot ©   (2005-03-11 11:18) [11]

зы... маленькое дополнение - я имел ввиду QueryInterface интерфейса IUnknown.


 
Набережных С. ©   (2005-03-11 11:26) [12]


> Poirot ©   (11.03.05 11:18) [11]

И что это меняет? Может, все-таки почитаешь справку, а?


 
Poirot ©   (2005-03-11 11:33) [13]

Во-первых, мене это не нать.
Варианты предложили - в разных случаях каждый работает.... при условии, что QueryInterface реализован нормально...
Можно TObject.GetInterface
можно TObject.GetInterfaceEntry
Но если сделать по "учебнику" QueryInterface То всё работает и от Object as IsomeInterface <> nil я думаю вы не буите спорить, что в данном случае вызовится IUnknown.QueryInterface! или буите?! тогда хотелосьбы доква - у мена дебагер под руками!


 
Poirot ©   (2005-03-11 11:41) [14]

Ok, QueryInterface лучший вариант:))
Гы:)


 
DiamondShark ©   (2005-03-11 11:47) [15]


> Poirot ©   (11.03.05 11:33) [13]

Какая чепуха.


> Варианты предложили - в разных случаях каждый работает....
> при условии, что QueryInterface реализован нормально...
> Можно TObject.GetInterface
> можно TObject.GetInterfaceEntry

Всё с точностью до наоборот: GetInterface и GetInterfaceEntry служат для реализации QueryInterface.


 
DiamondShark ©   (2005-03-11 11:50) [16]


> То всё работает и от Object as IsomeInterface <> nil

А нафига <> nil?
as возвращает либо ссылку на интерфейс, либо исключение, если интерфейс не реализован.


> что в данном случае вызовится IUnknown.QueryInterface

А IUnknown откуда возмётся?


 
DiamondShark ©   (2005-03-11 11:52) [17]

По сабжу:
Либо GetInterface с проверкой возврата,
либо as с отловом исключения.


 
Poirot ©   (2005-03-11 11:58) [18]

>>DiamondShark ©   (11.03.05 11:47) [15]
Опятьже "книжная" реализация COM :)  ане чепуха:) Так сказать классика на добром C++.
про as чепуха:)Это интересно:)

>>А IUnknown откуда возмётся?
Ну тогда вот вам и ответ - он возмётся от туда, что он есть базовый класс любого интерфейчас:) COM Догма:)
С as погорячился :)


 
DiamondShark ©   (2005-03-11 12:20) [19]

А при чём тут классика, ком и ц?
Поддержка интерфейсов -- внутренняя фича языка дельфи.

Кстати, я тоже хорош: as тут вообще не подходит.


 
Poirot ©   (2005-03-11 12:33) [20]

>>Поддержка интерфейсов -- внутренняя фича языка дельфи.

А вот то что вы хотели для примера
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
IInterface в Делфи тоже самое что и IUnknown. так что тут всё причём.
Это таки как раз и есть COM "полюбому":)


 
Набережных С. ©   (2005-03-11 13:12) [21]


> Poirot ©   (11.03.05 11:33) [13]
> Во-первых, мене это не нать.

Дак какого ... тогда лезть в ветку?! Недаржание слов? Промолчать не в силах? На кой ляд бред нести, коли не смыслите в этом нихрена?

> Но если сделать по "учебнику" QueryInterface То всё работает
> и от Object as IsomeInterface <> nil я думаю вы не буите
> спорить, что в данном случае вызовится IUnknown.QueryInterface!
> или буите?!

Нет, спорить я не буду. Особенно, с учетом совсем недавней ветки по этому поводу. А еще потому, что эта конструкция -  просто бред сивокобыльный. И это отлично известно каждому, кто хотя бы однажды, хоть немного работал с интерфейсами. И тот факт, что здесь действительно вызывается IUnknown.QueryInterface, абсолютно ничего не меняет, ибо проверка на nil здесь лишена даже намеков на смысл.

> Варианты предложили - в разных случаях каждый работает

Из всех предложенных вариантов правильно, в соответствии с вопросом, сработают только 2, данные в [1] и [2]. Из них второй совсем в точку, а первый хотя бы работать будет. Все, что после этого - чистая, незамутненная знаниями фантизия, с действительностью ничего общего не имеющая:(

Нет, ошибиться может каждый, это понятно. Непонятно, зачем любой ценой упорствовать в собственных ошибках, приплетая сюда вещи, к данной теме вообще отношения не имеющие, вроде COM? Почему просто не почитать справку, как было уже дважды предложено??


 
Poirot ©   (2005-03-11 13:24) [22]

Зы хотелось получить вразумительное объяснение - а не наезд - в [10] я вижу наезд - тон соответствующий.
Зызы: С интерфейсами хоть раз - работал, но вилдимо не с теми:)
зы-зы-зы:И всё что вы сказали сейчас можно было сказать и заранее. Справку читал и не раз. COM при том. что в принципе всё к нему и сводится и GUID и само понятие интерфейса...


 
DiamondShark ©   (2005-03-11 13:33) [23]


> при том. что в принципе всё к нему и сводится и GUID и само
> понятие интерфейса...

Гы-ыы ;)))


 
Набережных С. ©   (2005-03-11 13:35) [24]


> Poirot ©   (11.03.05 13:24) [22]

Ошибаетесь. В [10] был не наезд, а провокация. С целью заставить начать думать или хотя бы воспользоваться хелпом.

> И всё что вы сказали сейчас можно было сказать и заранее

Конечно мог бы. Но мне трудно представить, что человек, рассуждающий об интерфейсах, да еще отсылающий к F1, не знает подобных вещей. Мне казалось, что это всем известно. А в [6] - просто оговорка, мелкая ошибка, вызванная обычной торопливостью. Такое со многими бывает, и со мной тоже. И потому ни в [8] , ни в [10] я ничего не сказал, давая Вам возможность поправиться самому, хотя бы с помощью хелпа. То, что Вы предпочли поступить иначе - Ваш личный выбор, винить в нем некого.


 
WondeRu ©   (2005-03-11 13:39) [25]

WondeRu ©   (11.03.05 9:48) [4]
согласен, чушь накатал и повел за собой других :)


 
Poirot ©   (2005-03-11 13:41) [26]

кроме гы-гы я от вас ничег и не слышал:) хыы... поддакивать все умеют:)



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.055 c
4-1130327381
Хинт
2005-10-26 15:49
2005.12.25
Hook на нажатие клавиш


2-1134195747
eid
2005-12-10 09:22
2005.12.25
asci-ansi


2-1134140411
fun
2005-12-09 18:00
2005.12.25
Путь запуска dll


2-1134295439
Kais
2005-12-11 13:03
2005.12.25
текстовый файл


14-1133597407
Knight
2005-12-03 11:10
2005.12.25
Архивация файлов с русскими именам в TurboPower Abbrevia...