Для выполнения примера предполагается наличие в репозитории объекта «Ресурсы» с идентификатором «OBJ_RES». В файловой системе должны содержаться две пиктограммы: «C:\Icon_small.ico» и «C:\Icon_large.ico».
Добавьте ссылки на системные сборки:
для примера на Fore: Metabase, Drawing, IO;
для примера на Fore.NET: Metabase, Drawing, ForeIO, ForeSystem.
Sub UserProc;
Var
Mb: IMetabase;
Obj: IMetabaseObject;
CustomClassExtender: IMetabaseCustomExtender;
CustClasses: IMetabaseCustomClasses;
CustomClass: IMetabaseCustomClass;
Operations: IMetabaseCustomClassOperations;
Operation: IMetabaseCustomClassOperation;
CreateInfo: IMetabaseObjectCreateInfo;
Description: IMetabaseObjectDescriptor;
ImgList, ImgList32: IGxImageList;
Icon: IGxIcon;
CustomObject: IMetabaseCustomObject;
se: IMetabaseSecurity;
AL: IAuditLog;
ALogs: IAuditLogons;
AOperat: IAuditOperations;
i: Integer;
Lic: Object;
Begin
Mb := MetabaseClass.Active;
// Создание контейнера пользовательских классов
CreateInfo := Mb.CreateCreateInfo;
CreateInfo.ClassId := MetabaseObjectClass.KE_CLASS_CUSTOM_EXTENDER;
CreateInfo.Name := "CUSTOM_EXTENDER";
CreateInfo.Permanent := True;
CreateInfo.Parent := Mb.Root;
Description := Mb.CreateObject(CreateInfo);
Obj := Description.Edit;
CustomClassExtender := Obj As IMetabaseCustomExtender;
ImgList := New GxImageList.Create;
ImgList.Height := 16;
Icon := New GxIcon.CreateFromFile("C:\Icon_small.ico");
ImgList.AddIcon(Icon);
CustomClassExtender.SmallImages := ImgList;
ImgList32 := New GxImageList.Create;
ImgList32.Height := 32;
Icon := New GxIcon.CreateFromFile("C:\Icon_large.ico");
ImgList32.AddIcon(Icon);
CustomClassExtender.LargeImages := ImgList32;
CustomClassExtender.IsShared := True;
CustomClassExtender.Resource := Mb.ItemById("OBJ_RES").Bind As IResourceObject;
CustomClassExtender.NameResource := "ID_CUSTOM_EXTENDER";
// Добавление пользовательского класса в контейнер
CustClasses := CustomClassExtender.Classes;
CustomClass := CustClasses.Add;
CustomClass.Description := "Собственный класс";
CustomClass.Id := "MY_CLASS";
CustomClass.Name := "My_Class";
CustomClass.ImageIndex := 0;
Operations := CustomClass.Operations;
Operation := Operations.Add(0);
Operation.Name := "Новый метод";
Obj.Save;
// Создание объекта пользовательского класса
CreateInfo.ClassId := CustomClass.ClassId;
CreateInfo.Name := "Объект собственного класса";
CreateInfo.Permanent := True;
CreateInfo.Parent := Mb.Root;
Description := Mb.CreateObject(CreateInfo);
Obj := Description.Edit;
CustomObject := Obj As IMetabaseCustomObject;
CustomObject.Extender := CustomClassExtender;
CustomObject.CustomClass := CustomClass;
Obj.Save;
// Проверка прав доступа к операции пользовательского класса.
Lic := MB.RequestLicense(UiLicenseFeatureType.Adm);
se := Mb.Security;
Description.CheckAndAudit(CustomClass.Key, "Проверка прав доступа к операции");
Al := se.OpenAuditLog;
ALogs := AL.OpenLogons(False);
AOperat := AL.OpenOperations(ALogs.Session);
For i := 0 To 4 Do
Debug.WriteLine("Объект: " + AOperat.ObjectName);
Debug.WriteLine("Операция: " + AOperat.Name);
Debug.WriteLine("Успешно выполнена: " + AOperat.Succeeded.ToString);
Debug.WriteLine("Примечание: " + AOperat.Comment);
Debug.WriteLine("--------");
AOperat.Next;
End For;
Lic := Null;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Drawing;
Imports Prognoz.Platform.Interop.ForeIO;
Imports Prognoz.Platform.Interop.ForeSystem;
…
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
Obj: IMetabaseObject;
CustomClassExtender: IMetabaseCustomExtender;
CustClasses: IMetabaseCustomClasses;
CustomClass: IMetabaseCustomClass;
Operations: IMetabaseCustomClassOperations;
Operation: IMetabaseCustomClassOperation;
CreateInfo: IMetabaseObjectCreateInfo;
Description: IMetabaseObjectDescriptor;
ImgList, ImgList32: GxImageList;
Icon: GxIcon;
CustomObject: IMetabaseCustomObject;
se: IMetabaseSecurity;
AL: IAuditLog;
ALogs: IAuditLogons;
AOperat: IAuditOperations;
i: Integer;
Lic: Object;
Begin
Mb := Params.Metabase;
// Создание контейнера пользовательских классов
CreateInfo := Mb.CreateCreateInfo();
CreateInfo.ClassId := MetabaseObjectClass.KE_CLASS_CUSTOM_EXTENDER As Integer;
CreateInfo.Name := "CUSTOM_EXTENDER";
CreateInfo.Permanent := True;
CreateInfo.Parent := Mb.Root;
Description := Mb.CreateObject(CreateInfo);
Obj := Description.Edit();
CustomClassExtender := Obj As IMetabaseCustomExtender;
ImgList := New GxImageList.Create();
ImgList.Height := 16;
Icon := New GxIcon.Create();
Icon.CreateFromFile("C:\Icon_small.ico");
ImgList.AddIcon(Icon);
CustomClassExtender.SmallImages := ImgList;
ImgList32 := New GxImageList.Create();
ImgList32.Height := 32;
Icon := New GxIcon.Create();
Icon.CreateFromFile("C:\Icon_large.ico");
ImgList32.AddIcon(Icon);
CustomClassExtender.LargeImages := ImgList32;
CustomClassExtender.IsShared := True;
CustomClassExtender.Resource := Mb.ItemById["OBJ_RES"].Bind() As IResourceObject;
CustomClassExtender.NameResource := "ID_CUSTOM_EXTENDER";
// Добавление пользовательского класса в контейнер
CustClasses := CustomClassExtender.Classes;
CustomClass := CustClasses.Add();
CustomClass.Description := "Собственный класс";
CustomClass.Id := "MY_CLASS";
CustomClass.Name := "My_Class";
CustomClass.ImageIndex := 0;
Operations := CustomClass.Operations;
Operation := Operations.Add(0);
Operation.Name := "Новый метод";
Obj.Save();
// Создание объекта пользовательского класса
CreateInfo.ClassId := CustomClass.ClassId;
CreateInfo.Name := "Объект собственного класса";
CreateInfo.Permanent := True;
CreateInfo.Parent := Mb.Root;
Description := Mb.CreateObject(CreateInfo);
Obj := Description.Edit();
CustomObject := Obj As IMetabaseCustomObject;
CustomObject.Extender := CustomClassExtender;
CustomObject.CustomClass := CustomClass;
Obj.Save();
// Проверка прав доступа к операции пользовательского класса.
Lic := MB.RequestLicense(UiLicenseFeatureType.lftAdm);
se := Mb.Security;
Description.CheckAndAudit(CustomClass.Key As Integer, "Проверка прав доступа к операции");
Al := se.OpenAuditLog();
ALogs := AL.OpenLogons(False);
AOperat := AL.OpenOperations(ALogs.Session);
For i := 0 To 4 Do
System.Diagnostics.Debug.WriteLine("Объект: " + AOperat.ObjectName);
System.Diagnostics.Debug.WriteLine("Операция: " + AOperat.Name);
System.Diagnostics.Debug.WriteLine("Успешно выполнена: " + AOperat.Succeeded.ToString());
System.Diagnostics.Debug.WriteLine("Примечание: " + AOperat.Comment);
System.Diagnostics.Debug.WriteLine("--------");
AOperat.Next();
End For;
Lic := Null;
End Sub;
После выполнения примера будет создан контейнер пользовательских классов, содержащий один класс: «My_Class». Для контейнера будет определен идентификатор строкового ресурса «ID_CUSTOM_EXTENDER» из ресурсов «OBJ_RES». Для класса будет определена одна операция. В репозитории будет создан объект класса «My_Class». Источником большой пиктограммы для объекта будет файл «C:\Icon_large.ico», маленькой - «C:\Icon_small.ico». Для объекта будет проведена проверка прав доступна на операцию класса, результаты будут записаны в протокол доступа. Последние пять записей протокола доступа будут выведены в окно консоли.
См. также:
Примеры | IMetabaseCustomExtender | IMetabaseCustomClass | IMetabaseCustomClassOperation | IMetabaseCustomObject