![]() |
| ||
|
|
Новости |
Поиск |
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 10:06:00) [21]to [5]потомучто F1!!!
Смысл другой - в данном случае 'as' вызывает QueryInterface
т.е [4] оба варианта впринципе одинаковы!
Virgo_Style (2005-03-11 10:02:00) [22]
> if (Screen.Forms[I] as IFormDB) <> nil then ...
А почему не .. IS .. ?
WondeRu (2005-03-11 09:48:00) [23]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 ...
WondeRu (2005-03-11 09:46:00) [24]
if QueryInterface(StringToGUID('31E10702-B99C-42B9-BD95-3DE0EB1E27B2'), obj) = E_NoInterface then
ShowMessage( (Screen.Forms[I] as IFormDB).DataSource.DataSet.Name );
Fay (2005-03-11 05:52:00) [25]
if Supports(Screen.Forms[I], IFormDB) then
Defunct (2005-03-11 05:41:00) [26]а нельзя ли зарезервировать сообщение, ответив на которое форма уведомит о поддержке интерфейса?
if SendMessage( Screen.Forms[i].Handle, WM_INTERFACEQUERY, 0, 0) = <Ваш, заранее определенный ответ > then
ShowMessage( (Screen.Forms[I] as IFormDB).DataSource.DataSet.Name );