1. Анализисходных данных
1.1 Основаниеи назначение разработки
Программаадресная книга ZiBook написана на языка Visual Basic, целью написания даннойпрограммы, было создание многофункциональной адресной книги с возможностьюдобавления, изменения, редактирования и поиска информации, так же в программеимеется возможность дозвона модемом по номеру абонента.
1.2 Минимальные требования ксоставу и параметрам технических средств: ЭВМ, внешние устройства
Для того, чтобыиспользовать ZiBook, Вам нужен компьютер со следующим аппаратным и программнымобеспечением:
· Процессор Pentium(или аналогичный) *
· Звуковая карта **
· Микрофон и динамики(лучше наушники — для устранения эха)
· Модем
· Microsoft Windows95-98
*Может бытьиспользован также быстрый процессор i486, однако успешный результат в этомслучае не гарантирован.
** Длянаилучшего результата, звуковая карта должна поддерживать звуковой формат 8000Гц (8 кГц) / 16 бит и работать в режиме полного дуплекса (то есть позволятьодновременные запись и воспроизведение звука).
1.3 Требования к информационной ипрограммной совместимости
· Операционная системаMS Windows 95-98-Me
· Поддержка операционнойсистемой кириллицы
· Для работы программына компьютере должны быть установлен Scripting Host (Сервер сценариев)(WSCRIPT.SHELL)
· 16Мб оперативнойпамяти
· 10 Мб на жесткомдиске
· Видеоадаптер SVGA
· SVGA монитор
1.4 Требования к функциональнымхарактеристикам
Постановказадачи. Программа должна выполнять следующие функции:
· Вывод формы,содержащей всю адресную книгу
· Вывод формы, длявнесения и редактирования адресной книги
· Вывод формы, длянастройки параметров модема (тоновый\импульсный, номер СОМ порта)
· Вывод формы поиска.
1.5 Выбор и обоснование системыпрограммирования и используемых программных средств
При разработкепрограммных продуктов, обязательно возникает вопрос выбора программных средствдля оптимального решения, поставленной задачи. Но, каждый пакет имеет своиособенности, решению которых уделено большее внимание. В данном случаеоптимальным выбором стал Visual Basic 6.0. Так как, Visual Basic 6.0 являетсяочень гибким языком, что позволяет в короткие сроки создавать программное обеспечениедовольно высокой степени сложности. Кроме того, Visual Basic популярный языкпрограммирования, как следствие, наличие достаточно полной справочнойинформации.
1.6 Разработка математическоймодели задачи, выбор алгоритма реализации и его обоснование
В основепрограммы лежит работа с текстовыми файлами, открытие его для записи, поискнужных элементов.
2. Внешняя спецификация
2.1 Входные данные
Входными даннымиявляются:
- Имя
- Отчество
- Фамилия
- Адрес
- Дом
- Квартира
- Телефон
- Комментарии
2.2 Выходные данные
Выходнымиданными для данной программы является список адресатов.
2.3 Общее описание алгоритмов и внутреннихданных
Внутренниеданные хранятся в локальных и в глобальных переменных, а также в свойствахэлементов управления.
Общее описаниеалгоритмов. Программа основана на событийной модели. Когда происходиткакое-либо событие (нажатие клавиши на клавиатуре или кнопке мыши), программаего обрабатывает (выполняет определённый код).
2.4 Основнойалгоритм программы
Основнойалгоритм программы заключается в организации работы пользователя с БД адреснойкниги. Внесение данных происходит в файлdata.dat, после того, каквсе данные введены, и номер телефона проверен на корректность, данные записываютсяв него.
3.Руководство пользователя
3.1Назначение программы
Программаадресная книга ZiBook предназначена для хранения данных о ваших знакомых,коллегах и друзьях.
3.2 Описание интерфейса. Требованияк входным данным
После запускапрограммы на экране появляется главное окно. Как видно, программа имеет оченьприятный и интуитивно понятный интерфейс.
/>
Нажимая на соответствующие кнопкипользователь может:
Добавлять\изменять элементы.
/>
Поиск по БД. Заполняем нужные поля и нажимаем Ok.
/>
Никаких особыхтребования программа не предъявляет пользователю. В поле «телефон» поставленапроверка на вводимые символы – программа просто не даст Вам ввести туда ничегокроме цифр. В остальные поля, можете вводить что угодно, использовать любыесимволы, но учтите что при поиске слова «Иванов» и «иванов» будут учитыватьсякак разные, т.к. программа чувствительна в регистру букв.
Результатыпоиска выводятся в том же окне, где и основная БД. Но в этот момент основная БДадресной книги будет невидима для удобства пользователя.
Чтобыпросмотреть, найденные элементы, нажимаем кнопку «Изменить»
Чтобы, загрузитьвсю базу, нажимаем на кнопку «Вся книга»
/>
Выбор параметровдозвона – тоновый или импульсный, номер порта «Параметры»
/>
По всемвозникающим вопросам, пользователь всегда может обратиться в службу поддержкипо электронной почте: admin@zigmynd.tk или ICQ UIN 907700
4. Руководство программиста
4.1 Описание типов пользовательскихданных
В программепользовательские типы данных не используется, применяются стандартные типыданных: Single, Long, Integer, String, Boolean. Для хранения БД используетсяфайл data.dat. Результаты поиска временно хранятся в файле search.dat
4.2 Организация ввода данных впрограмму и вывода результатов
Данные впрограмму вводятся при помощи клавиатуры, все данные хранятся в файле data.dat
4.3 Блок схема/> /> /> /> /> /> /> /> />
Инициализация
/> нет да /> /> /> /> /> /> /> /> /> /> />
Обработка данных
/>/>
/>
/>
4.4 Структура программы. Описаниепроцедур и их параметров
В программеиспользовалась четыре формы:
FrmMain
Эта формасодержит основную форму программы.
- SaveData()процедура сохраняющая данные в файл data.dat
- butAbout_Click()процедура вызывающая меню About
- butAdd_Click()процедура инициализирующая добавление элементов в адресную книгу.
- butDelete_Click()процедура удаляющая выбранные элементы из адресной книги.
- butDial_Click()процедура инициализирующая дозвон
- butEdit_Click()процедура инициализирующая редактирование элементов
- butOptions_Click()процедура, инициализирующая запуск меню настроек модема
- Command1_Click()процедура, инициализирующая поиск
- Command2_Click()процедура, загружающая всю адресную книгу в окно
FrmEdit
Эта формасодержит меня для редактирования БД. Эта же форма выводится при введениипараметров поиска.
- txtPhone_KeyPress(KeyAsciiAs Integer) – процедура проверяющая правильность ввода номера телефона. Даётвводить только цифры.
FrmAbout
Эта формавыводит окно «About» c кратким описанием программы.
FrmOptions
Эта формаиспользуется для настройки параметров модема.
- butOk_Click()– процедура сохраняющая параметры дозвона, которые выбирает пользователь.
- txtPort_KeyPress(KeyAsciiAs Integer) — процедура проверяющая правильность ввода номера порта. Даётвводить только цифры.
Все процедурыможно формы можно разделить на следующие группы:
1. процедурызагрузки
2. процедуры,обрабатывающие данные на конкретных шагах
3. процедурыобработки и ввода данных.
4.5 Настройка программы
Данная программане содержит сложных настроек. Всё что пользователь может настроить – этопараметры модемы – порт соединения и тип звонка (тоновый или импульсный взависимости от тока какой звонок поддерживает АТС) Подробное описание программынаходится в файле readme.txt
5. Контрольный пример
В качествепримера рассмотрим вопрос о внесении нового пользователя в БД.
1. Для добавленияэлемента заполним следующие поля:
- Имя
- Отчество
- Фамилия
- Адрес
- Дом
- Квартира
- Телефон
Далее называемкнопку «Добавить» и если всё было верно сделано, в БДзанесётся новый элемент.
2. Для того чтобы проверить,выделяем интересующий нас элемент и жмем кнопку «Изменить»
Приложение
FrmMain
Rem Авторпрограммы ZIGMyND
Option Explicit
Public SubSaveData()
Dim Index AsLong
Dim strText AsString
SetAttr Path& «data.dat», vbNormal
On Error ResumeNext
Open Path &«data.dat» For Output As #1
For Index = 0 ToUBound(User)
If Not(User(Index).strKvartira = vbNullString Or User(Index).strDoma = vbNullStringOr User(Index).strFamilia = vbNullString Or User(Index).strOtchectvo =vbNullString Or User(Index).strAdress = vbNullString Or User(Index).strComment= vbNullString Or User(Index).strName = vbNullString Or User(Index).strPhone =vbNullString) Then
Print #1,User(Index).strName
Print #1, User(Index).strOtchectvo
Print #1,User(Index).strFamilia
Print #1,User(Index).strAdress
Print #1,User(Index).strDoma
Print #1,User(Index).strKvartira
Print #1,User(Index).strPhone
Print #1,User(Index).strComment
End If
Next
Close
End Sub
Private Sub butAbout_Click()
Load frmAbout
frmAbout.ShowvbModal
End Sub
Private SubbutAdd_Click()
ReDim PreserveUser(UBound(User) + 1)
lngIndex =UBound(User)
Load frmEdit
frmEdit.ShowvbModal
End Sub
Private SubbutDelete_Click()
On Error ResumeNext
If lstMain.GetSelected> lstMain.GetAll Then Exit Sub
WithUser(lstMain.GetSelected)
.strName =vbNullString
.strOtchectvo =vbNullString
.strFamilia =vbNullString
.strAdress =vbNullString
.strKvartira =vbNullString
.strDoma =vbNullString
.strComment =vbNullString
.strPhone =vbNullString
End With
SaveData
GetData
End Sub
Private SubbutDial_Click()
IfUser(lstMain.GetSelected).strPhone = vbNullString Then Exit Sub
If blnDial =False Then
Open«COM» & Reg.RegRead(«HKCU\Book\Port») For Output As #1
IfReg.RegRead(«HKCU\Book\DialMode») = 0 Then
Print #1,«ATDT» & User(lstMain.GetSelected).strPhone
Else
Print #1,«ATDP» & User(lstMain.GetSelected).strPhone
End If
Close
blnDial = True
Else
Open«COM» & Reg.RegRead(«HKCU\Book\Port») For Output As #1
Print #1,«CLOSE»
Close
blnDial = False
End If
End Sub
Private SubbutEdit_Click()
lngIndex =lstMain.GetSelected
Load frmEdit
frmEdit.txtName= User(lstMain.GetSelected).strName
frmEdit.txtOtchectvo= User(lstMain.GetSelected).strOtchectvo
frmEdit.txtFamilia= User(lstMain.GetSelected).strFamilia
frmEdit.txtAdress= User(lstMain.GetSelected).strAdress
frmEdit.txtdoma= User(lstMain.GetSelected).strDoma
frmEdit.txtkvartira= User(lstMain.GetSelected).strKvartira
frmEdit.txtPhone= User(lstMain.GetSelected).strPhone
frmEdit.txtComment= User(lstMain.GetSelected).strComment
frmEdit.ShowvbModal
End Sub
Private SubbutExit_Click()
Unload Me
End Sub
Private SubbutOptions_Click()
Load frmOptions
frmOptions.ShowvbModal
End Sub
Private SubCommand1_Click()
bPoisk = True
If Dir(Path& «search.dat») "" Then Kill (Path &«search.dat»)
butAdd.Visible =False
butEdit.Visible= True
butDelete.Visible= False
butAbout.Visible= False
butDial.Visible= False
butOptions.Visible= False
frmEdit.Show
End Sub
Private Sub Command2_Click()
bPoisk = False
butAdd.Visible =True
butEdit.Visible= True
butDelete.Visible= True
butAbout.Visible= True
' butDial.Visible= True
butOptions.Visible= True
GetData
End Sub
Private SubForm_DblClick()
WindowState =vbMinimized
End Sub
Private SubForm_Load()
On Error ResumeNext
GetData
SetWindowTexthWnd, App.ProductName
Dim lngTop AsLong, lngLeft As Long, lngWidth As Long, lngHeight As Long
lngTop =Reg.RegRead(«HKCU\Book\Top»)
lngLeft =Reg.RegRead(«HKCU\Book\Left»)
lngHeight =Reg.RegRead(«HKCU\Book\Height»)
lngWidth =Reg.RegRead(«HKCU\Book\Width»)
If lngHeight
If lngWidth
Move lngLeft,lngTop, lngWidth, lngHeight
IfReg.RegRead(«HKCU\Book\OnTop») = True Then SetTop hWnd, True
End Sub
Public SubGetData()
On Error ResumeNext
Dim Cnt As Long
lstMain.ItemClear
If bPoisk Then
If NotExist(Path & «search.dat») Then Exit Sub
Open Path &«search.dat» For Input As #1
Else
If NotExist(Path & «data.dat») Then Exit Sub
Open Path &«data.dat» For Input As #1
End If
Open Path &«data.dat» For Input As #1
While Not EOF(1)
ReDim PreserveUser(Cnt)
Line Input #1,User(Cnt).strName
Line Input #1,User(Cnt).strOtchectvo
Line Input #1,User(Cnt).strFamilia
Line Input #1,User(Cnt).strAdress
Line Input #1,User(Cnt).strDoma
Line Input #1,User(Cnt).strKvartira
Line Input #1,User(Cnt).strPhone
Line Input #1,User(Cnt).strComment
lstMain.ItemAddUser(Cnt).strPhone & String(6, " ") & User(Cnt).strName
Cnt = Cnt + 1
Wend
Close
Slider.SetMaxlstMain.GetMax
End Sub
Private SubForm_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Not Button =vbLeftButton Then Exit Sub
Dim lngY As Long
Dim lngX As Long
Dim lngHeight AsLong
Dim lngWidth AsLong
lngY = (Y \ 13)+ 1
lngX = (X \ 13)+ 1
lngHeight =(lngY * 13) * Screen.TwipsPerPixelY
lngWidth = (lngX* 13) * Screen.TwipsPerPixelX
If lngHeight
lngHeight = 3510
End If
If lngWidth
lngWidth = 6630
End If
Height =lngHeight
Width = lngWidth
End Sub
Private SubForm_Resize()
PosControls
lstMain.SetValueSlider.Value
Cls
Line (ScaleWidth- 14, ScaleHeight)-(ScaleWidth, ScaleHeight — 14), vbWhite
Line (ScaleWidth- 13, ScaleHeight)-(ScaleWidth, ScaleHeight — 13), vb3DShadow
Line (ScaleWidth- 12, ScaleHeight)-(ScaleWidth, ScaleHeight — 12), vb3DShadow
Line (ScaleWidth- 10, ScaleHeight)-(ScaleWidth, ScaleHeight — 10), vbWhite
Line (ScaleWidth- 9, ScaleHeight)-(ScaleWidth, ScaleHeight — 9), vb3DShadow
Line (ScaleWidth- 8, ScaleHeight)-(ScaleWidth, ScaleHeight — 8), vb3DShadow
Line (ScaleWidth- 6, ScaleHeight)-(ScaleWidth, ScaleHeight — 6), vbWhite
Line (ScaleWidth- 5, ScaleHeight)-(ScaleWidth, ScaleHeight — 5), vb3DShadow
Line (ScaleWidth- 4, ScaleHeight)-(ScaleWidth, ScaleHeight — 4), vb3DShadow
Line(lstMain.Left — 1, lstMain.Top — 1)-(lstMain.Left + lstMain.Width + 1,lstMain.Top — 1), vb3DShadow
Line-(lstMain.Left + lstMain.Width + 1, lstMain.Top + lstMain.Height + 1),vb3DLight
Line-(lstMain.Left — 1, lstMain.Top + lstMain.Height + 1), vb3DLight
Line-(lstMain.Left — 1, lstMain.Top — 1), vb3DShadow
End Sub
Private SubForm_Unload(Cancel As Integer)
' SaveData
If blnDial ThenbutDial_Click
On Error ResumeNext
Reg.RegWrite«HKCU\Book\Top», Top
Reg.RegWrite«HKCU\Book\Left», Left
Reg.RegWrite«HKCU\Book\Height», Height
Reg.RegWrite«HKCU\Book\Width», Width
Set Reg =Nothing
End Sub
Private SublstMain_Click(Button As Integer)
If Not Button =vbRightButton Then Exit Sub
PopupMenumnuMain
End Sub
Private SubmnuAdd_Click()
butAdd_Click
End Sub
Private SubmnuDelete_Click()
butDelete_Click
End Sub
Private SubmnuDial_Click()
butDial_Click
End Sub
Private SubmnuEdit_Click()
butEdit_Click
End Sub
Private SubmnuMain_Click()
If bPoisk Then
mnuAdd.Enabled =False
mnuDelete.Enabled= False
mnuEdit.Enabled= False
Else
mnuAdd.Enabled =True
mnuDelete.Enabled= True
mnuEdit.Enabled= True
End If
End Sub
Private SubSlider_Change()
lstMain.SetValueSlider.Value
End Sub
Private SubPosControls()
lstMain.Height =ScaleHeight — lstMain.Top
Slider.Height =lstMain.Height
Slider.SetMaxlstMain.GetMax
Panel.Left =ScaleWidth — Panel.Width — 11
butExit.Left =Panel.Left
Slider.Left =Panel.Left — Slider.Width — 8
lstMain.Width =Slider.Left — lstMain.Left — 8
butExit.Top =lstMain.Height
End Sub
FrmEdit
Option Explicit
Private SubbutCancel_Click()
Unload Me
End Sub
Private SubbutOk_Click()
Dim sLine AsString, sInfo As String, bInform As Boolean, arrRecord(7) As String
Dim iCount AsInteger, iCountLine As Integer, iFileNum As Integer
If bPoisk Then
If Dir(Path& «data.dat») "" Then
iCount = 1:iCountLine = 0: bInform = False
Open Path &«data.dat» For Input As #1
'Считываемиформацию из файла и проверяем ее на совпадение
Do While NotEOF(1)
Line Input #1,sInfo
Select CaseiCount
'Имя
Case 1
IfInStr(Trim(txtName.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Очество
Case 2
IfInStr(Trim(txtOtchectvo.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Фамилия
Case 3
IfInStr(Trim(txtFamilia.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Адрес
Case 4
IfInStr(Trim(txtAdress.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Дом
Case 5
IfInStr(Trim(txtdoma.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Квартира
Case 6
IfInStr(Trim(txtkvartira.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Телефон
Case 7
IfInStr(Trim(txtPhone.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
'Комментарий
Case 8
IfInStr(Trim(txtComment.Text), sInfo) 0 Then
bInform = True
iCount = 0
Else
iCount = iCount+ 1
End If
End Select
'Если есть хотьодно совпадение, то записываем всю инфу в файл «search.dat»
arrRecord(iCountLine)= sInfo
iCountLine =iCountLine + 1
If iCountLine =8 Then
If bInform Then
iFileNum =FreeFile
Open Path &«search.dat» For Append As #iFileNum
For iCountLine =0 To UBound(arrRecord)
Print #iFileNum,arrRecord(iCountLine)
Next
Close #iFileNum
End If
Erase arrRecord
bInform = False
iCountLine = 0
iCount = 1
End If
Loop
Close
'Показываемрезультат поиска
frmMain.GetData
' bPoisk = False
Else
MsgBox«Данные не найдены.», vbExclamation
Unload Me
Exit Sub
End If
Else
WithUser(lngIndex)
.strName =txtName
.strOtchectvo =txtOtchectvo
.strFamilia =txtFamilia
.strAdress =txtAdress
.strDoma =txtdoma
.strKvartira =txtkvartira
.strPhone =txtPhone
.strComment =txtComment
End With
frmMain.SaveData
frmMain.GetData
End If
Unload Me
End Sub
Private SubtxtPhone_KeyPress(KeyAscii As Integer)
If NotIsNumeric(Chr(KeyAscii)) And Not KeyAscii = 8 Then KeyAscii = 0
End Sub
Private SubForm_Load()
IfReg.RegRead(«HKCU\Book\OnTop») = True Then SetTop hWnd, True
End Sub
FrmOptions
Option Explicit
Private SubbutCancel_Click()
Unload Me
End Sub
Private SubbutOk_Click()
Reg.RegWrite«HKCU\Book\Port», txtPort
Reg.RegWrite«HKCU\Book\OnTop», chkOnTop.Value
IfoptDialMode(0).Value = True Then
Reg.RegWrite«HKCU\Book\DialMode», 0
Else
Reg.RegWrite«HKCU\Book\DialMode», 1
End If
IfchkOnTop.Value = 1 Then
SetTopfrmMain.hWnd, True
Else
SetTopfrmMain.hWnd, False
End If
Unload Me
End Sub
Private SubForm_Load()
On Error ResumeNext
txtPort =Reg.RegRead(«HKCU\Book\Port»)
chkOnTop.Value =Reg.RegRead(«HKCU\Book\OnTop»)
optDialMode(Reg.RegRead(«HKCU\Book\DialMode»)).Value= True
IfReg.RegRead(«HKCU\Book\OnTop») = True Then SetTop hWnd, True
End Sub
Private SubForm_Unload(Cancel As Integer)
If NotIsNumeric(txtPort) Then
MsgBox«Поле номера порта модема должно быть цифровым»
Cancel = True
End If
End Sub
Private SubtxtPort_KeyPress(KeyAscii As Integer)
If NotIsNumeric(Chr(KeyAscii)) And Not KeyAscii = 8 Then KeyAscii = 0
End Sub
FrmAbout
Option Explicit
Private SubbutOk_Click()
Unload Me
End Sub
ModMain
Option Explicit
Public DeclareFunction DrawEdge Lib «user32» (ByVal hdc As Long, qrc As Rect, ByValedge As Long, ByVal grfFlags As Long) As Long
Public DeclareFunction SystemParametersInfoA Lib «user32» (ByVal uAction As Long,ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Public DeclareFunction GetClientRect Lib «user32» (ByVal hWnd As Long, lpRect AsRect) As Long
Public DeclareFunction SetWindowText Lib «user32» Alias «SetWindowTextA»(ByVal hWnd As Long, ByVal lpString As String) As Long
Public DeclareFunction SetWindowPos Lib «user32» (ByVal hWnd As Long, ByValhWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long,ByVal cy As Long, ByVal wFlags As Long) As Long
Public Type Rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public TypeUserInfo
strName AsString
strOtchectvo AsString
strFamilia AsString
strAdress AsString
strDoma AsString
strKvartira AsString
strPhone AsString
strComment AsString
End Type
Public User() AsUserInfo
Public lngIndexAs Long
Public Reg AsObject
Public blnDialAs Boolean
Public ConstSquare As Long = &H1 Or &H2 Or &H4 Or &H8
'Для поиска
Public bPoisk AsBoolean
Sub Main()
Set Reg =CreateObject(«WSCRIPT.SHELL»)
IfApp.PrevInstance = True Then
MsgBox«Программа уже запущенна...»
Else
Load frmMain
frmMain.Show
End If
End Sub
Public SubSetTop(hWnd As Long, Top As Boolean)
Select Case Top
Case True
SetWindowPoshWnd, -1, 0, 0, 0, 0, 1 Or 2 Or 16
Case False
SetWindowPoshWnd, -2, 0, 0, 0, 0, 1 Or 2 Or 16
End Select
End Sub
Public FunctionPath() As String
IfRight(App.Path, 1) = "\" Then Path = App.Path Else Path = App.Path& "\"
End Function
Public FunctionExist(strFileName As String) As Boolean
IfDir(strFileName) = vbNullString Then Exist = False Else Exist = True
End Function
Использованные источники илитература
1. Программа помощи VB
2. Материалы сайта azbukavb.narod.ru/
3. Материалы сайтаhttp://void.ru
4. Материалы сайтаwww.FileArea.co.il