![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поддерживает ли об'ект интерфейс ? [D7, WinXP]
val_5 © (2005-03-11 04:53:00)Как определить поддерживает ли форма заданный интерфейс ?
Например :
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 >" ?
Poirot (2005-03-11 13:41:00) [1]кроме гы-гы я от вас ничег и не слышал:) хыы... поддакивать все умеют:)
WondeRu (2005-03-11 13:39:00) [2]WondeRu © (11.03.05 9:48) [4]
согласен, чушь накатал и повел за собой других :)
Набережных С. (2005-03-11 13:35:00) [3]
> Poirot © (11.03.05 13:24) [22]
Ошибаетесь. В [10] был не наезд, а провокация. С целью заставить начать думать или хотя бы воспользоваться хелпом.
> И всё что вы сказали сейчас можно было сказать и заранее
Конечно мог бы. Но мне трудно представить, что человек, рассуждающий об интерфейсах, да еще отсылающий к F1, не знает подобных вещей. Мне казалось, что это всем известно. А в [6] - просто оговорка, мелкая ошибка, вызванная обычной торопливостью. Такое со многими бывает, и со мной тоже. И потому ни в [8] , ни в [10] я ничего не сказал, давая Вам возможность поправиться самому, хотя бы с помощью хелпа. То, что Вы предпочли поступить иначе - Ваш личный выбор, винить в нем некого.
DiamondShark (2005-03-11 13:33:00) [4]
> при том. что в принципе всё к нему и сводится и GUID и само
> понятие интерфейса...
Гы-ыы ;)))
Poirot (2005-03-11 13:24:00) [5]Зы хотелось получить вразумительное объяснение - а не наезд - в [10] я вижу наезд - тон соответствующий.
Зызы: С интерфейсами хоть раз - работал, но вилдимо не с теми:)
зы-зы-зы:И всё что вы сказали сейчас можно было сказать и заранее. Справку читал и не раз. COM при том. что в принципе всё к нему и сводится и GUID и само понятие интерфейса...
Набережных С. (2005-03-11 13:12:00) [6]
> 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 12:33:00) [7]>>Поддержка интерфейсов -- внутренняя фича языка дельфи.
А вот то что вы хотели для примера
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
IInterface в Делфи тоже самое что и IUnknown. так что тут всё причём.
Это таки как раз и есть COM "полюбому":)
DiamondShark (2005-03-11 12:20:00) [8]А при чём тут классика, ком и ц?
Поддержка интерфейсов -- внутренняя фича языка дельфи.
Кстати, я тоже хорош: as тут вообще не подходит.
Poirot (2005-03-11 11:58:00) [9]>>DiamondShark © (11.03.05 11:47) [15]
Опятьже "книжная" реализация COM :) ане чепуха:) Так сказать классика на добром C++.
про as чепуха:)Это интересно:)
>>А IUnknown откуда возмётся?
Ну тогда вот вам и ответ - он возмётся от туда, что он есть базовый класс любого интерфейчас:) COM Догма:)
С as погорячился :)
DiamondShark (2005-03-11 11:52:00) [10]По сабжу:
Либо GetInterface с проверкой возврата,
либо as с отловом исключения.
DiamondShark (2005-03-11 11:50:00) [11]
> То всё работает и от Object as IsomeInterface <> nil
А нафига <> nil?
as возвращает либо ссылку на интерфейс, либо исключение, если интерфейс не реализован.
> что в данном случае вызовится IUnknown.QueryInterface
А IUnknown откуда возмётся?
DiamondShark (2005-03-11 11:47:00) [12]
> Poirot © (11.03.05 11:33) [13]
Какая чепуха.
> Варианты предложили - в разных случаях каждый работает....
> при условии, что QueryInterface реализован нормально...
> Можно TObject.GetInterface
> можно TObject.GetInterfaceEntry
Всё с точностью до наоборот: GetInterface и GetInterfaceEntry служат для реализации QueryInterface.
Poirot (2005-03-11 11:41:00) [13]Ok, QueryInterface лучший вариант:))
Гы:)
Poirot (2005-03-11 11:33:00) [14]Во-первых, мене это не нать.
Варианты предложили - в разных случаях каждый работает.... при условии, что QueryInterface реализован нормально...
Можно TObject.GetInterface
можно TObject.GetInterfaceEntry
Но если сделать по "учебнику" QueryInterface То всё работает и от Object as IsomeInterface <> nil я думаю вы не буите спорить, что в данном случае вызовится IUnknown.QueryInterface! или буите?! тогда хотелосьбы доква - у мена дебагер под руками!
Набережных С. (2005-03-11 11:26:00) [15]
> Poirot © (11.03.05 11:18) [11]
И что это меняет? Может, все-таки почитаешь справку, а?
Poirot (2005-03-11 11:18:00) [16]зы... маленькое дополнение - я имел ввиду QueryInterface интерфейса IUnknown.
Набережных С. (2005-03-11 11:18:00) [17]
> Poirot © (11.03.05 11:06) [9]
> Многое - гы:) В данном контексте подробнее не надо говорить
> об этом по моему:)
Да ну? А что, например? И почему не надо? Имхо, чего точно не надо делать, так это глупостей говорить. А надо, как ты и советовал, но сам почему-то не сделал, посмотреть справку. А в [4], как и в [3], полная ерунда написана, в обоих вариантах, от начала и до конца.
Poirot (2005-03-11 11:06:00) [18][8]
Ас?:)_) Многое - гы:) В данном контексте подробнее не надо говорить об этом по моему:)
Набережных С. (2005-03-11 11:02:00) [19]
> 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 ничего не делает?
Virgo_Style (2005-03-11 10:34:00) [20]Логично :-)