КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Case ClientDataSetl.UpdateStatus of
Begin Приложение клиента Приложение "тонкого" клиента отличается от ранее рассмотренного приложения "толстого" клиента в первую очередь тем, что для "тонкого" клиента нужно выполнить следующие действия: § организовать связь между приложением клиента и сервером приложений; § обеспечить обмен информацией между наборами данных клиента и сервера. Для этого используются компоненты соединения и клиентский набор данных ciientDataset, размещаемые на форме клиента. Выбор компонента, используемого для соединения с сервером приложений, зависит от типа сервера: § DCOMConnection — для соединения с серверами DCOM и MTS; § Socketconnection — для соединения с сервером через сокеты TCP/IP; § corbaConnection — для соединения с сервером CORBA.
Создадим приложение клиента, подключаемого к рассмотренному выше серверу DCOM, для чего разместим на главной форме компонент DCOMConnection, расположенный в Палитре компонентов на странице DataSnap (отметим, что в Delphi 5 он находился на странице Midas). Основными свойствами этого компонента являются следующие: § ComputerName типа string — имя компьютера, на котором расположен сервер § ServerName типа string — имя сервера приложений; § serverGuiD типа string — универсальный уникальный идентификатор GUID сервера приложений; § Connected типа Boolean — признак, управляющий активностью соединения. Для указания компьютера, на котором расположен сервер приложений, удобно использовать окно Browse for Computer (рис. 12.4), вызываемое через Инспектор объектов. После выбора сетевого компьютера и нажатия кнопки ОК имя выбранного компьютера присваивается в качестве значения свойству ComputerName. Если сервер расположен на одном компьютере с приложением клиента (что удобно при отладке приложений), то свойству ComputerName значение не задается.
После того как компьютер задан, названия доступных (зарегистрированных) серверов автоматизации можно выбирать с помощью Инспектора объектов в списке значений свойства ServerName. Имя сервера является составным и включает в себя имя проекта приложения сервера и имя модуля данных, задаваемое для удаленного модуля данных, например, Server.ServerDCOM. Рис. 12.4. Выбор сетевого компьютера
Задание имени сервера приводит к автоматической установке идентификатора GUID выбранному серверу, который присваивается в качестве значения свойству ServerGOia GUID (Globally Unique Identifier — универсальный уникальный идентификатор) представляет собой 128-битную константу, присваиваемую объектам СОМ для их однозначной идентификации. Значение GUID показывается в модуле библиотеки типов сервера приложений. Сервер можно также задать, установив значение свойству ServerGUio, в этом случае значение свойства serverName заполняется автоматически. Однако первый путь, связанный с выбором имени сервера, более удобен. Чтобы протестировать соединение с сервером приложений, свойству connected устанавливается значение True. В этом случае сервер запускается автоматически, и с ним устанавливается соединение. В общем случае значение этого свойства можно не трогать, т. к. оно автоматически устанавливается в True при выборе провайдера для клиентского набора данных ciientDataSet. Клиентский набор данных ciientDataSet предназначен для работы с записями, поступающими с сервера приложений. Перечислим следующие свойства этого компонента:
§ ProviderName типа string — провайдер, обеспечивающий передачу данных;
§ PacketRecords типа integer — размер пакета данных; § FileName типа string — имя файла для обмена данными с диском.
В качестве значения свойства RemoteServer можно указывать любой из компонентов, используемых для соединения с сервером: ocoMConnection, Socketconnection, corbaConnection, а также Webconnection. Нужное значение удобно выбирать из списка Инспектора объектов. Так как для соединения с сервером DCOM на форме размещен компонент DCOMConnection, то в списке нужно выбрать его имя DCOMConnectioni, присвоенное компоненту по умолчанию. После того как соединение выбрано, с помощью свойства ProviderName задается провайдер, обеспечивающий передачу данных клиенту. При раскрытии в Инспекторе объектов списка значений этого свойства автоматически запускается сервер приложений, если он еще не был запущен, обеспечивая выдачу клиенту списка доступных провайдеров (наборов данных). Выбор имени провайдера приводит к соединению клиентского набора данных ciientDataSet с соответствующим набором данных сервера. В удаленном модуле данных рассмотренного ранее сервера приложений расположен набор данных Queryi, предоставляющий интерфейс iprovider, имя которого можно выбрать в качестве значения, присваиваемого свойству ProviderName. Для работы с данными в приложении клиента размещаются визуальные компоненты и источник данных DataSource, которые связываются между собой, а также с клиентским набором данных аналогично тому, как это выполнялось для рассмотренных ранее локальных приложений и для приложений "толстого" клиента. В приведенном на рис. 12.5 примере на форме приложения размещены компоненты DBGrid (сетка) и DataSource, свойство DataSet которого имеет зна-чение ciientDataSetl (имя компонента CiientDataSet по умолчанию). После установки свойству Active клиентского набора данных значения True в сетке отображаются записи набора данных Personnel, отбор которых обеспечивает оператор select набора данных Queryl сервера приложений. Чтобы расширить функциональность рассмотренного простейшего "тонкого" клиента, к нему добавляют возможности, связанные с модификацией записей, передачей изменений на сервер приложений (записью их в БД), обработкой конфликтов между клиентами, а также выполнением ряда других действий.
При работе с данными клиент может сохранять их на своем компьютере, работая в автономном режиме и не загружая сеть передачей информации. Обновленные данные передаются на сервер, а с сервера новые данные загружаются по мере необходимости. Этот принцип работы напоминает работу с кэшированны-ми изменениями и реализуется с помощью компонента ciientDataSet.
Рис. 12.5. Форма приложения "тонкого" клиента на этапе разработки
Для просмотра состояния текущей записи клиентского набора данных используется метод updatestatus: TUpdateStatus, возвращающий следующие значения: § usUnmodified — запись не имеет изменений; § usModified — запись изменена (отредактирована); § usinserted — запись вставлена (является новой); § usDeleted — запись удалена. Проанализировав состояние текущей записи, можно вывести соответствующее сообщение пользователю, например, в тексте надписи Label. Если код, выполняющий вызов метода и анализ его результата, расположить в обработчике события DataChange компонента DataSource, который связан с клиентским набором данных, то надпись будет автоматически отображать состояние текущей записи. Получить доступ ко всем изменениям, которые сделаны в записях, но еще не отправлены на сервер, позволяют свойства Data и Delta типа oleVariant, первое из которых представляет собой данные клиентского набора данных, а второе — его измененные данные (Delta-данные). Для получения измененных записей на форме располагается еще один компонент ciientDataSet, который связывается с первым клиентским набором данных следующим образом: ClientDataSet2.Data:=ClientDataSetl.Delta; Оба свойства доступны во время выполнения, поэтому их значения можно использовать только программно. После приведенного выше присваивания второй клиентский набор данных будет содержать все неотправленные изменения. Замечание Если изменения в записях отсутствуют, то при попытке выполнить присваивание генерируется исключительная ситуация.
Свойство ChangeCount типа integer, доступное во время выполнения, содержит число измененных записей, которое нужно проверять на равенство 0 перед тем, как делать попытку получить эти записи. То есть, оператор присваивания должен иметь следующий вид:
if ClientDataSetl.ChangeCount > О then ClientDataSet2.Data:=ClientDataSetl.Delta;
На рис. 12.6 показана форма клиентского приложения во время его выполнения. В верхней сетке DBGridi отображаются записи клиентского набора данных ClientDataSetl, которые доступны для просмотра и изменения. В надписи Labeii, расположенной над сеткой, выводится состояние текущей записи. Во второй сетке DBGrid2 отображаются изменения, сделанные в записях клиентского набора данных. Эта сетка через источник данных Datasource2 связана со вторым клиентским набором данных ciientDataSet2. Надписи Label2 и Label3 отображают текст "Изменения в записях" и число измененных записей, соответственно. Рис. 12.6. Просмотр состояния текущей записи и изменений в записях
Соответствующий код содержится в обработчике события DataChange источника данных DataSourcel, который связан с клиентским набором данных ClientDataSetl: procedure TForml.DataSourcelDataChange(Sender: TObject; Field: TField); usUnModified: Label1.Caption:='Запись не изменялась'; usModified: Labell.Caption:='3anMCb изменена'; uslnserted: Labell.Caption:='Запись вставлена'; usDeleted: Labell.Caption:='Запись удалена'; end; if ClientDataSetl.ChangeCount > 0 then ClientDataSet2.Data:=ClientDataSetl.Delta; Labe12.Caption:='Изменения в записях — ' + IntToStr(ClientDataSetl.ChangeCount); end;
На форме расположены также четыре кнопки:
§ Button2 — Отменить; § Button3 — Сохранить; § Button4 — Считать.
Назначение кнопок и обработчики событий их нажатия будут рассмотрены ниже. Сделанные изменения действуют только в приложении клиента и при завершении его работы теряются. Чтобы выполнить обновление данных, изменения нужно отправить на сервер приложений, для чего предназначается метод ApplyUpdates (MaxErrors: Integer): Integer. Параметр MaxErrors определяет максимальное число ошибок, допустимое при выполнении метода; если для параметра указать значение —1, то на сервер приложений будут переданы все изменения. В качестве результата функция ApplyUpdates возвращает число ошибок. Ошибки передачи изменений чаще всего вызваны конфликтами, связанными с редактированием этих же записей другими клиентами. Рассмотрим в качестве примера следующую процедуру: procedure TForml.ButtonlClick(Sender: TObject);
Дата добавления: 2014-01-07; Просмотров: 474; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |