Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
© 2013 Радослава Кралева 1
ЮГОЗАПАДЕН УНИВЕРСИТЕТ ,,НЕОФИТ РИЛСКИ” БЛАГОЕВГРАД
Проект № BG051PO001-3.1.07-0036
,,Актуализиране на учебните програми
в Природо-математически факултет на ЮЗУ ,,Неофит Рилски“
в съответствие с изискванията на пазара на труда“
Проектът се осъществява с финансовата подкрепа на Оперативна програма „Развитие на човешките
ресурси“, съфинансирана от Европейския социален фонд на Европейския съюз
Инвестира във вашето бъдеще!
Упражнение 5: СЪЗДАВАНЕ НА КЛИЕНТ-СЪРВЪР ПРИЛОЖЕНИЯ ЗА БАЗИ ОТ ДАННИ С БИБЛИОТЕКАТА DBGO ЗА ADO
Радослава Кралева В настоящето упражнение ще бъде представено поетапното разработване Windows приложение за работа с бази от данни, което използва библиотеката dbGo за ADO. Примерна сесия на работа с приложението Ex5Demo1 е показана на Фиг. 5.1.
Фигура 5.1. Примерна сесия на работа с приложението Ex5Demo1.
© 2013 Радослава Кралева 2
Това приложение (Ex5Demo1) ще визуализира и ще предоставя възможност за редактиране на данни от базата от данни Northwind (която е примерна база от данни доставяща се с MS SQL Server). Данните, които ще бъдат достъпвани и обработвани се съхраняват в 3 таблици (Customers, Orders и Employees), връзките между които са показани на Фиг. 5.2.
Фигура 5.2: Част от схемата на релационната база от данни Northwind с чийто таблици ще взаимодейства приложението Ex5Demo1.
1. СЪЗДАВАНЕ НА ПРИЛОЖЕНИЕТО Ex5Demo1
А. Стартирайте RAD Studio и изпълнете следните стъпки:
Стъпка 1: От главното меню изберете File ► New ► VCL Forms Application – Delphi (или C++ Builder) в зависимост от езика, който искате да използвате.
Стъпка 2: От главното меню изберете File ► Save All... Задайте име на модула, който ще съдържа кода с имплементация на главната форма, което да бъде: MainUnit.pas (за Delphi) или MainUnit.cpp (за C++ Builder), а проектния файл запишете като: Ex5Demo1.dproj (за Delphi) или Ex5Demo1.cbproj (за C++ Builder). Стъпка 3: Задайте следните настройки за главната форма на приложението:
object MainForm: TMainForm
Left = 0
Top = 0
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'MainForm'
ClientHeight = 498
ClientWidth = 729
© 2013 Радослава Кралева 3
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
end
Стъпка 4: От страницата Additional на палитрата с компоненти (Tool Palette) добавете два компонента от тип TShape и един компонент от тип TImage. Настройте тези компоненти както е показано по-долу:
object Shape1: TShape
Left = 8
Top = 32
Width = 713
Height = 2
end
object Shape2: TShape
Left = 8
Top = 285
Width = 713
Height = 2
end
object Image1: TImage
Left = 8
Top = 56
Width = 193
Height = 222
end
Стъпка 5: От страницата Standard на палитрата с компоненти (Tool Palette) добавете двадесет и шест компонента от тип TLabel, и ги настроите както е показано по-долу:
object Label1: TLabel
Left = 208
Top = 40
Width = 11
Height = 13
Caption = 'ID'
FocusControl = DBEdit1
end
object Label2: TLabel
Left = 368
Top = 40
Width = 47
Height = 13
Caption = 'LastName'
FocusControl = DBEdit2
end
object Label3: TLabel
Left = 280
Top = 40
Width = 48
Height = 13
Caption = 'FirstName'
FocusControl = DBEdit3
end
object Label4: TLabel
Left = 208
Top = 80
Width = 20
Height = 13
Caption = 'Title'
FocusControl = DBEdit4
end
object Label6: TLabel
Left = 456
Top = 40
Width = 45
© 2013 Радослава Кралева 4
Height = 13
Caption = 'BirthDate'
FocusControl = DBEdit6
end
object Label7: TLabel
Left = 368
Top = 80
Width = 42
Height = 13
Caption = 'HireDate'
FocusControl = DBEdit7
end
object Label8: TLabel
Left = 208
Top = 120
Width = 39
Height = 13
Caption = 'Address'
FocusControl = DBEdit8
end
object Label9: TLabel
Left = 208
Top = 160
Width = 19
Height = 13
Caption = 'City'
FocusControl = DBEdit9
end
object Label10: TLabel
Left = 296
Top = 160
Width = 33
Height = 13
Caption = 'Region'
FocusControl = DBEdit10
end
object Label11: TLabel
Left = 456
Top = 120
Width = 54
Height = 13
Caption = 'PostalCode'
FocusControl = DBEdit11
end
object Label12: TLabel
Left = 368
Top = 160
Width = 39
Height = 13
Caption = 'Country'
FocusControl = DBEdit12
end
object Label13: TLabel
Left = 208
Top = 200
Width = 57
Height = 13
Caption = 'HomePhone'
FocusControl = DBEdit13
end
object Label14: TLabel
Left = 456
Top = 80
Width = 47
Height = 13
Caption = 'Extension'
FocusControl = DBEdit14
end
object Label15: TLabel
Left = 8
Top = 40
Width = 28
Height = 13
Caption = 'Photo'
end
object Label16: TLabel
Left = 544
Top = 40
Width = 28
Height = 13
Caption = 'Notes'
FocusControl = DBMemo1
end
object Label17: TLabel
Left = 368
Top = 200
Width = 50
Height = 13
Caption = 'ReportsTo'
end
object Label18: TLabel
Left = 208
Top = 240
Width = 50
Height = 13
Caption = 'PhotoPath'
FocusControl = DBEdit16
end
object Label19: TLabel
Left = 568
Top = 293
Width = 72
Height = 13
Caption = 'CompanyName'
FocusControl = DBEdit17
end
object Label20: TLabel
Left = 512
Top = 333
Width = 65
Height = 13
Caption = 'ContactName'
FocusControl = DBEdit18
end
object Label21: TLabel
Left = 512
Top = 413
Width = 39
Height = 13
Caption = 'Address'
FocusControl = DBEdit19
end
© 2013 Радослава Кралева 5
object Label22: TLabel
Left = 624
Top = 373
Width = 19
Height = 13
Caption = 'City'
FocusControl = DBEdit20
end
object Label23: TLabel
Left = 512
Top = 373
Width = 39
Height = 13
Caption = 'Country'
FocusControl = DBEdit21
end
object Label24: TLabel
Left = 512
Top = 453
Width = 30
Height = 13
Caption = 'Phone'
FocusControl = DBEdit22
end
object Label25: TLabel
Left = 512
Top = 293
Width = 33
Height = 13
Caption = 'CustID'
FocusControl = DBEdit23
end
object Label26: TLabel
Left = 8
Top = 293
Width = 41
Height = 13
Caption = 'ORDERS'
FocusControl = DBEdit23
end
Стъпка 6: От страницата dbGo на палитрата с компоненти (Tool Palette) добавете един компонент TADOConnection и го настройте както е показано по-долу:
object ADOConnectionNorthwind: TADOConnection
ConnectionString =
'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
'fo=False;Initial Catalog=Northwind;Data Source=USER\SQLEXPRES' +
'S;'
LoginPrompt = False
Provider = 'SQLOLEDB.1'
Left = 89
Top = 88
end
Стъпка 7: От страницата dbGo на палитрата с компоненти (Tool Palette) добавете четири компонента TADOTable, а от страницата DataAccess добавете четири компонента TDataSource и ги настройте както е показано по-долу (в реда в който са показани):
object ADOTableEmployees: TADOTable
Connection = ADOConnectionNorthwind
CursorType = ctStatic
AfterScroll = ADOTableEmployeesAfterScroll
TableName = 'Employees'
Left = 88
Top = 144
object ADOTableEmployeesEmployeeID: TAutoIncField
FieldName = 'EmployeeID'
ReadOnly = True
end
object ADOTableEmployeesLastName: TWideStringField
FieldName = 'LastName'
end
object ADOTableEmployeesFirstName: TWideStringField
FieldName = 'FirstName'
Size = 10
© 2013 Радослава Кралева 6
end
object ADOTableEmployeesTitle: TWideStringField
FieldName = 'Title'
Size = 30
end
object ADOTableEmployeesTitleOfCourtesy: TWideStringField
FieldName = 'TitleOfCourtesy'
Size = 25
end
object ADOTableEmployeesBirthDate: TDateTimeField
FieldName = 'BirthDate'
end
object ADOTableEmployeesHireDate: TDateTimeField
FieldName = 'HireDate'
end
object ADOTableEmployeesAddress: TWideStringField
FieldName = 'Address'
Size = 60
end
object ADOTableEmployeesCity: TWideStringField
FieldName = 'City'
Size = 15
end
object ADOTableEmployeesRegion: TWideStringField
FieldName = 'Region'
Size = 15
end
object ADOTableEmployeesPostalCode: TWideStringField
FieldName = 'PostalCode'
Size = 10
end
object ADOTableEmployeesCountry: TWideStringField
FieldName = 'Country'
Size = 15
end
object ADOTableEmployeesHomePhone: TWideStringField
FieldName = 'HomePhone'
Size = 24
end
object ADOTableEmployeesExtension: TWideStringField
FieldName = 'Extension'
Size = 4
end
object ADOTableEmployeesPhoto: TBlobField
FieldName = 'Photo'
GraphicHeader = False
end
object ADOTableEmployeesNotes: TWideMemoField
FieldName = 'Notes'
BlobType = ftWideMemo
end
object ADOTableEmployeesReportsTo: TIntegerField
FieldName = 'ReportsTo'
end
object ADOTableEmployeesPhotoPath: TWideStringField
FieldName = 'PhotoPath'
Size = 255
end
end
object DataSourceEmployees: TDataSource
© 2013 Радослава Кралева 7
DataSet = ADOTableEmployees
Left = 88
Top = 200
end
object ADOTableOrders: TADOTable
Connection = ADOConnectionNorthwind
CursorType = ctStatic
IndexFieldNames = 'EmployeeID'
MasterFields = 'EmployeeID'
MasterSource = DataSourceEmployees
TableName = 'Orders'
Left = 48
Top = 349
object ADOTableOrdersOrderID: TAutoIncField
FieldName = 'OrderID'
ReadOnly = True
end
object ADOTableOrdersCustomerID: TWideStringField
FieldName = 'CustomerID'
FixedChar = True
Size = 5
end
object ADOTableOrdersEmployeeID: TIntegerField
FieldName = 'EmployeeID'
end
object ADOTableOrdersOrderDate: TDateTimeField
FieldName = 'OrderDate'
end
object ADOTableOrdersRequiredDate: TDateTimeField
FieldName = 'RequiredDate'
end
object ADOTableOrdersShippedDate: TDateTimeField
FieldName = 'ShippedDate'
end
object ADOTableOrdersShipVia: TIntegerField
FieldName = 'ShipVia'
end
object ADOTableOrdersFreight: TBCDField
FieldName = 'Freight'
Precision = 19
end
object ADOTableOrdersShipName: TWideStringField
FieldName = 'ShipName'
Size = 40
end
object ADOTableOrdersShipAddress: TWideStringField
FieldName = 'ShipAddress'
Size = 60
end
object ADOTableOrdersShipCity: TWideStringField
FieldName = 'ShipCity'
Size = 15
end
object ADOTableOrdersShipRegion: TWideStringField
FieldName = 'ShipRegion'
Size = 15
end
object ADOTableOrdersShipPostalCode: TWideStringField
FieldName = 'ShipPostalCode'
Size = 10
© 2013 Радослава Кралева 8
end
object ADOTableOrdersShipCountry: TWideStringField
FieldName = 'ShipCountry'
Size = 15
end
end
object DataSourceOrders: TDataSource
DataSet = ADOTableOrders
Left = 48
Top = 405
end
object ADOTableCustomers: TADOTable
Connection = ADOConnectionNorthwind
CursorType = ctStatic
IndexFieldNames = 'CustomerID'
MasterFields = 'CustomerID'
MasterSource = DataSourceOrders
TableName = 'Customers'
Left = 224
Top = 349
object ADOTableCustomersCustomerID: TWideStringField
FieldName = 'CustomerID'
FixedChar = True
Size = 5
end
object ADOTableCustomersCompanyName: TWideStringField
FieldName = 'CompanyName'
Size = 40
end
object ADOTableCustomersContactName: TWideStringField
FieldName = 'ContactName'
Size = 30
end
object ADOTableCustomersContactTitle: TWideStringField
FieldName = 'ContactTitle'
Size = 30
end
object ADOTableCustomersAddress: TWideStringField
FieldName = 'Address'
Size = 60
end
object ADOTableCustomersCity: TWideStringField
FieldName = 'City'
Size = 15
end
object ADOTableCustomersRegion: TWideStringField
FieldName = 'Region'
Size = 15
end
object ADOTableCustomersPostalCode: TWideStringField
FieldName = 'PostalCode'
Size = 10
end
object ADOTableCustomersCountry: TWideStringField
FieldName = 'Country'
Size = 15
end
object ADOTableCustomersPhone: TWideStringField
FieldName = 'Phone'
© 2013 Радослава Кралева 9
Size = 24
end
object ADOTableCustomersFax: TWideStringField
FieldName = 'Fax'
Size = 24
end
end
object DataSourceCustomers: TDataSource
DataSet = ADOTableCustomers
Left = 224
Top = 405
end
object ADOTableEmployeesReports: TADOTable
Connection = ADOConnectionNorthwind
CursorType = ctStatic
AfterScroll = ADOTableEmployeesAfterScroll
OnCalcFields = ADOTableEmployeesReportsCalcFields
TableName = 'Employees'
Left = 608
Top = 112
object ADOTableEmployeesReportsEmployeeID: TAutoIncField
FieldName = 'EmployeeID'
ReadOnly = True
end
object ADOTableEmployeesReportsLastName: TWideStringField
FieldName = 'LastName'
end
object ADOTableEmployeesReportsFirstName: TWideStringField
FieldName = 'FirstName'
Size = 10
end
object ADOTableEmployeesReportsReportsTo: TIntegerField
FieldName = 'ReportsTo'
end
object ADOTableEmployeesReportsEmpFullName: TStringField
FieldKind = fkCalculated
FieldName = 'EmpFullName'
Size = 40
Calculated = True
end
end
object DataSourceEmployeeReports: TDataSource
DataSet = ADOTableEmployeesReports
Left = 608
Top = 176
end
Стъпка 8: От страницата DataControls на палитрата с компоненти (Tool Palette) добавете двадесет и три компонента от тип TDBEdit, и ги настроите както е показано по-долу:
object DBEdit1: TDBEdit
Left = 208
Top = 56
Width = 25
Height = 21
DataField = 'EmployeeID'
DataSource =
DataSourceEmployees
TabOrder = 0
end
object DBEdit2: TDBEdit
© 2013 Радослава Кралева 10
Left = 368
Top = 56
Width = 81
Height = 21
DataField = 'LastName'
DataSource =
DataSourceEmployees
TabOrder = 1
end
object DBEdit3: TDBEdit
Left = 280
Top = 56
Width = 81
Height = 21
DataField = 'FirstName'
DataSource =
DataSourceEmployees
TabOrder = 2
end
object DBEdit4: TDBEdit
Left = 208
Top = 96
Width = 153
Height = 21
DataField = 'Title'
DataSource =
DataSourceEmployees
TabOrder = 3
end
object DBEdit5: TDBEdit
Left = 240
Top = 56
Width = 33
Height = 21
DataField = 'TitleOfCourtesy'
DataSource =
DataSourceEmployees
TabOrder = 4
end
object DBEdit6: TDBEdit
Left = 456
Top = 56
Width = 81
Height = 21
DataField = 'BirthDate'
DataSource =
DataSourceEmployees
TabOrder = 5
end
object DBEdit7: TDBEdit
Left = 368
Top = 96
Width = 81
Height = 21
DataField = 'HireDate'
DataSource =
DataSourceEmployees
TabOrder = 6
end
object DBEdit8: TDBEdit
Left = 208
Top = 136
Width = 241
Height = 21
DataField = 'Address'
DataSource =
DataSourceEmployees
TabOrder = 7
end
object DBEdit9: TDBEdit
Left = 208
Top = 176
Width = 81
Height = 21
DataField = 'City'
DataSource =
DataSourceEmployees
TabOrder = 8
end
object DBEdit10: TDBEdit
Left = 296
Top = 176
Width = 65
Height = 21
DataField = 'Region'
DataSource =
DataSourceEmployees
TabOrder = 9
end
object DBEdit11: TDBEdit
Left = 456
Top = 136
Width = 81
Height = 21
DataField = 'PostalCode'
DataSource =
DataSourceEmployees
TabOrder = 10
end
object DBEdit12: TDBEdit
Left = 368
Top = 176
Width = 169
Height = 21
DataField = 'Country'
DataSource =
DataSourceEmployees
TabOrder = 11
end
object DBEdit13: TDBEdit
Left = 208
Top = 216
Width = 153
Height = 21
DataField = 'HomePhone'
DataSource =
DataSourceEmployees
TabOrder = 12
end
object DBEdit14: TDBEdit
Left = 456
Top = 96
© 2013 Радослава Кралева 11
Width = 81
Height = 21
DataField = 'Extension'
DataSource =
DataSourceEmployees
TabOrder = 13
end
object DBMemo1: TDBMemo
Left = 544
Top = 56
Width = 177
Height = 220
DataField = 'Notes'
DataSource =
DataSourceEmployees
ScrollBars = ssVertical
TabOrder = 14
end
object DBEdit16: TDBEdit
Left = 208
Top = 256
Width = 329
Height = 21
DataField = 'PhotoPath'
DataSource =
DataSourceEmployees
TabOrder = 15
end
object DBEdit17: TDBEdit
Left = 568
Top = 309
Width = 153
Height = 21
DataField = 'CompanyName'
DataSource =
DataSourceCustomers
TabOrder = 18
end
object DBEdit18: TDBEdit
Left = 512
Top = 349
Width = 209
Height = 21
DataField = 'ContactName'
DataSource =
DataSourceCustomers
TabOrder = 19
end
object DBEdit19: TDBEdit
Left = 512
Top = 429
Width = 209
Height = 21
DataField = 'Address'
DataSource =
DataSourceCustomers
TabOrder = 20
end
object DBEdit20: TDBEdit
Left = 624
Top = 389
Width = 97
Height = 21
DataField = 'City'
DataSource =
DataSourceCustomers
TabOrder = 21
end
object DBEdit21: TDBEdit
Left = 512
Top = 389
Width = 105
Height = 21
DataField = 'Country'
DataSource =
DataSourceCustomers
TabOrder = 22
end
object DBEdit22: TDBEdit
Left = 512
Top = 469
Width = 209
Height = 21
DataField = 'Phone'
DataSource =
DataSourceCustomers
TabOrder = 23
end
object DBEdit23: TDBEdit
Left = 512
Top = 309
Width = 49
Height = 21
DataField = 'CustomerID'
DataSource =
DataSourceCustomers
TabOrder = 24
end
© 2013 Радослава Кралева 12
Стъпка 9: От страницата DataControls на палитрата с компоненти (Tool Palette) добавете един компонент TDBNavigator и го настройте както е показано по-долу:
object DBNavigator1: TDBNavigator
Left = 8
Top = 4
Width = 710
Height = 24
DataSource = DataSourceEmployees
Flat = True
TabOrder = 16
end
Стъпка 10: От страницата DataControls на палитрата с компоненти (Tool Palette) добавете един компонент TDBLookupComboBox и го настройте както е показано по-долу:
object DBLookupComboBox1: TDBLookupComboBox
Left = 368
Top = 216
Width = 169
Height = 21
DataField = 'ReportsTo'
DataSource = DataSourceEmployees
KeyField = 'EmployeeID'
ListField = 'EmpFullName'
ListSource = DataSourceEmployeeReports
TabOrder = 25
end
Стъпка 11: От страницата DataControls на палитрата с компоненти (Tool Palette) добавете един компонент TDBGrid и го настройте както е показано по-долу:
object DBGrid1: TDBGrid
Left = 8
Top = 309
Width = 497
Height = 180
DataSource = DataSourceOrders
TabOrder = 17
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
Columns = <
item
Expanded = False
FieldName = 'OrderID'
Width = 46
Visible = True
end
item
Expanded = False
© 2013 Радослава Кралева 13
FieldName = 'CustomerID'
Title.Caption = 'CustID'
Width = 40
Visible = True
end
item
Expanded = False
FieldName = 'OrderDate'
Width = 68
Visible = True
end
item
Expanded = False
FieldName = 'RequiredDate'
Width = 71
Visible = True
end
item
Expanded = False
FieldName = 'ShippedDate'
Width = 67
Visible = True
end
item
Expanded = False
FieldName = 'ShipVia'
Title.Caption = 'SV'
Width = 17
Visible = True
end
item
Expanded = False
FieldName = 'Freight'
Width = 40
Visible = True
end
item
Expanded = False
FieldName = 'ShipName'
Visible = True
end
item
Expanded = False
FieldName = 'ShipAddress'
Visible = True
end
item
Expanded = False
FieldName = 'ShipCity'
Visible = True
end
item
Expanded = False
FieldName = 'ShipRegion'
Visible = True
end
item
Expanded = False
FieldName = 'ShipPostalCode'
Visible = True
end
© 2013 Радослава Кралева 14
item
Expanded = False
FieldName = 'ShipCountry'
Visible = True
end>
end
След като бъдат добавени и настроени всички компоненти, формата по време на проектиране трябва да изглежда подобно на тази показана на Фиг. 5.3.
Фигура 5.3. Главната форма на приложението Ex5Demo1, след приключване на етапа на проектиране.
Стъпка 12: Създайте манипулатор (обработчик) на събитието OnCreate на главната форма и въведете следния код в редактора за код (Code Editor):
procedure TMainForm.FormCreate(Sender: TObject);
begin
ADOConnectionNorthwind.Open;
ADOTableEmployees.Open;
ADOTableEmployeesReports.Open;
ADOTableOrders.Open;
ADOTableCustomers.Open;
end;
© 2013 Радослава Кралева 15
Стъпка 13: Създайте манипулатор на събитието OnAfterScroll на таблицата ADOTableEmployeess и въведете в редактора на код показан в следващия програмен фрагмент:
procedure TMainForm.ADOTableEmployeesAfterScroll(DataSet: TDataSet);
var
B1: TBitmap;
MS: TMemoryStream;
begin
B1 := TBitmap.Create;
MS := TMemoryStream.Create;
try
TBlobField(ADOTableEmployees.FieldByName('Photo')).SaveToStream(MS);
MS.Position := 78;
B1.LoadFromStream(MS);
MainForm.Image1.Picture.Assign(B1);
except
MainForm.Image1.Picture.Assign(nil);
end;
B1.Free;
MS.Free;
end;
Понеже данните в полетата от тип Image на MS SQL Server (или OLE Object на MS Access) съдържат заглавна част (header), който е с размер 78 байта, то при извличането на изображение от такава база от данни, е необходимо да се прочетат байтове след 78-ия, където реално се съдържа пикселната информация за самото изображение. Това именно е и целта на метода ADOTableEmployeesAfterScroll.
Дата: 10.12.2013 г. Експерт: _______________________
(Радослава Кралева)