Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c