Суть заметки в двух словах: организация dpr-файла и вынос мозга инициализации приложения в DataModule.
Эту заметку не стоит рассматривать как единственно верный вариант. Просто я хочу поделиться опытом. Я расскажу, как делаю я и как это делается у нас. Ничего особенного. Но самостоятельно к этому приходят не все и не сразу.
А делаю я так, потому что описанный ниже подход облегчает сопровождение проектов (особенно, когда их несколько, и все они потихоньку разрастаются).
Итак, первое, что я всегда делаю после установки Delphi – снимаю флаг с пункта меню Auto create forms uses AppExt, Forms, DataModule in ‘DataModule.pas’ ; begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TDM, DM); Application.Run; end.
Тут хочу акцентировать внимание на том, что в dpr-файле создаётся только DataModule (DM). Остальные формы будут добавляться в uses, но секция begin – end. затрагиваться не будет.
И вот всё самое интересное выносим в DataModule.OnCreate. Это могут быть: SplashScreen, логгер критических ошибок, чтение пользовательских предпочтений, словарь данных, текстовые ресурсы. Здесь же спрашиваем логин/пароль у пользователя, если мы работаем с БД (и если без подключения к БД работать нет смысла). У меня всё это выглядит примерно так:
Создание программы Таймер | Программирование на Delphi
procedure TAppDataModule.DataModuleCreate(Sender: TObject); begin CheckParamStr; PrepareGlobalConfig; PrepareLanguages; CreateSplashScreen; try ShowSplashScreen; PrepareHelp; ProgressMsg(stInitialization); PrepareConnection; ProgressMsg(stDictionary); PrepareDictionary; ProgressMsg(stAuthentication); if QueryConnect then try AfterConnected; ProgressMsg(stLoading); PrepareDataModules; PrepareMainForm; except Connection.Disconnect; raise; end; finally FreeSplashScreen; end; end;
Пару комментариев к коду. Сначала показываем SplashScreen, чтобы пользователю не было “скучно”.
Затем загружаем всё необходимое для работы приложения. QueryConnect в наших приложениях – это отображение полей ввода для пароля/логина к БД прям в окне SplashScreen и запуск цикла с Application.ProcessMessages, чтобы пользователь мог их ввести; плюс N-попыток подключения к БД. Если подключиться не удалось – QueryConnect вернёт False и произойдёт нормальное завершение приложения (т.к. Application.MainForm ещё не определён).
PrepareDataModules – создаёт остальные датамодули. У нас их несколько – один хранит в себе ImageList’ы (т.е. все пиктограммы для тулбаров и меню собраны в одном месте, это очень удобно), другой содержит компоненты FastReport’а и механизмы для работы с отчётами, третий – датасеты (ну у нас не датасеты и генерируется оно автоматически, но инициализировать это тоже надо).
PrepareMainForm – создаёт главную форму приложения, ей будет передано управление в Application.Run сразу после выхода из приведённого обработчика.
Ещё Вы можете обратить внимание на то, что датамодуль у нас называется DM, а код выше я (намеренно) представил от имени TAppDataModule (вместо TDM). Это ещё одно упрощение для сопровождения – TAppDataModule содержит набор виртуальных методов (типа AfterConnected и PrepareMainForm) и является общим для группы проектов. А для конкретного проекта (типа MyTestProject) TDM наследуется от TAppDataModule и содержит уникальные для приложения вещи. (К слову сказать, TAppDataModule и остальные датамодули у нас наследуется от базового датамодуля, по аналогии с формами.)
Уроки Delphi (Делфи) для начинающих с нуля. Урок №1 «Визуальная среда разработки программ»
И конечно же есть обработчик DataModule.OnDestroy, я его приводить не буду – понятно, что там содержится код для корректного отключения от БД (если ещё не отключились), сохранение настроек (которые ещё не сохранились), освобождение памяти (которая ещё не освободилась).
Источник: www.delphinotes.ru
Delphi. Datasnap. Как создать клиентское приложение?
Тут, насколько я понимаю вариантов несколько – ведь если сервер приложений DataSnap уже создан, а также подключен к СУБД то нужно только подключиться к нему. В данном посте будем рассматривать самый простой случай создания клиента – VCL Delphi приложение, которое просто подключим к серверу в данном посте, а в последующих постах научим его вставлять, править и удалять данные. Итак, поехали…
Подготовительная работа. Что нужно настроить на сервере приложений DataSnap?
В предыдущем посте мы добавили в модуль методов сервера приложений DataSnap следующие компоненты…
Теперь нужно только их настроить… SqlDataset1 я настроил таким образом… (заполнил свойства CommandType и CommandText, а также SQLConnection и выставил в Active)
DataSetProvider я настроил таким образом… (DataSet выставил в SQLDataSet1, а также в Options добавил poAllowCommandText)
Собственно создание клиентского приложения DataSnap на Delphi
Создадим форму и разместим на ней следующие компоненты…
Здесь у нас на форме приложения VCL присутствуют
–SQLConnection1 для связи с сервером приложений DataSnap
–DSProviderConnection1 для связи с провайдером сервера
–ClientDataSet1 для хранения множества
–DataSource1 для транслирования множества
-DBGrid1 для отображения множества
Как настроить компоненты клиента Delphi DataSnap?
Здесь самое главное – выбрать драйвер DataSnap. Можно раскрыть свойства драйвера и там настроить более внимательно – хост, порты и так далее. Но если сервер создавали с помощью мастера и не меняли порты, а также работаете на localhost, то все встает автоматически.
Если попробовать поставить Connected в True, то если не запущен сервер – получим ошибку. Важный момент – Боб Сварт в своей книге по DataSnap советует у клиента свойства подключения к серверу выставлять при создании клиента (например в FormCreate). Потому что если свойство Connected у клиента установлено в True, то Delphi каждый раз при открытии проекта в IDE пытается подключить клиента к серверу приложений, а он может быть не всегда запущен. Тоже самое касается ClientDataSet. Вообще, если у ClientDataSet1 выставить в True свойство Active, то у SQLConnection подключенного по нашей схеме свойство Connected тоже встанет в True, и наоборот.
У DSProviderConnection меняем 2 свойства – SQLConnection – ставим SQLConnection1, и второе – ServerClassName (берем из модуля серверных методов название типа) – TServerMethods1
У ClientDataSet1 самое главное выставить
RemoteServer – DSProviderConnection1
ProviderName – DataSetProvider1 (появится из списка – этот компонент на стороне сервера, если их там несколько, то здесь появится также несколько. Важно! Если тип сервера выбран не TDSServerModule, то из выпадающего списка ничего не выпадет, а при попытке прописать туда что-то руками выпадет ошибка)
Также, свойство Active поставим в False;
У DataSource поставим свойство DataSet в ClientDataSet1
У DBGrid выставим свойство DataSource в DataSource1…
Как из клиента подключиться к серверу приложений DataSnap?
Итак, запустим сервер приложений DataSnap…
Далее, в FormCreate клиентского приложения пропишем следующий код…
Источник: digital-flame.ru
Создание клиент-серверного приложения в Delphi
Итак создадим новую БД, назовем ее Test и сохраним ее в папке C:ClientServerServerData (процесс создания новой БД в Аксесе я, по понятным, причинам опускаю, и приведу только структуру таблиц — входящих в нашу базу).
1. Таблица первая, назовем ее First
2. Таблица вторая, а назовем ее уже по хитрому — Second
Ну вот, как бы, с базой и все.
Программа
2.1. Приложение сервер.
Созданим новое приложение и сохраним его под именем Server в папке C:ClientServerServer. Добавим в приложение 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 и добавить туда все поля.
Вот на этом процесс создания примитивного MIDAS сервера можно считать завершенным. Чтобы зарегистрировать сервер в подсистеме DCOM нужно запустить приложение с параметром /regserver — Server.exe /regserver.
И последний штрих, это приложение СокетСервер от Борланда, которое находится в папке Delphi?/Bin/scktsvr.exe. Для того чтобы клиент мог видеть сервер нужно запустить scktsvr.exe (если у вас установлена Win NT/w2k/XP то можно это приложение зарегистрировать как службу, для этого его нужно запустить с параметром scktsvr.exe /install)
2.2. Приложение клиент
Создадим новое приложение, и сохраним его в папке C:ClientServerClient под именем Client. Разместим на главной форме по два компонента ClientDataSet(обзовем их cdsFirst, cdsSecond), DataSource(обзовем их dsFirst, dsSecond), DBGrid(обзовем их dbgFirst, dbgSecond) один компонент SocetConnection.
SocetConnection
Если вы все сделали правильно, то при установке свойства Connected в True, должно запустится приложение сервер.
ClientDataSet
Запустим Редактор Полей (двойной клик по компоненту) и занесем туда все поля. Для компонентов 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
DBGrid
Запустим Редактор колонок (двойной клик по компоненту) и занесем туда все поля.
Положим на форме возле Гридов по кнопке и в обработчик onClick запишем:
- для dbgFirst — cdsFirst.Post
- dbgSecond — cdsSecond.Post
Все. Закрываем Делфи (для чистоты эксперимента). И запускаем приложение клиент. Если вы все сделали правильно то вы должны увидеть нечто подобное этому
Если статья получит отзывы и заслужит интерес у читателей, то продолжение не заставит себя долго ждать.
При копировании материалов наличие активной индексируемой ссылки на сайт обязательно.
Источник: www.cyberguru.ru