Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2011, 02:33   #1
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию Ошибка при работе с интерфейсами

Пытаюсь разобраться с интерфейсами. У меня есть библиотека в которой храниться реализация интерфейса. Выглядит это примерно так:
Код:
library testDLL;

uses SysUtils;

type
  IObject = interface
    function GetIndex: cardinal;
    procedure SetProp(_type: byte; value: cardinal);
  end;
  IObjectManager = interface
    procedure CreateObject(out oOut: IObject);
    procedure Processing;
  end;
  IControler = interface
    functoin IObjManager: IObjectManager;
  end;
  TObject = class(TInterfacedObject,IObject)
    public
     function GetIndex: cardinal;
     procedure SetProp(_type: byte; value: cardinal);
    private
     _id: cardinal;
  end;
  TObjectManage = class(TInterfacedObject,IObjectManager)
   public
    procedure CreateObject(out oOut: IObject);
   private
     FObjectList: array [0..15] of TObject;
     FObjectCount: integer;
  end;
  TController = class(TInterfaceObject,IController)
   function IObjManager: IObjectManager;
   private
    FObjectManager: TObjectManager; 
   published
    constructor Create;
  end;

...  

procedure TObjectManager.CreateObject(out oOut: IObject);
begin
 FObjectList[FObjectCount] := TObject.Create;
 oOut := FObjectList[FObjectCount];
 inc(FObjectCount);
end;

procedure TObjectManager.Processing;
 var i: integer;
begin
 for i:= 0 to FObjectCount - 1 do
  if FObjectList[i] <> nil then
  begin
  ....
  end;
end;

function TController.IObjManager: IObjectManager;
begin
 Result := FObjectManager;
end;

constructor TController.Create;
begin
 inherited Create;
 FObjectManager := TObjectManager.Create;
end;

var MainController: TController;

procedure Init(out controll: IController);
begin
 MainController := TController.Create;
 controll := MainController;
end;

exports
 Init;

begin
end.
В самой программе я статично вызываю процедуру Init. Все нормально создается и возвращается. Дальше я создаю объект в программе
Код:
 var obj: IObject;
....
 controll.IObjManager.CreateObject(obj)
 obj.SetProp(0,5533)
....
Тут все нормально, в список добавляется. Затем я запускаю таймер и там ввызываю процессинг
Код:
 controll.IObjManager.Processing;
И вут тут то я получаю ошибку AV. Пишет что не может прочитать в адресс $00000000. Методом тыка выяснил, что это на этой строчке
Код:
 if FObjectList[i] <> nil then
Тоесть при попытке обращения с списку, хотя до этого обращение к списку шло нормально. Жду помощи в решении это вопроса.
ПС. Менеджер памяти не помог

Последний раз редактировалось alexprey; 09.08.2011 в 15:01.
alexprey вне форума Ответить с цитированием
Старый 09.08.2011, 10:16   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. проверить (посмотреть) значения FObjectCount
при создании объекта; при других операциях.
2. Project Options добавить контроль диапазонов.
Изображения
Тип файла: jpg 1.JPG (39.5 Кб, 66 просмотров)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.08.2011, 11:41   #3
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

1. FObjectCount как и должно равно 1
2. Сейчас проверим...
... Не помогло. Также вызывается ошибка. Когда навожу на FObjectList во время проссинга то пишет Inaccessiable value, хотя остальные данные (не массив) возвращаются нормально

Последний раз редактировалось alexprey; 09.08.2011 в 11:44.
alexprey вне форума Ответить с цитированием
Старый 09.08.2011, 11:53   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

потеряли одну строчечку:

Код:
FObjectManager := TObjectManager.Create();
догадаетесь, где она должна быть?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.08.2011, 14:59   #5
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

Она есть. Просто я не написал её в примере.
alexprey вне форума Ответить с цитированием
Старый 09.08.2011, 16:07   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

посмотри эту тему
у тебя та же ошибка. (неправильное хранение интерфейсных объектов).
FObjectList: array [0..15] of TObject;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.08.2011, 20:11   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Причину уже указал evg_m.

Работаете с интерфейсами - ну так и работайте с интерфейсами. Смешение механизмов управления временем жизни ни к чему хорошему не приведёт.

Аналогичная проблема с MainController.

По остальному:
1. Имя TObject - крайне плохая идея. Такой тип уже есть.
2. Интерфейсы лучше выносить в отдельный модуль.
3. IObjManager - плохое имя. Почему не GetObjManager или GetManager?
4. array [0..15] - почему статический?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 10.08.2011, 12:39   #8
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

Тоесть получается нужно хранить объекты в качестве интерфейса??? А если мне его нужно будет получить как класс внутри библиотеки?
alexprey вне форума Ответить с цитированием
Старый 10.08.2011, 13:35   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
А если мне его нужно будет получить как класс внутри библиотеки?
Цитата:
Работаете с интерфейсами - ну так и работайте с интерфейсами. Смешение механизмов управления временем жизни ни к чему хорошему не приведёт.
Внутри одного объекта все что угодно, к другим объектам, в том числе и этого класса (типа) только интерфейсы.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.08.2011, 14:33   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
А если мне его нужно будет получить как класс внутри библиотеки?
Реализуйте у объекта

Код:
type
  IGetMySelf = interface
  ['GUID']
    function GetSelf: TMyObject;
  end;
Библиотека может запросить IGetMySelf у IObject и через GetSelf получить объект.

Ещё лучше - пусть объект реализует

Код:
type
  IInternalObject = interface
  ['GUID']
    function GetThat: Something;
    procedure DoThis;
    ...
  end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с процедурой Hant111 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 21.03.2010 20:10
ошибка при работе с указателем Vladss Общие вопросы C/C++ 22 29.07.2009 03:58
Ошибка при работе с компонентой Нюська Компоненты Delphi 12 27.05.2009 00:35
Ошибка при работе с потоками vitalik007 Общие вопросы Delphi 6 09.03.2008 09:25
Ошибка при работе с БД malevich БД в Delphi 8 25.11.2007 15:10