|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
проблема с интерфейсами и классам
Здравствуйте. Есть проблема с интерфейсами.
Есть 2 простых интерфейса А и Бэ Код:
Ia = Interface(IInterface) function GetSame: Integer; end; Ib = Interface(IInterface) function GetA(i: Integer): Ia; End; Соответственно есть 2 класса Код:
Ta = class(TInterfacedObject, Ia) Same: Integer; function GetSame: Integer; end; Tb = class(TInterfacedObject, Ib) La: TList; function GetA(i: Integer): Ia; // возвращает А procedure SetA(Val: Integer); constructor create(); end; var B:Tb; расписанный Бэ: Код:
constructor Tb.create; begin La := TList.create; end; function Tb.GetA(i: Integer): Ia; begin // result := Ia(La.Items[i]); // почему так не работает? result := Ta(La.Items[i]); end; procedure Tb.SetA(Val: Integer); var a: Ta; begin a := Ta.create; a.Same := Val; La.Add(a); end; Код:
procedure TForm2.FormCreate(Sender: TObject); begin b:=tb.create; b.SetA(5); b.SetA(6); b.SetA(7); b.SetA(8); end; есть обработчик кнопки, который просто перебирает значения в Бэ Код:
procedure TForm2.Button1Click(Sender: TObject); var i:integer; a:Ia; begin for i:=0 to b.La.Count-1 do begin a:=b.GetA(i); end; end; Проблема вот в чем - первое нажатие на кнопку проходит отлично, без вопросов все значения возвращаются. А вот нажмешь второй раз - и все, Invalid pointer operator второй раз не срабатывает a:=b.GetA(i); тоесть заходит в функцию GetA, там La.Items[i] ссылается на некий адрес, который не изменился с момента первого нажатия на кнопку, и даже Ta(La.Items[i]) дебаггер определяет как (FRefCount=0, Same=5). А нажмешь F6 - и все, кердык. Вылетает с ошибкой. Подскажите, пожалуйста, в чем беда. Есть подозрение, что я накосячил в function Tb.GetA(i: Integer): Ia; она должна вернуть Ia, а возвращает Ta, может там ошибка кроется? Ia она вернуть не может, коворит несовместимые типа - указатель и интерфейс |
#2
|
|||
|
|||
отбой
Все, отбой, нашел в чем прикол
тут все описано http://www.swissdelphicenter.ch/torr...ode.php?id=898 |