Здравствуйте. Есть проблема с интерфейсами.
Есть 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;
Ну и так же есть конструктор формы, который создает класс Бэ и добавляет в его Tlist четыре значения
Код:
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 она вернуть не может, коворит несовместимые типа - указатель и интерфейс