Работа с дескрипторами
Тип данных HANDLE (дескриптор) хранит указатель на структуру, представляющую работающую встроенную процедуру ABL или объект в процедуре, например сокет, временную таблицу или кнопку. Дескрипторы позволяют получить доступ к атрибутам и методам, которые ABL определяет для каждого объекта, которые вы можете использовать для взаимодействия с состоянием и поведением объекта.
Объекты на основе дескрипторов концептуально аналогичны объектам на основе классов, но отличаются от них. В отличие от объектов на основе классов типы и возможности всех объектов на основе дескрипторов встроены в AVM. Вы не можете определить свои собственные объекты на основе дескрипторов. Объекты на основе дескрипторов также не подвергаются сборке мусора. Вы должны управлять памятью, очищая объекты на основе дескрипторов, используя оператор DELETE OBJECT, когда они больше не нужны.
ABL автоматически создаёт экземпляры некоторых других типов объектов на основе дескрипторов различными способами, включая системные объекты, доступ к которым можно получить с помощью соответствующего системного дескриптора, определяемого ключевым словом. Примеры некоторых дескрипторов системных объектов:
- Системный дескриптор SESSION
- Системный дескриптор FILE-INFO
- Системный дескриптор ERROR-STATUS
- Системный дескриптор SECURITY-POLICY
Можно определять статические экземпляры или создавать динамические экземпляры многих типов объектов на основе дескрипторов, используя операторы DEFINE и CREATE. Ссылаться на статический экземпляр необходимо по определенному имени объекта или его дескриптору. Ссылаться на динамический экземпляр можно только по его дескриптору. В следующем примере кода показано, как определить и получить доступ как к статическому, так и к динамическому экземпляру объекта.
/* Define and access a static instance of an object */ /* Define a temp-table */ DEFINE TEMP-TABLE ttCustomer NO-UNDO FIELD CustName AS CHARACTER FIELD CustId AS CHARACTER. /* Define a handle variable */ VAR HANDLE tth. /* Set the handle to the statically defined temp-table */ tth = TEMP-TABLE ttCustomer:HANDLE. /* Access the HAS-RECORDS method using the handle */ DISPLAY "ttCustomer has records:" tth:HAS-RECORDS. /* Alternatively, access the HAS-RECORDS method using the object name*/ DISPLAY "ttCustomer has records:" TEMP-TABLE ttCustomer:HAS-RECORDS.
/* Define and access a dynamic instance of an object */ /* Define a handle variable */ VAR HANDLE tth. /* Create an empty temp-table */ CREATE TEMP-TABLE tth. tth:ADD-NEW-FIELD("CustName","CHARACTER"). tth:ADD-NEW-FIELD("CustId","CHARACTER"). tth:TEMP-TABLE-PREPARE("cust"). /* Access the HAS-RECORDS method using the handle */ DISPLAY "tth has records:" tth:HAS-RECORDS.
Некоторые часто используемые дескрипторы в ABL:
- Temp-table object handle
- Buffer object handle
- Buffer-field object handle
- Query object handle
- ProDataSet object handle
- Data-relation object handle
- Data-source object handle
Полный список системных и объектных дескрипторов см. в Handle Reference. Атрибуты и методы для дескрипторов типов объектов описаны в Handle Attributes and Methods Reference.