Форум: "Corba";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
ВнизПоддерживает ли об ект интерфейс ? Найти похожие ветки
← →
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 вся ветка
Форум: "Corba";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.015 c