Заказ звонка

Закрыть

*
*
*

Как грамотно освобождать память от пользовательских модулей

Страницы: 1
RSS
Как грамотно освобождать память от пользовательских модулей
Есть такой код
Код
Dim UsrGm
Set UsrGm = TCSApp.CreateUserGModule("SerNums"))

Если сделать так
Код
UsrGm.UserModuleName = UsrGm.UniqueUserModuleName

выдает ошибку
Правильно ли я понимаю, нужно просто сделать так
Код
Call TCSApp.DeleteModuleByUserModuleName("SerNums")

??? То есть функция CreateUserGModule уже присваивает объекту уникальное имя "SerNums"?
Да, в данном случае именование модуля происходит при его создании (только закрывающая скобка там одна лишняя).

Обычно именование и затем поименное удаление объектов делается для экономии оперативной памяти. При многократном создании визуального объекта, например в цикле, производится значительное увеличение занятой памяти. В вашем случае, создается один объект за сеанс, и даже если пользователь несколько раз запустит скрипт, то это не сильно отразится на количестве выделенной памяти.
Так и есть: "функция CreateUserGModule уже присваивает объекту уникальное имя"
Для объектов класса UserGModule свойства .UserModuleName, .UniqueUserModuleName не поддерживаются, поэтому
Код
UsrGm.UserModuleName = UsrGm.UniqueUserModuleName
делать НЕ надо.
Изменено: Петр Бобов - 27.11.2008 11:50:12
1. Можно ли в пользовательском модуле создавать сложную шапку (которая состоит из подшапок)?
2. Можно ли как-то использовать в нем фильтр?
3. Можно ли настроить в нем зависимые объекты?
1. Для создания многоуровневой шапки, в заголовке свойства разделите наименования колонок символом |
Код
Call UsrGm.AddProp( "ID", "Номенклатура|Идентификатор", 3, False, True, 0 )
Call UsrGm.AddProp( "NAME", "Номенклатура|Наименование", 1, True, False, 0 )
одинаковые наименования верхних колонок сольются в одну.
Количество уровней не должно превышать десяти.

2. К сожалению, хотя кнопка фильтра и присутствует на форме, поддержка ее не реализована. Я выходил из положения так: заранее фильтровал данные максимально удобным способом, либо создавал команды фильтрации, по которым данный модуль закрывался, данные фильтровались и модуль очищался и заново наполнялся отфильтрованными данными.

3. Зависимые объекты также не поддерживаются. Я выходил из положения так: создавал команды с названием необходимых зависимых, по которым открывался новый пользовательский модуль, наполненный соответствующими данными.
Изменено: Сергей Девятериков - 03.12.2008 13:21:10
Для создания и удаления корневых объектов специально завел процедуры

Для только что созанного объекта делаем UnbindRootObject(x as IDispatch)
Код
procedure UnbindRootObject(const Obj : IDispatch);
var
  M2 : CSDN_TLB.IModule2;
begin
  M2:= Obj as CSDN_TLB.IModule2;
  M2.UserModuleName:= M2.UniqueUserModuleName;
end;


Cоотсветсвенно уничтожаем с SafeDestroyRootObject(x as IDispatch)

Код
function SafeDestroyRootObject(const M : IDispatch) : boolean;
var
  Module2 : CSDN_TLB.IModule2;
begin
  Result:= false;
  try
    if M = nil then
      exit;

    Module2:= M as CSDN_TLB.IModule2;

    if Module2 = nil then
      exit;

    Module2.UserModuleName:= Module2.UniqueUserModuleName;
    OCS_App2.DeleteModuleByUserModuleName(Module2.UserModuleName);

    Result:= true;
  except
  end;
end;
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)