Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.07.2011, 11:27
mikmik1 mikmik1 вне форума
Прохожий
 
Регистрация: 06.07.2011
Сообщения: 3
Репутация: 10
По умолчанию проблема с интерфейсами и классам

Здравствуйте. Есть проблема с интерфейсами.
Есть 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 она вернуть не может, коворит несовместимые типа - указатель и интерфейс
Ответить с цитированием
  #2  
Старый 06.07.2011, 12:27
mikmik1 mikmik1 вне форума
Прохожий
 
Регистрация: 06.07.2011
Сообщения: 3
Репутация: 10
По умолчанию отбой

Все, отбой, нашел в чем прикол
тут все описано http://www.swissdelphicenter.ch/torr...ode.php?id=898
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter