Раз приложение простейшее, то я решил использовать БД MS Jet 4.0 (проще говоря БД MS Access). Это решение вызвано тем что Jet (прошу не путать с MS Access) является бесплатным продуктом и поставляется вместе с MS Windows (то бишь для работы нашей программы ненужно устанавливать на компьютер клиента сам Access). Да и редактор БД очень неплохой, и ядро поддерживает кучу типов полей для удовлетворения самых извращенных желаний при хранении данных.
Итак создадим новую БД, назовем ее Test и сохраним ее в папке C:\ClientServer\Server\Data (процесс создания новой БД в Аксесе я, по понятным, причинам опускаю, и приведу только структуру таблиц - входящих в нашу базу).
1. Таблица первая, назовем ее First
Имя поля
Тип
Описание
Index_
Счетчик (ключевое)
Привык я это делать - кому не нравится могут не создавать!Кстати Аксес сам предложит создать это поле если вы его не создадите - вот такой вот вредный этот майкрософт
Name
Текстовый (длина 50)
Birthday
Дата/Время (краткий формат Даты)
IdCod
Числовой
Address
Текстовый (длина 250)
2. Таблица вторая, а назовем ее уже по хитрому - Second
Имя поля
Тип
Описание
Index_
Счетчик (ключевое)
см. выше
ClientIndex
Числовой(длинное целое)
Поле для связи с главной таблицей
Phone
Текстовый
Ну вот, как бы, с базой и все.
Программа
2.1. Приложение сервер.
Созданим новое приложение и сохраним его под именем Server в папке C:\ClientServer\Server. Добавим в приложение Remote Data Module с вкладки Multitier репозитария (Рис. 1).
Рис. 1 Репозитарий с выделенным Remote Data Module.
При добавлении RDM мастер добавления запросит параметры данного модуля - там введем имя нашего сервера "Test".
Все остальное оставим без изменений. После нажатия кнопки "Ок" в проекте появится форма подобная обычному дата модулю с именем Test. Сохраним ее под именем RDMFrm.pas.
Выложим на нее компоненты ADOConnection (одна штука), ADOTable и DataSetProvider (по две штуки). Компоненты ADOTable и DataSetProvider обзовем - adotFirst, adotSecond, dspFirst и dspSecond соответственно. По двойному клику на компоненте ADOConnection вывалится мастер Connection String. Выбераем пункт "Use Connection String" и нажимаем кнопочку Build. В появившемся окне "Свойства связи с данными" выберем пункт "Microsoft Jet 4.0 OLE DB Provider" и нажмем кнопку "Далее". На владке "Подключение" введем путь к БД, нажмем кнопочку "Проверить подключение" и получим сообщение что проверка подключения выполнена. После чего закроем мастер путем нажатия на кнопке ОК. Еще у компонента ADOConnection свойство есть LoginPrompt, которое установим в False и Connected - True. У компонетов ADOTable свойство Connection установим равным ADOConnection путем выбора из выпадающего списка. Свойство TableName установим в First и Second соответсвенно. Свойство CursorType - ctDynamic, свойство TableDirect - True. Вызвать FieldsEditor и добавить туда все поля.
У компонентов DataSetProvider:
Свойство
Значение
DataSet
adotFirst и adotSecond соответственно
ResolveToDataSet
True
UpdateMode
upWhereKeyOnly
В опциях поднять флаги
poAutoREfresh
True
poPropogateChanges
True
Вот на этом процесс создания примитивного MIDAS сервера можно считать завершенным. Чтобы зарегистрировать сервер в подсистеме DCOM нужно запустить приложение с параметром /regserver - Server.exe /regserver. И последний штрих, это приложение СокетСервер от Борланда, которое находится в папке Delphi?/Bin/scktsvr.exe. Для того чтобы клиент мог видеть сервер нужно запустить scktsvr.exe (если у вас установлена Win NT/w2k/XP то можно это приложение зарегистрировать как службу, для этого его нужно запустить с параметром scktsvr.exe /install)
2.2. Приложение клиент
Создадим новое приложение, и сохраним его в папке C:\ClientServer\Client под именем Client. Разместим на главной форме по два компонента ClientDataSet(обзовем их cdsFirst, cdsSecond), DataSource(обзовем их dsFirst, dsSecond), DBGrid(обзовем их dbgFirst, dbgSecond) один компонент SocetConnection.
SocetConnection
Свойство
Значение
Host
Имя вашего компьютера - в последствии в это свойство нужно будет занести имя компьютера на котором будет рассположено приложение Сервер
ServerName
Если вы правильно заполнили свойство Host и запущено приложение СокетСервер то в выпадающем списке должно появится Server.Test - его и нужно выбрать.
Если вы все сделали правильно, то при установке свойства Connected в True, должно запустится приложение сервер.
ClientDataSet
Свойство
Значение
RemoteServer
SocetConnection
ProviderName
dspFirst и dspSecond соответственно
Active
True
Для cdsSecond
MasterSource
dsFirst
MasterFields
Index_
IndexFieldNames
ClientIndex
Запустим Редактор Полей (двойной клик по компоненту) и занесем туда все поля. Для компонентов ClientDataSet напишем обработчик sdsAfterPost
procedure TMainForm.cdsAfterPost(DataSet: TDataSet); begin with (DataSet as TClientDataSet) do begin if State in [dsEdit, dsInsert] then try ApplyUpdates(0); Refresh; except raise EDatabaseError.Create('Ошибочка вышла'); end; end; end;
И подставим его на обработку события AfterPost обоих ClientDataSet'ов.
DataSource
Свойство
Значение
DataSet
cdsFirst и cdsSecond соответственно
DBGrid
Свойство
Значение
DataSource
dsFirst и dsSecond соответственно
Запустим Редактор колонок (двойной клик по компоненту) и занесем туда все поля. Положим на форме возле Гридов по кнопке и в обработчик onClick запишем:
для dbgFirst - cdsFirst.Post
dbgSecond - cdsSecond.Post
Все. Закрываем Делфи (для чистоты эксперимента). И запускаем приложение клиент. Если вы все сделали правильно то вы должны увидеть нечто подобное этому
Если статья получит отзывы и заслужит интерес у читателей, то продолжение не заставит себя долго ждать.
Delphi,
Написание внешних компонент для 1С на Delphi Насколько мне известно, многие 1С-ники хотели бы изучить написание внешних компонент, чтобы поднять свое магическое искусство 1С на качественно иную ступень. Что этому может помешать? Во-первых, известный синдром компонентофобии (который исторически берет свое начало от криво написанных внешних компонент). Во-вторых –синдром клинически запутанного кода. OLE-программирование – это не самая простая штука, и, как говорится, «не всякая птица долетит до середины Днепра&...
Delphi,
Вывод графиков функций в Delphi Изучая доступную литературу по программированию, которую я нашел в Интернете, а также некоторые программы, я пришел к выводу, что программисты то ли не осознают, то ли не хотят напрягаться на эту тему, и всё делают, как в школе учили. Строят графики, как на бумаге. Тем самым умаляя возможности компьютера. Оставляя те же недостатки метода построения, и даже усугубляя их....
Delphi,
Приемы работы с базами данных в Delphi Данная статья предназначена в основном для тех, кто начинает работать с базами данных. Здесь собраны приемы, направленные на оптимизацию и ускорение работы с базами данных. Описанные примеры являются результатом многолетней работы автора с СУБД MS SQL Server, Oracle и Access. Примеры описываются в общем виде, без привязки к какой-либо конкретной СУБД....
Delphi,
Работа с потоками в Delphi Данная статья предназначена для начинающих программистов, которые никогда не работали с потоками, и хотели бы узнать основы работы с ними. Желательно, чтоб читатель знал основы ООП и имел какой-нибудь опыт работы в Delphi. Для начала давайте определимся, что под словом "поток" я подразумеваю именно Thread, который еще имеет название "нить"....
Delphi,
Запись CD-DVD дисков в Delphi Доброго времени суток уважаемые любители Delphi. В этой статье я расскажу про запись CD\DVD дисков в среде Delphi. Общие принципы, изложенные в этой статье подойдут не только для языка Delphi, но и для языка С++. Для прочтения этой статьи с максимальной пользой, читателю рекомендуется получить базовые понятия об OLE\COM, впрочем даже незнание этих понятий вряд ли помешает понимаю этой статьи, так как классы и компоненты Delphi (так же как и классы С++), которые мы будет использовать полностью ск...
Delphi,
Хуки в Windows на Delphi Тема про хуки является популярной на многих форумах программистов. Материал этих статей рассчитан на начинающего пользователя, примеры будут на Delphi. В этой статье будут изложены основные принципы механизма хуков, и будет написан пример клавиатурного шпиона....
Delphi,
Перехват API функций в Delphi с помощью сплайсинга Сегодня я расскажу довольно таки эффективную методику перехвата API функций. Не следует думать, что если мы хотим перехватить API функции, то мы пишем либо троян, вирус и ещё какую-нибудь заразу, с помощью перехвата API функций осуществляются многие защитные механизмы, перехват API функций это довольно-таки нужная и полезная вещь. Для прочтения данной статьи с максимальной пользой обязательны, нужны, как минимум, начальные знания низкоуровневого программирования и хотя бы какие-нибудь знания арх...