Тема: Удаление из памяти объектов TechnologiCS

Хоть вопрос удаления из памяти обсуждался на форуме, хотелось бы окончательно прояснить, как всё-таки правильнее освождать память по окончании работы с объектами API TechnologiCS.
Столкнулись вот с чем - при работе процедуры из разработанной нами библиотекми возникает следующая ошибка:

Недостаточно памяти для обработки команды

Ошибка возникает при расчёте плана изготовления на заказ, где более 150 позиций номенклатуры, для каждой позиции - около 10-12 операций. С заказами, где количество изготавливаемой номенклатуры меньше - всё работало нормально.
Удалось отследить, что ошибка возникает, когда в очередной раз выполняется следующее действие:

function GetPlanPosNeeds: real;
var
   OrderMovePlan: IDModule;
begin
   OrderMovePlan := TechPlan.ChildModules.ModuleByName['OrderMovePlan'].AsIDispatch as IDModule;
   CreateModule(OrderMovePlan);
   ...
   DeleteModule(OrderMovePlan);
end;

Для удаления OrderMovePlan, как и для других объектов в программе, используется пара процедур CreateModule(Module : IModule) и DeleteModule(Module : IModule):

procedure CreateModule(Module : IModule);
begin
   If CheckExist(Module)
   then (Module as IModule2).UserModuleName:=(Module as IModule2).UniqueUserModuleName
end;

procedure DeleteModule(Module : IModule);
begin
   try
      If CheckExist(Module as Imodule)
      then (TCSApp As IOCS_Application2).DeleteModuleByUserModuleName((Module as IModule2).UserModuleName);
  except    
  end;
end;

Функция CheckExist(Module as Imodule) служит для проверки существования созданных объектов TechnologiCS`а и выглядит так:

function CheckExist(Module: IModule): Boolean;
var
  Temp : integer;
begin
  Temp :=-1;
  try
     Temp := Module.Handle;
  except
     Result:=False;
     Exit;
  end;
  Result:=True;
end;

К ней приходится прибегать из-за того, что сравнение с nil и проверка функцией Assign не всегда даёт правильный результат.
Подскажите, пожалуйста, что мы делаем не так.

Re: Удаление из памяти объектов TechnologiCS

Любопытная реализация метода function CheckExist(Module: IModule): Boolean;
Я так понимаю она должна всегда возвращать True, хотя там ожидается исключение, на основании которого и...странновато

А если не секрет зачем в методе  GetPlanPosNeeds вообще такой код.  Производная от ChildModules сама уничтожится при выходе.  UserModuleName предназначен в основном для глобальных объектов,  для остальных это излишне.

Re: Удаление из памяти объектов TechnologiCS

Вот это еще можно почитать https://forum.technologics.ru/topic686.html

Re: Удаление из памяти объектов TechnologiCS

UserModuleName предназначен в основном для глобальных объектов,  для остальных это излишне

По опыту - не излишне. Выгружала большой объем информации из TechnologiCS в BAAN, память все равно заканчивается, к сожалению. Просто если убрать UserModuleName для производных объектов, память заканчивается быстрее.

Re: Удаление из памяти объектов TechnologiCS

Касательно

... метода function CheckExist(Module: IModule): Boolean;
Я так понимаю она должна всегда возвращать True...

Процедура работает - проверено. Если в функцию передаётся Module, которого не существуе, возникает ошибка с кодом 424 - "Object required (Требуется объект)" и возвращается результат False, иначе - всё проходит без ошибок и результат, соответственно, True.

А вот что касается того, что написано здесь - https://forum.technologics.ru/topic686.html:

Все остальные объекты  (полученные через Properties, ChildModules ) удалются системой автоматически при отсутcтвии ссылок на них, либо при удалении родительского объекта

так после того, как однажды столкнулись с полнейшим зависанием системы на обработке Properties нескольких сотен позиций стали всё подряд удалять через DeleteModuleByUserModuleName (соответственно с предварительным UserModuleName).