Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

Первые шаги в создании интерфейсов   Найти похожие ветки 

 
Bizon's ©   (2004-05-31 20:43) [0]

Привет всем!!!
Объясните кто может (желательно подробнейи с кодом)
 Так вот, есть следующий код
 IMy = interface
   ["{A5C0D7CC-3EC4-4090-A0F8-3D03271877EA}"]
   function GetValue1: Integer;
 end;

 TMy = class(TComponent, IMy)
   function GetValue1: Integer;
 end;

 function TMy.GetValue1: Integer;
 begin
   Result := 0;
 end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
 c1, c2: TMy;
 i: Integer;
begin
 c1:=TMy.Create(Self);
 i:=(c1 as IMy).GetValue1;
 ShowMessage(IntToStr(i));
 c1.Destroy;

 c2:=TMy.Create(Self);
 i:=(c2 as IMy).GetValue1;
 ShowMessage(IntToStr(i));
 c2.Destroy;
end;


 И вот не последнем дестое выбивает аксес виолейшен.
 Объясните в чем  проблема. Или киньте ссылки URL где можно почитать.


 
VMcL ©   (2004-05-31 22:58) [1]

>>Bizon"s ©  (31.05.04 20:43)

IMy = interface
 ["{A5C0D7CC-3EC4-4090-A0F8-3D03271877EA}"]
 function GetValue1: Integer;
end;

TMy = class(TInterfacedObject, IMy)
 function GetValue1: Integer;
end;

function TMy.GetValue1: Integer;
begin
 Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
c1, c2: IMy;
i: Integer;
begin
c1:=TMy.Create(Self);
i:=c1.GetValue1;
ShowMessage(IntToStr(i));
//c1.Destroy;

c2:=TMy.Create(Self);
i:=c2.GetValue1;
ShowMessage(IntToStr(i));
//c2.Destroy;
end;

?


 
default ©   (2004-05-31 23:04) [2]

да лучше с теории начинать, типа нафиг там какие-то интерфейсы придумали...


 
default ©   (2004-05-31 23:26) [3]

только вот это оставь
TMy = class(TComponent, IMy)
  function GetValue1: Integer;
end;
а не это...
TMy = class(TInterfacedObject, IMy)
function GetValue1: Integer;
end;


 
Cobalt ©   (2004-06-01 21:39) [4]

А в 4-ой Дельфе вообще ругается на
i:=(c1 as IMy).GetValue1;
[Error] Unit1.pas(47): Operator not applicable to this operand type
А после этого
i:=c1.GetValue1; - Всё ок.

А вот в 7-ой - всё тихо, как в могиле ;-)


 
Bizon's ©   (2004-06-02 00:27) [5]

Да ну всеже объясните в чем проблема? В чем ошибка?

Нужно расширить какой то класс на несколько функций, а потом
привести именно к интерфейсу и вызвать функцию.


 
default ©   (2004-06-02 00:58) [6]

вот так будет работать
procedure TForm1.Button1Click(Sender: TObject);
var
c1, c2: TMy;
i: Integer;
begin
c1:=TMy.Create(Self);
i:=(c1 as IMy).GetValue1;
ShowMessage(IntToStr(i));

c2:=TMy.Create(Self);
i:=(c2 as IMy).GetValue1;
ShowMessage(IntToStr(i));
end;
как я понял при привед-ии класса к интер-су созд-ся интер-ая пер-ая
ты убиваешь об-т, а при выходе из проц-ры код компил-ра пыт-ся ещё раз убить об-т и возн-ет AV(поскольку число ссылок на об-т обнуляется - всё из-за созд-ия интер-ой пер-ой)
поэтому убрав дестр-ры всё и зараб-ло
лучше делай так как в [1]+[3]


 
default ©   (2004-06-02 01:14) [7]

ещё такой момент
procedure TForm1.Button1Click(Sender: TObject);
var
c1, c2: TMy;
i: Integer;
begin
c1:=TMy.Create(Self);
i:=(c1 as IMy).GetValue1;
ShowMessage(IntToStr(i));
c1.Destroy;

c2:=TMy.Create(Self);
i:=(c2 as IMy).GetValue1;
ShowMessage(IntToStr(i));
//c2.Destroy;

end;
такой код работать будет поск-ку первый об-т ты унич-ешь сам, второй же уничт-ся после выхода из проц-ры кодом комп-ра(из-за интер-ой пере-ой, кстати в этом коде она только одна созд-ся комп-ом и "связана" в конце уже со вторыи об-ом)

procedure TForm1.Button1Click(Sender: TObject);
var
c1, c2: TMy;
i: Integer;
begin
c1:=TMy.Create(Self);
i:=(c1 as IMy).GetValue1;
ShowMessage(IntToStr(i));
//c1.Destroy;

c2:=TMy.Create(Self);
i:=(c2 as IMy).GetValue1;
ShowMessage(IntToStr(i));
c2.Destroy;

end;
такой раб-ать не будет
первый об-т удал-ся компил-ом как мусор, интер-ая же пер-ая "связана" уже со вторым об-ом поэтому удал-ие второго об-та будет "двойным" что вызовет AV
думаю всё стало понятно


 
Bizon's ©   (2004-06-02 11:17) [8]

С этим я согласен, сам на днях проверал.

Но как можна избежать AV? Может нужно переписать _AddRef и _Release чтобы правильно ссылки считало? И как это правильно сделать?


 
Bizon's ©   (2004-06-03 21:24) [9]

Что неужели никто не знает?

Например, когда привести TComponent к интерфейсу IInterface и вызвать функцию с интерфейса, то все работает отлично.
Так что же делать?


 
Cobalt ©   (2004-06-04 15:55) [10]

Говорят, что у Анатолия Подгорецкого на сайте есть хорошая книга по 5-ой Дельфи, там, типа, хорошо описано про интерфейсы. Хотя сам ещё не читал, но мне рекомендуют.


 
APXi   (2004-06-04 22:06) [11]

...
ShowMessage(IntToStr(i));
//c1.Destroy;
c1 := nil;

...
ShowMessage(IntToStr(i));
//c2.Destroy;
c2 := nil;


 
Bizon's ©   (2004-06-05 11:10) [12]

В таком случае освобождается ли память после c1 и c2 или нет (_Release вызывается только один раз)?


 
default ©   (2004-06-05 18:52) [13]

Bizon"s ©   (05.06.04 11:10) [12]
писать надо так как в [1]


 
Cobalt ©   (2004-06-08 08:38) [14]

Если c1, c2: IMy;
то при присвоении Nil будет освобождаться эта переменная и (смею утверждать) будет вызван метод _Release.


 
default ©   (2004-06-08 22:51) [15]

а кто спорит?


 
malkolinge ©   (2004-06-16 19:43) [16]

Просто запомни правило. Если у объекта запршен интерфейс, то вызывать деструктор нельзя. Причина - автоматический подсчет ссылок. Кстати к TComponent это не относиться


 
имя   (2004-06-17 07:12) [17]

Удалено модератором



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

Форум: "Corba";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.045 c
1-1109846733
Openfire
2005-03-03 13:45
2005.03.20
DBGrid и PageControl


1-1109862724
Володя
2005-03-03 18:12
2005.03.20
диспечер задачь


3-1108965165
sutener
2005-02-21 08:52
2005.03.20
Сохранение файлов в БД!!!


4-1107854819
MetalFan
2005-02-08 12:26
2005.03.20
EnumServicesStatus


4-1107329395
Neznaika
2005-02-02 10:29
2005.03.20
Сворачивание на панели задач





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский