В списке хранятся идентификаторы документов. Но
TThreadList предназначен для хранения указателей. Поэтому для хранения в этом
списке идентификатора, имеющего тип Integer, придется привести его к типу
pointer. Конечно, если потребуется хранить дополнительную информацию о
документе, например, его номер, придется организовать в списке ссылки на
записи, с выделением памяти под эту запись и уничтожением ненужных записей. При
этом внешний вид функций не изменится, просто усложнится работа со списком, и
может понадобиться обращение к БД для получения дополнительной информации.
Теперь все просто: все модули данных, которые работают
с документами, используют эти две функции, и если RegisterDoc возвращает false
(а это произойдет только в том случае, если номер уже есть в списке), то
пользователю выдается сообщение, что с документом уже работают. Функция
UnregisterDoc просто удаляет номер из списка.
На клиенте понадобится, кроме доступа к двум
провайдерам, еще пара функций – получение нового значения CLIENT_ID для
справочника клиентов и получение полного имени клиента. Для этого необходимо
создать описание этих функций в библиотеке типов.
В зависимости от того, какой синтаксис используется в
редакторе библиотеки типов (IDL или Pascal), объявление этих функций выглядит
по-разному, ниже приведены их описания в protected-секции модуля данных:
protected
class procedure UpdateRegistry(Register:
Boolean; const ClassID, ProgID: string);
override;
function NewClientID: Integer; safecall;
function Get_ClientName(ClientID: Integer):
WideString; safecall;
|
На IDL это выглядит так:
[id(0x00000001)]
HRESULT
_stdcall NewClientID([out, retval] long * Result);
[propget, id(0x00000004)]
HRESULT
_stdcall ClientName([in] long ClientID, [out, retval] BSTR * Value);
|
Реализация этих функций довольно проста. Надо вызвать
хранимые процедуры, и выдать возвращаемое ими значение в качестве результата: