Разработка базы данных
|
Задание
Разработка клиент - серверного приложения.
Введение в технологию клиент-сервер
База данных представляет собой набор файлов на сетевом сервере. Характерная особенность архитектуры клиент-сервер является перенос вычислительной нагрузки на сервер БД(SQL сервер), а также максимальная разгрузка клиента от вычислительной работы и существенное укрепление данных. Взаимодействие сервера и клиента реализуется с помощью SQL запросов, которые формирует и отсылает серверу клиент. Сервер, приняв запрос, выполняет его и возвращает результат клиенту. В клиентском приложении в основном осуществляется интерпретация полученных от сервера данных, реализация пользовательского интерфейса, также реализация части бизнес - правил.
Преимущества архитектуры клиент - сервер:
o Большинство вычислительных процессов происходит на сервере, что снижает требования к вычислительной мощности клиента.
o Снижается сетевой трафик, так как пересылаются не все данные, только запрошенные.
o БД на сервере представляет единый файл, в котором содержатся таблицы, ограничения целостности и другие компоненты БД. Взломать, похитить или испортить такую БД значительно труднее; существенно величивается защищенность БД от ввода неправильных значений. Кроме того для каждого пользователя станавливаются свои уровни доступа.
o Сервер реализует правление транзакциями и предотвращаета попытки одновременного изменения одних и тех же данных.
Сервер базы данных
При выборе сервера базы данных я остановился на промышленном сервере InterBase. InterBase - лродной сервер для Delphi. Для доступа к нему не нужно станавливать дополнительных драйверов. Все данные хранятся на сервере в файле Предметная область Программа предназначена для чета медицинских аппаратов, имеющихся в воинских частях.
Основная задача - чет драгоценных металлов, содержащихся в этих аппаратах, возможность подсчета списанных, не списанных и общего числа аппаратов в отдельно взятой части и сумма драг. металлов, в них содержащихся. Создание базы данных Структура таблиц и связей между ними:
Рис. 1
Форматы полей в таблицах:
CREATE TABLE CHASTT (
KOD INTEGER NOT NULL,
VCH VARCHAR(20) NOT NULL
)
CREATE TABLE MODELL (
KOD3 INTEGER NOT NULL,
MODEL VARCHAR(160) NOT NULL,
K2 INTEGER
)
CREATE TABLE NAIMM (
KOD2 INTEGER NOT NULL,
NAIM VARCHAR(160) NOT NULL,
K1 INTEGER
)
CREATE TABLE RAZDELL (
KOD1 INTEGER NOT NULL,
RAZDEL VARCHAR(160) NOT NULL
)
CREATE TABLE SVODKA (
KOD5 INTEGER NOT NULL,
SERNO VARCHAR(20),
K4 INTEGER NOT NULL,
SER FLOAT,
ZOL FLOAT,
DVIP CHAR(4),
DVVOD CHAR(4),
DSPIS CHAR(4),
SROK SMALLINT,
KATEGOR SMALLINT,
CENA FLOAT,
K3 INTEGER
)
Между полями в таблицах установлена ссылочная целостность согласно рисунку 1.
В InterBase отсутствует аппарат автоинкрементных столбцов. Вместо этого для становки никальных значений столбцов я использовал аппарат генераторов. Перед запоминанием для каждой таблицы генерируется никальное значение с помощью функции Gen<_ CREATE TRIGGER NOVOE FOR RAZDELL BEFORE INSERT
POSITION 0 AS BEGIN END Удаленными процедурами не пользовался - хватило возможностей Задал индексы по полям: Modell. Проектирование приложения в среде Delphi Используемые средства Приложение было написано в среде Delphi 7 на компьютере Athlon 1600+XP, что очень плохо, потому что приложение написано для компьютера, намного ступающего по мощности моему. Платформа БД - InterBase 6.0. Формы
Для доступа к данным я использовал компоненты со вкладки InterBase, характерной особенностью которых является то, что они не обращаются к BDE и являются более компактными и быстрыми. Назначение компонентов: o
IBDataBase1 - создает соединение с БД InterBase.
Есть свойство DataBaseName, которое казывает имя физической БД, с которой связан компонент. При связи с даленной БД по протоколу TCP\\<имя сервера>\<имя файла БД>; по протоколу SPX - в формате <имя сервера>@<имя файла БД>. При запуске приложения расположение БД берется из файла del. Inii := TIniFile.Create(getcurrentdir+'\del.ini');
IBDatabase1.Connected:=true;
IBTransaction1.Active:=true;
IBTable1.Active:=true;
IBTable2.Active:=true;
IBTable3.Active:=true; аIBTable4.Active:=true;
IBTable5.Active:=true; IBTable44.Active:=true; Текст файла del. [Baza] Put=D:\interBase\base.gdb Следущее использованное свойство -
USER_NAME=SYSDBA PASSWORD=masterkey lc_ctype=WIN1251 Тут задается имя пользователя и пароль - окно с запросом пароля при подключении не появляется. o
IBTranzaction1 - транзакция o
IBTable<~ - аналог TTable.
Отличается тем, что работает быстрее и грузит данные по надобности. o
IBQyery~ - аналог TQuery. o
OPDial - окно выбора файла - для загрузки запроса из файла. При попытке сохранения записи в таблицу Svodka запускается процедура: procedure TDM.IBTable1BeforePost(DataSet: TDataSet); begin MessageDlg('Введите номер воинской части',mterror,[mbok],0); MessageDlg('Введите серийный номер аппарата
MessageDlg('Введите модель аппарата
а end; Нужна для предотвращения занесения Еще один нюанс - если брать строку (*), то при добавлении новой записи будет выдаваться ошибка, что не заполнено поле, на которое стоит ограничение FormMain и
FormVvod2 FormMain - основная, родительская форма для всех остальных форм. правление отображением дочерних окон внутри родительской осуществляется с помощью Api функции ShowWindow.
FormVvod2
Ц экранная форма с отображением параметров одного конкретно взятого прибора.
Навигация идет по таблице Svodka, с которой связан компонент
IBTable1 из формы DM. Воинская часть и модель отображаются с помощью связи компонента TLookupKomboBox из компонентов IBTable44
и IBTable5 соответственно. Вид форм при работе программы: FormVvod В форме отображаются записи таблицы Vch В форме - список всех воинских частей. Вид: С помощью галочки Связанный набор можно станавливать или бирать связь между таблицами Разде, Наименование и Модель. Тип связей: Наименование подчиненная для Раздела, Модель - подчиненная для Наименования. Процедура клика на CheckBox: procedure TSvazka.CheckClick(Sender: TObject); begin dm.IBTable3.active:=false;
dm.IBTable4.active:=false;
dm.IBTable3.IndexFieldNames:='K1';
dm.IBTable3.MasterSource:=dm.DataSource2; аdm.IBTable4.IndexFieldNames:=' K2';
dm.IBTable4.MasterSource:=dm.DataSource3;
dm.IBTable3.active:=true;
dm.IBTable4.active:=true; dm.IBTable3.MasterSource:=nil; dm.IBTable3.IndexFieldNames:='NAIM';
dm.IBTable4.MasterSource:=nil;
dm.IBTable4.IndexFieldNames:='MODEL'; end; Из текста процедуры видно,
что мы меняем свойства MasterSource, которое содержит ссылку на главную таблицу и выставляем индекс - для сортировки по алфавиту при отсутствии связей между таблицами. Но эта форма используется еще и для задания параметров запросу, который будет рассмотрен ниже. Avt и Opr О авторе и о программе. ZaprVibr
Форма нужна для выбора типа запроса(а по запросу формируем отчет). Запросы Поиск не списанного или списанного аппарата Вид формы: DbGrid связана с Zapr1 через
DZapr. Текст запроса: select kod5,vch,model,serno,dvip,cena from SVODKA,CHASTT,MODELL whereа K4 in (select KOD )
(select KOD3
) and svodka.k4=chastt.kod and svodka.k3=modell.kod3 order
by vch Тут используются вложенные запросы. Параметры берутся из полей Zapr1.Active:=false;
Zapr1.Active:=true;
При нажатии на кнопку просто задаются параметры Работает запрос так: ищутся такие записи в ппарат является не списанным, если в поле УDSpisФ (Дата списания) содержится значение Отобранные записи сортируются по номеру воинской части (Order Кнопка Перейти нужна для перехода в таблице IBTable1 ак аппарату, который является текущим в таблице отобранных с помощью запроса аппаратов. Процедура нажатия на кнопку Перейти: procedure TZ1.SpeedButton1Click(Sender: TObject); begin dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr1.FieldByName('kod5').Value]),[]);
ShowWindow(formvvod2.Handle, SW_SHOW); end; Переход нужен для просмотра параметров, которые не выводятся запросом или же для изменения значений полей. Поиск аппарата по группам Добавились 3 CheckBox - для выбора по какому критерию мы будем отбирать аппараты. Одновременно больше одного критерия быть выбрано не может. Процедура нажатия на кнопку Выполнить: procedure TSvazka.SpeedButton2Click(Sender: TObject); begin Zapr3.Active:=false; ShowWindow(z3.Handle,
SW_SHOW); end; Процедура заполняет В этой форме таблица связанна с Загрузка запроса из файла. Текст запроса загружается с помощью метода Пример: Текст запроса в файле Все из сводки. select
* from
svodka /* грузит все из таблицы сводки */ Список аппаратов в определенной части Для этого запроса меня просили сделать отчет. Запрос показывает все аппараты в заданной воинской части со всеми их характеристиками. Поиск идет по неполному совпадению (Like). Но если нужен отчет, то надо задать номер воинской части полностью (чтоб по нескольким воинским частям выборки не произошло). Текст sql запроса: select
vch,razdel,naim,model,serno,dspis,dvvod,cena,ser,zol,pt,pg,kod5 from chastt,razdell,naimm,modell,svodka where chastt.vch like :par
and
and
and
and razdell.kod1=naimm.k1 order by vch,razdel,naim,model,dspis Этот запрос я сделал без подзапросов (не знаю что быстрее, наверное быстрее без подзапросов, зато с подзапросами нагляднее). Формирование отчета. В Delphi 7 отчеты делаются же не с помощью компонентов QReport, с помощью Rave Report.
Вкладки QReport больше не существует. Так как система Delphi 7 вышла недавно, то пришлось разбираться по справке. В общем то принципы остались те же - разбитие документа на несколько полос и т. д. Для работы с отчетами на форме расположено два не визуальных компонента - RvProject1, с помощью которого идет связь с файлом проекта и RvDataSetConnection1 - связь с набором данных. Файл проекта строится с помощью тилиты Rave Designer. Отчет при проектировании выглядит так: Я сформировал отчет,
выровнял и сохранил как Отчет вызывается по нажатии на кнопку Отчет через метод Заключение Самый сложный этап - формирование таблиц, связей между ними, ссылочной целостности. Типы данных в InterBase какие-то корявые. Float - точность 7 знаков. Если вносишь десятичную дробь,
целая часть у которой равна нулю, то в дробной части гарантируется точность до
7 знаков после запятой. Например, если внести 0.123, потом сохранить запись,
то в этом поле будет число 0.1234233858, что конечно же не наглядно и прибавляет программисту лишней головной боли. Тип Я получил приложение,
которое осуществляет все виды операций с даленной базой данных, такие, как вставка, даление, выборка данных. Подключение идет через стандартные сетевые протоколы к серверу баз данных InterBase. Если сравнивать локальные и сетевые базы данных, то, на мой взгляд, будущее за сетевыми базами данных, а локальные базы будут ходить в прошлое. Причина - широкое распространение локальных сетей и сети Internet. Проще подключиться к сети,
сформировать запрос и тут же получить нужные данные, чем хранить все на своем компьютере. Как видно из моей работы, с помощью объектно-ориентированного программирования строить сложное приложение становится все проще и проще, растут мощности компьютеров,
объемы ОЗУ и ПЗУ и приложения работают с базами данных все быстрее и быстрее. Список используемой литературы: 1. Microsoftо
Access 2, И.А. Харитонова, В.Д. Михеева, издательство БХВ - Петербург,
1 2. Базы данных: учебный курс, С.В. Глушаков, Д.В. Ломотько, Издательство АСТ,
2 3. Delphi
5 Руководство разработчика баз данных, В.В. Фаронов, П.В. Шумаков,
издательство Нолидж, 2001 4. Работа с базами данных в Delphi, В.Э. Гофман, А.Д. Хомоненко, БХВ - Петербург, 2 5. Microsoft
SQL Server 7 для профессионалов, Е. Мамаев, А. Вишневский, 2 6. Файлы справки по Delphi7. Листинг программы unit Unit1;
а
<{ Private declarations }
<{ Public declarations } unit Unit2;
а
<{ Private declarations }
<{ Public declarations } unit Unit3;
а
<{ Private declarations }
<{ Public declarations } unit Unit4;
а
<{ Private declarations }
<{ Public declarations } unit Unit5;
а
<{ Private declarations }
<{ Public declarations } unit Unit6;
а
<{ Private declarations }
<{ Public declarations } unit Unit7;
а
<{ Private declarations }
<{ Public declarations } unit Unit8;
а
<{ Private declarations }
<{ Public declarations } unit Unit9;
а
а
<{ Private declarations }
<{ Public declarations } unit Unit10;
а
<{ Private declarations }
<{ Public declarations } unit Unit11;
а
<{ Private declarations }
<{ Public declarations } unit Unit12;
а
<{ Private declarations }
<{ Public declarations } unit Unit13;
а
<{ Private declarations }
<{ Public declarations } unit Unit14;
а
<{ Private declarations }
<{ Public declarations }
Первая форма типа DataModule - УDMФ, на которой располагаются не визуальные компонента доступа к данным. Вид формы на этапе проектирования:
Вид формы при работе программы:
Svazka
Вид формы:
Вид формы:
Данные запросы почти полностью одинаковы, рассмотрим поиск не списанного аппарата.
После выбора данного вида поиска на экране появляется форма УSvazkaФ, дополненная несколькими элементами. Ее вид:
Форма с результатами:
Вид формы:
Вид отчета при работе приложения:
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, Menus;
type
а TFormMain = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
а
а
var
а FormMain: TFormMain;
implementation
uses Unit4, Unit2, Unit6, Unit5, Unit7, Unit13, Unit14;
<{$R *.dfm}
procedure TFormMain.N10Click(Sender: TObject);
begin
а
C1.Visible:=false; dbgrid1.ReadOnly:=false;
C2.Visible:=false; dbgrid2.ReadOnly:=false;
C3.Visible:=false; dbgrid3.ReadOnly:=false;
SpeedButton2.Visible:=false;
а
а
procedure TFormMain.N7Click(Sender: TObject);
begin
а ShowWindow(formvvod.Handle, SW_SHOW);
а
procedure TFormMain.N8Click(Sender: TObject);
begin
а ShowWindow(formvvod2.Handle, SW_SHOW);
а
procedure TFormMain.N9Click(Sender: TObject);
begin
а ShowWindow(vch.Handle, SW_SHOW);
а
procedure TFormMain.N6Click(Sender: TObject);
begin
а
procedure TFormMain.N3Click(Sender: TObject);
begin
а ShowWindow(zaprvibr.Handle, SW_SHOW);
а
procedure TFormMain.N13Click(Sender: TObject);
begin
а ShowWindow(avtor.Handle, SW_SHOW);
а
procedure TFormMain.N12Click(Sender: TObject);
begin
а ShowWindow(Opr.Handle, SW_SHOW);
а Opr.Show;
end;
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, Grids, DBGrids, ExtCtrls,
DBCtrls;
type
а TFormVvod = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
а
а
var
а FormVvod: TFormVvod;
implementation
uses Unit3, Unit4;
<{$R *.dfm}
procedure TFormVvod.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(Formvvod.Handle, SW_HIDE);
а
end.
interface
uses
а SysUtils, Classes, DB, IBCustomDataSet,
IBTable, IBDatabase, Qdialogs,
а IBQuery, Dialogs,inifiles;
type
а TDM = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBTable1: TIBTable;
IBTable2: TIBTable;
IBTable3: TIBTable;
IBTable4: TIBTable;
DataSource1: TDataSource;
DataSource2: TDataSource;
DataSource3: TDataSource;
DataSource4: TDataSource;
IBTable5: TIBTable;
DataSource5: TDataSource;
IBTable1KOD5: TIntegerField;
IBTable1SERNO: TIBStringField;
IBTable1K4: TIntegerField;
IBTable1SER: TFloatField;
IBTable1ZOL: TFloatField;
IBTable1PT: TFloatField;
IBTable1PG: TFloatField;
IBTable1DVIP: TIBStringField;
IBTable1DVVOD: TIBStringField;
IBTable1DSPIS: TIBStringField;
IBTable1SROK: TSmallintField;
IBTable1KATEGOR: TSmallintField;
IBTable1CENA: TFloatField;
IBTable1PRIMECH: TIBStringField;
IBTable1K3: TIntegerField;
IBTable44: TIBTable;
DataSource44: TDataSource;
IBTable1Look4: TStringField;
IBTable1Look3: TStringField;
Zapr1: TIBQuery;
DZapr: TDataSource;
Zapr1VCH: TIBStringField;
Zapr1MODEL: TIBStringField;
Zapr1SERNO: TIBStringField;
Zapr1DVIP: TIBStringField;
Zapr1CENA: TFloatField;
Zapr1KOD5: TIntegerField;
Zapr2: TIBQuery;
IBStringField1: TIBStringField;
IBStringField2: TIBStringField;
IBStringField3: TIBStringField;
IBStringField4: TIBStringField;
FloatField1: TFloatField;
IntegerField1: TIntegerField;
Zapr2DSPIS: TIBStringField;
Zapr2PRIMECH: TIBStringField;
DZapr2: TDataSource;
Zapr3: TIBQuery;
DZapr3: TDataSource;
Zapr3NAIM: TIBStringField;
Zapr3MODEL: TIBStringField;
Zapr3VCH: TIBStringField;
Zapr3SERNO: TIBStringField;
Zapr3DSPIS: TIBStringField;
Zapr3CENA: TFloatField;
Zapr3KOD5: TIntegerField;
Zapr4: TIBQuery;
DZapr4: TDataSource;
Zapr4VCH: TIBStringField;
Zapr4RAZDEL: TIBStringField;
Zapr4NAIM: TIBStringField;
Zapr4MODEL: TIBStringField;
Zapr4SERNO: TIBStringField;
Zapr4DSPIS: TIBStringField;
Zapr4DVVOD: TIBStringField;
Zapr4CENA: TFloatField;
Zapr4SER: TFloatField;
Zapr4ZOL: TFloatField;
Zapr4PT: TFloatField;
Zapr4PG: TFloatField;
Zapr5: TIBQuery;
DZapr5: TDataSource;
OpDial: TOpenDialog;
Zapr4KOD5: TIntegerField;
а
а
var
а DM: TDM;
implementation
uses Unit4;
<{$R *.dfm}
procedure TDM.IBTable2BeforePost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable3BeforePost(DataSet: TDataSet);
var str:ansistring;
begin
а
procedure TDM.IBTable4BeforePost(DataSet: TDataSet);
var str:ansistring;
begin
а
procedure TDM.IBTable2AfterPost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable3AfterPost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable4AfterPost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable5BeforePost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable5AfterPost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable1BeforePost(DataSet: TDataSet);
begin
а
procedure TDM.IBTable1AfterPost(DataSet: TDataSet);
begin
а
procedure TDM.DataModuleCreate(Sender: TObject);
var
а Inii: TIniFile;
а
а Inii := TIniFile.Create(getcurrentdir+<'\del.ini');
а
IBTransaction1.Active:=true;
IBTable1.Active:=true;
IBTable2.Active:=true;
IBTable3.Active:=true;
IBTable4.Active:=true;
IBTable5.Active:=true;
IBTable44.Active:=true;
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, Grids, DBGrids, StdCtrls,
ExtCtrls, DBCtrls, Buttons;
type
а TSvazka = class(TForm)
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DBGrid3: TDBGrid;
DBNavigator1: TDBNavigator;
DBNavigator2: TDBNavigator;
DBNavigator3: TDBNavigator;
Check: TCheckBox;
C1: TCheckBox;
C2: TCheckBox;
C3: TCheckBox;
SpeedButton2: TSpeedButton;
а
а
var
а Svazka: TSvazka;
implementation
uses Unit3, Unit10;
<{$R *.dfm}
procedure TSvazka.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(Svazka.Handle, SW_HIDE);
а
end;
procedure TSvazka.CheckClick(Sender: TObject);
begin
а
dm.IBTable4.active:=false;
dm.IBTable3.IndexFieldNames:=<'K1';
аdm.IBTable3.MasterSource:=dm.DataSource2;
dm.IBTable4.IndexFieldNames:=<'K2';
dm.IBTable4.MasterSource:=dm.DataSource3;
dm.IBTable3.active:=true;
dm.IBTable4.active:=true;
а
dm.IBTable3.IndexFieldNames:=<'NAIM';
dm.IBTable4.MasterSource:=nil;
dm.IBTable4.IndexFieldNames:=<'MODEL';
а
procedure TSvazka.C3Click(Sender: TObject);
begin
if c3.Checked then begin
а
end;
procedure TSvazka.C2Click(Sender: TObject);
begin
if c2.Checked then begin
а
end;
procedure TSvazka.C1Click(Sender: TObject);
begin
if c1.Checked then begin
а
end;
procedure TSvazka.SpeedButton2Click(Sender: TObject);
begin
а
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, ExtCtrls, DBCtrls, Grids,
DBGrids;
type
а TVch = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
а
а
var
а Vch: TVch;
implementation
uses Unit2, Unit3;
<{$R *.dfm}
procedure TVch.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(vch.Handle, SW_HIDE);
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, DBCtrls, StdCtrls, ExtCtrls,
Mask;
type
а TFormVvod2 = class(TForm)
Label1: TLabel;
DBNavigator1: TDBNavigator;
DBLookupComboBox1: TDBLookupComboBox;
Label2: TLabel;
DBLookupComboBox2: TDBLookupComboBox;
Label3: TLabel;
DBEdit1: TDBEdit;
Bevel1: TBevel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
DBComboBox1: TDBComboBox;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
DBEdit5: TDBEdit;
DBEdit6: TDBEdit;
DBEdit7: TDBEdit;
DBEdit8: TDBEdit;
DBEdit9: TDBEdit;
DBEdit10: TDBEdit;
DBEdit11: TDBEdit;
а
а
var
а FormVvod2: TFormVvod2;
implementation
uses Unit3;
<{$R *.dfm}
procedure TFormVvod2.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(Formvvod2.Handle, SW_HIDE);
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, StdCtrls, ExtCtrls, Buttons;
type
а TZaprVibr = class(TForm)
RG: TRadioGroup;
SpeedButton1: TSpeedButton;
а
а
var
а ZaprVibr: TZaprVibr;
implementation
uses Unit8, Unit9, Unit4, Unit11, Unit12;
<{$R *.dfm}
procedure TZaprVibr.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(Handle, SW_HIDE);
а
procedure TZaprVibr.SpeedButton1Click(Sender: TObject);
begin
case rg.ItemIndex of
а 0:begin
ShowWindow(z1.Handle, SW_SHOW);
ShowWindow(z2.Handle, SW_SHOW);
а
C2.Visible:=true; dbgrid2.ReadOnly:=true;
C3.Visible:=true; dbgrid3.ReadOnly:=true;
SpeedButton2.Visible:=true;
ShowWindow(z4.Handle, SW_SHOW);
ShowWindow(z5.Handle, SW_SHOW);
close;
end;
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, Grids, DBGrids, Buttons,
StdCtrls;
type
а TZ1 = class(TForm)
SpeedButton2: TSpeedButton;
DBGrid1: TDBGrid;
Ch1: TCheckBox;
Ch2: TCheckBox;
Ch3: TCheckBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
SpeedButton1: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
а
а
var
а Z1: TZ1;
implementation
uses Unit3, Unit6;
<{$R *.dfm}
procedure TZ1.SpeedButton2Click(Sender: TObject);
begin
а
а
а
procedure TZ1.Ch1Click(Sender: TObject);
begin
а
procedure TZ1.Ch2Click(Sender: TObject);
begin
а
procedure TZ1.Ch3Click(Sender: TObject);
begin
а
procedure TZ1.SpeedButton1Click(Sender: TObject);
begin
а dm.IBTable1.Locate(<'KOD5',vararrayof([dm.zapr1.FieldByName(<'kod5').Value]),[]);
а ShowWindow(formvvod2.Handle, SW_SHOW);
а
procedure TZ1.DBGrid1DblClick(Sender: TObject);
begin
а
procedure TZ1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а dm.Zapr1.Active:=false;
а ShowWindow(Handle, SW_HIDE);
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, StdCtrls, Grids, DBGrids,
Buttons;
type
а TZ2 = class(TForm)
SpeedButton2: TSpeedButton;
SpeedButton1: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
DBGrid1: TDBGrid;
Ch1: TCheckBox;
Ch2: TCheckBox;
Ch3: TCheckBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
а
а
var
а Z2: TZ2;
implementation
uses Unit3, Unit6;
<{$R *.dfm}
procedure TZ2.SpeedButton2Click(Sender: TObject);
begin
а
а
а
procedure TZ2.Ch1Click(Sender: TObject);
begin
а
procedure TZ2.Ch2Click(Sender: TObject);
begin
а
procedure TZ2.Ch3Click(Sender: TObject);
begin
а
procedure TZ2.SpeedButton1Click(Sender: TObject);
begin
а dm.IBTable1.Locate(<'KOD5',vararrayof([dm.zapr1.FieldByName(<'kod5').Value]),[]);
а ShowWindow(formvvod2.Handle, SW_SHOW);
а
procedure TZ2.DBGrid1DblClick(Sender: TObject);
begin
а
procedure TZ2.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а dm.Zapr2.Active:=false;
а ShowWindow(Handle, SW_HIDE);
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, DBCtrls, StdCtrls, ExtCtrls, Grids,
DBGrids, Buttons;
type
а TZ3 = class(TForm)
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
SpeedButton1: TSpeedButton;
а
а
var
а Z3: TZ3;
implementation
uses Unit3, Unit6;
<{$R *.dfm}
procedure TZ3.SpeedButton1Click(Sender: TObject);
begin
а dm.IBTable1.Locate(<'KOD5',vararrayof([dm.zapr3.FieldByName(<'kod5').Value]),[]);
а ShowWindow(formvvod2.Handle, SW_SHOW);
а
procedure TZ3.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а dm.Zapr3.Active:=false;
а ShowWindow(Handle, SW_HIDE);
а
procedure TZ3.DBGrid1DblClick(Sender: TObject);
begin
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, StdCtrls, Buttons, Grids,
DBGrids, RpRave, RpDefine, RpCon,
а RpConDS;
type
а TZ4 = class(TForm)
DBGrid1: TDBGrid;
Edit1: TEdit;
SpeedButton2: TSpeedButton;
SpeedButton1: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
SpeedButton3: TSpeedButton;
RvDataSetConnection1:
TRvDataSetConnection;
RvProject1: TRvProject;
а
а
var
а Z4: TZ4;
implementation
uses Unit3, Unit6;
<{$R *.dfm}
procedure TZ4.SpeedButton2Click(Sender: TObject);
begin
а
а
а
procedure TZ4.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а dm.Zapr4.Active:=false;
а ShowWindow(Handle, SW_HIDE);
а
procedure TZ4.SpeedButton1Click(Sender: TObject);
begin
а dm.IBTable1.Locate(<'KOD5',vararrayof([dm.zapr4.FieldByName(<'kod5').Value]),[]);
а ShowWindow(formvvod2.Handle, SW_SHOW);
а
procedure TZ4.DBGrid1DblClick(Sender: TObject);
begin
а
procedure TZ4.SpeedButton3Click(Sender: TObject);
begin
а rvproject1.Execute;
end;
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, Buttons, Grids, DBGrids,
StdCtrls;
type
а TZ5 = class(TForm)
SpeedButton2: TSpeedButton;
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
а
а
var
а Z5: TZ5;
implementation
uses Unit3;
<{$R *.dfm}
procedure TZ5.SpeedButton2Click(Sender: TObject);
var fil:ansistring;
begin
а
procedure TZ5.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а dm.Zapr5.Active:=false;
а ShowWindow(Handle, SW_HIDE);
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, ExtCtrls, StdCtrls;
type
а TAvtor = class(TForm)
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Image1: TImage;
Label6: TLabel;
а
а
var
а Avtor: TAvtor;
implementation
<{$R *.dfm}
procedure TAvtor.FormClick(Sender: TObject);
begin
а
procedure TAvtor.Image1Click(Sender: TObject);
begin
а
procedure TAvtor.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(Handle, SW_HIDE);
а
end.
interface
uses
а Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
а Dialogs, StdCtrls;
type
а ToPr = class(TForm)
Memo1: TMemo;
а
а
var
а
implementation
<{$R *.dfm}
procedure ToPr.Memo1Click(Sender: TObject);
begin
а
procedure ToPr.FormClick(Sender: TObject);
begin
а
procedure ToPr.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
а ShowWindow(Handle, SW_HIDE);
а
end.