Студопедия

КАТЕГОРИИ:


Архитектура-(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 предназначен для работы с записями, поступающими с сервера приложений. Перечислим следующие свойства этого компонента:

  • RemoteServer ТИПЭ TCustomRemoteServer — соединение, используемое для свя­зи с сервером;

§ ProviderName типа string — провайдер, обеспечивающий передачу данных;

  • Active типа Boolean — признак, указывающий, открыт или закрыт набор данных;

§ 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;

 

На форме расположены также четыре кнопки:

  • Button1 — Отправить;

§ Button2 — Отменить;

§ Button3 — Сохранить;

§ Button4 — Считать.

 

Назначение кнопок и обработчики событий их нажатия будут рассмотрены ниже.

Сделанные изменения действуют только в приложении клиента и при заверше­нии его работы теряются. Чтобы выполнить обновление данных, изменения нужно отправить на сервер приложений, для чего предназначается метод ApplyUpdates (MaxErrors: Integer): Integer. Параметр MaxErrors определяет максимальное число ошибок, допустимое при выполнении метода; если для па­раметра указать значение —1, то на сервер приложений будут переданы все из­менения. В качестве результата функция ApplyUpdates возвращает число оши­бок. Ошибки передачи изменений чаще всего вызваны конфликтами, связан­ными с редактированием этих же записей другими клиентами.

Рассмотрим в качестве примера следующую процедуру:

procedure TForml.ButtonlClick(Sender: TObject);




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 474; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.028 сек.