Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
1-1082371768
Awod
2004-04-19 14:49
2004.04.11
Иконка приложения


1-1080044443
AsD
2004-03-23 15:20
2004.04.11
Консольное приложение


3-1081860223
gosha
2004-04-13 16:43
2004.04.11
Не сохраняются данные


14-1082017092
Empleado
2004-04-15 12:18
2004.04.11
nostalgie


1-1079887878
mur
2004-03-21 19:51
2004.04.11
как эмулировать событие?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский