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

Вниз

Interface   Найти похожие ветки 

 
wild_arg ©   (2004-03-22 09:32) [0]

Есть у меня несколько чилдовых форм. В общем модуле описан интерфейс:
type
 IEdit = interface
   procedure Add(Sender: TObject);
   procedure Delete(Sender: TObject);
   procedure Edit(Sender: TObject);
 end;

Некоторые чилдовые формы являются наследниками этого интерфейса, некоторые нет. В главной форме есть переменная fChild : TForm, в определенных случаях в нее грузится одна из чилдовых форм, ну типа:
fChild := TFChild1.Create(Application)
или
fChild := TFChild2.Create(Application)
Ну добрались до вопроса :) Как мне узнать поддерживает ли очередная чилдовая форма интерфейс IEdit?
Такая комбинация не прокатила:
if fChild is IEdit then
...


 
Digitman ©   (2004-03-22 10:01) [1]

var
EditIntf: IEdit;
..

try
EditIntf := fChild as IEdit;
try
  ShowMessage("Объект fChild реализует интерфейс IChild");
  EditIntf.Add(..);
finally
 //здесь - осторожно !! объект может быть уничтожен
  EditIntf := nil;
end;
except
  ShowMessage("Объект fChild НЕ реализует интерфейс IChild");
end;


 
kosha80 ©   (2004-03-22 10:21) [2]

Попробуй так
if (fChild as IEdit)=nil then делать то-то

Но если fChild не создан, то все равно будет nil, а если создан и поддерживает этото интерфейс тогда уже будет не nil. Так и можно вызывать (fChild as IEdit).Add (...)

Попробуй...


 
kosha80 ©   (2004-03-22 10:21) [3]

Попробуй так
if (fChild as IEdit)=nil then делать то-то

Но если fChild не создан, то все равно будет nil, а если создан и поддерживает этото интерфейс тогда уже будет не nil. Так и можно вызывать (fChild as IEdit).Add (...)

Попробуй...


 
Asdor ©   (2004-03-22 10:31) [4]

SysUtils;

function Supports(const Instance: IInterface ; const IID: TGUID; out Intf): Boolean; overload;

function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; overload;

function Supports(const AClass: TClass; const IID: TGUID): Boolean; overload;


 
wild_arg ©   (2004-03-22 10:46) [5]

2AsdorНет смысла просто хелп переписывать, я вчера пытал эти функции - они для COM расчитаны...

2Digitman,kosha80 балалайка...
if (fChild as IEdit)=nil then ShowMessage("fuck")
else ShowMessage("ok");

Выдает error:Operator not applicable to this operand type


 
Asdor ©   (2004-03-22 10:56) [6]

Это каким же образом функция
function Supports(const AClass: TClass; const IID: TGUID): Boolean; overload; предназначена для COM?
Или большая сложность GUID для интерфейса определить, чтобы в описании класса сформировалось нормальное InterfaceEntry?


 
Digitman ©   (2004-03-22 11:12) [7]


> wild_arg


какая еще "балалайка" ?)
ты код в [1] пробовал ?


 
Тимохов ©   (2004-03-22 11:20) [8]

2Digitman ©   (22.03.04 10:01) [1]
EditIntf := fChild as IEdit;
try
 ShowMessage("Объект fChild реализует интерфейс IChild");
 EditIntf.Add(..);
finally
 EditIntf := nil;
end;

В данном случае может быть так (вернее точно будет), что на строке EditIntf := nil; произойдет уничтожение объекта fChild в случае если _AddRef и _Release реализованы как в tinterfacedobject. Не ясно подойдет ли это автору вопроса.


 
Digitman ©   (2004-03-22 11:28) [9]


> Не ясно подойдет ли это автору вопроса


а это уже его, автора, проблемы

просто ему в данном и общем случаях нужно четко понимать, как работает в том или ином случае неявный механизм подсчета ссылок, если он в принципе реализован тем или иным образом

вопрос-то был не в этом, а в том, как определить факт поддержки объектом того или иного интерфейса


 
wild_arg ©   (2004-03-22 11:50) [10]

2Digitman да блин, выражение fChild as IEdit не компилится - говорит Operator not applicable to this operand type


 
Тимохов ©   (2004-03-22 11:59) [11]

это потому, что fchild не описан как тип поддерживающий iedit.
нужно fchild: tmyform; tmyform = class(tform, iedit)


 
Digitman ©   (2004-03-22 12:02) [12]

EditIntf := fChild;


 
wild_arg ©   (2004-03-22 12:27) [13]

2Тимохов именно так и описан


 
Тимохов ©   (2004-03-22 12:40) [14]


> wild_arg ©   (22.03.04 12:27) [13]

тогда должно компилиться (проверил).


 
Digitman ©   (2004-03-22 13:04) [15]


> wild_arg


если fChild - это TForm, то ничего удивительного нет : TForm не реализует никаких IEdit



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

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

Наверх




Память: 0.5 MB
Время: 0.077 c
9-1070951482
DRON
2003-12-09 09:31
2004.04.11
Оцените новую игру Out of this world


8-1071123676
Gray
2003-12-11 09:21
2004.04.11
Записать сигнал с линейного входа


14-1079221368
Кудесник
2004-03-14 02:42
2004.04.11
Воин


1-1080161827
LoMaster
2004-03-24 23:57
2004.04.11
Как создать папку с длинным именем?


7-1080546924
New
2004-03-29 11:55
2004.04.11
Звук через модем