1. Аналіз вихідних даних
1.1 Заснування та призначення розробки
Програма адресна книга ZiBook написана на мови Visual Basic, метою написання даної програми, було створення багатофункціональної адресної книги з можливістю додавання, зміни, редагування і пошуку інформації, так само в програмі є можливість дозвону модемом за номером абонента.
1.2 Мінімальні вимоги до складу і параметрів технічних засобів: ЕОМ, зовнішні пристрої
Для того, щоб використовувати ZiBook, Вам потрібен комп'ютер з наступним апаратним і програмним забезпеченням:
Процесор Pentium (або аналогічний) *
Звукова карта **
Мікрофон і динаміки (краще навушники - для усунення луни)
Модем
Microsoft Windows 95-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. Керівництво користувача
Призначення програми
Програма адресна книга 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 (KeyAscii As Integer) - процедура перевіряє правильність введення номера телефону. Дає вводити тільки цифри.
F rmAbout
Ця форма виводить вікно «About» c коротким описом програми.
FrmOptions
Ця форма використовується для налаштування параметрів модему.
butOk_Click () - процедура зберігає параметри дозвону, які вибирає користувач.
txtPort_KeyPress (KeyAscii As Integer) - процедура перевіряє правильність введення номера порту. Дає вводити тільки цифри.
Всі процедури можна форми можна розділити на наступні групи:
процедури завантаження
процедури, що обробляють дані на конкретних кроках
процедури обробки та введення даних.
4.5 Налаштування програми
Дана програма не містить складних налаштувань. Все що користувач може налаштувати - це параметри модеми - порт з'єднання і тип дзвінка (тоновий або імпульсний в залежності від струму який дзвінок підтримує АТС) Детальний опис програми знаходиться у файлі readme.txt
5. Контрольний приклад
В якості прикладу розглянемо питання про внесення нового користувача в БД.
Для додавання елемента заповнимо наступні поля:
Ім'я
По батькові
Прізвище
Адреса
Будинок
Квартира
Телефон
Далі називаємо кнопку «Додати» і якщо все було вірно зроблено, в БД занесеться новий елемент.
Для того щоб перевірити, виділяємо цікавий для нас елемент і тиснемо кнопку «Змінити»
Додаток
FrmMain
Rem Автор програми ZIGMyND <admin@zigmynd.tk>
Option Explicit
Public Sub SaveData ()
Dim Index As Long
Dim strText As String
SetAttr Path & "data.dat", vbNormal
On Error Resume Next
Open Path & "data.dat" For Output As # 1
For Index = 0 To UBound (User)
If Not (User (Index). StrKvartira = vbNullString Or User (Index). StrDoma = vbNullString Or 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.Show vbModal
End Sub
Private Sub butAdd_Click ()
ReDim Preserve User (UBound (User) + 1)
lngIndex = UBound (User)
Load frmEdit
frmEdit.Show vbModal
End Sub
Private Sub butDelete_Click ()
On Error Resume Next
If lstMain.GetSelected> lstMain.GetAll Then Exit Sub
With User (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 Sub butDial_Click ()
If User (lstMain.GetSelected). StrPhone = vbNullString Then Exit Sub
If blnDial = False Then
Open "COM" & Reg.RegRead ("HKCU \ Book \ Port") For Output As # 1
If Reg.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 Sub butEdit_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.Show vbModal
End Sub
Private Sub butExit_Click ()
Unload Me
End Sub
Private Sub butOptions_Click ()
Load frmOptions
frmOptions.Show vbModal
End Sub
Private Sub Command1_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 Sub Form_DblClick ()
WindowState = vbMinimized
End Sub
Private Sub Form_Load ()
On Error Resume Next
GetData
SetWindowText hWnd, App.ProductName
Dim lngTop As Long, 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 <3510 Then lngHeight = 3510
If lngWidth <6630 Then lngWidth = 6630
Move lngLeft, lngTop, lngWidth, lngHeight
If Reg.RegRead ("HKCU \ Book \ OnTop") = True Then SetTop hWnd, True
End Sub
Public Sub GetData ()
On Error Resume Next
Dim Cnt As Long
lstMain.ItemClear
If bPoisk Then
If Not Exist (Path & "search.dat") Then Exit Sub
Open Path & "search.dat" For Input As # 1
Else
If Not Exist (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 Preserve User (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.ItemAdd User (Cnt). strPhone & String (6, "") & User (Cnt). strName
Cnt = Cnt + 1
Wend
Close
Slider.SetMax lstMain.GetMax
End Sub
Private Sub Form_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 As Long
Dim lngWidth As Long
lngY = (Y \ 13) + 1
lngX = (X \ 13) + 1
lngHeight = (lngY * 13) * Screen.TwipsPerPixelY
lngWidth = (lngX * 13) * Screen.TwipsPerPixelX
If lngHeight <= 3510 Then
lngHeight = 3510
End If
If lngWidth <= 6630 Then
lngWidth = 6630
End If
Height = lngHeight
Width = lngWidth
End Sub
Private Sub Form_Resize ()
PosControls
lstMain.SetValue Slider.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 Sub Form_Unload (Cancel As Integer)
'SaveData
If blnDial Then butDial_Click
On Error Resume Next
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 Sub lstMain_Click (Button As Integer)
If Not Button = vbRightButton Then Exit Sub
PopupMenu mnuMain
End Sub
Private Sub mnuAdd_Click ()
butAdd_Click
End Sub
Private Sub mnuDelete_Click ()
butDelete_Click
End Sub
Private Sub mnuDial_Click ()
butDial_Click
End Sub
Private Sub mnuEdit_Click ()
butEdit_Click
End Sub
Private Sub mnuMain_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 Sub Slider_Change ()
lstMain.SetValue Slider.Value
End Sub
Private Sub PosControls ()
lstMain.Height = ScaleHeight - lstMain.Top
Slider.Height = lstMain.Height
Slider.SetMax lstMain.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 Sub butCancel_Click ()
Unload Me
End Sub
Private Sub butOk_Click ()
Dim sLine As String, sInfo As String, bInform As Boolean, arrRecord (7) As String
Dim iCount As Integer, 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 Not EOF (1)
Line Input # 1, sInfo
Select Case iCount
'Ім'я
Case 1
If InStr (Trim (txtName.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Очество
Case 2
If InStr (Trim (txtOtchectvo.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Прізвище
Case 3
If InStr (Trim (txtFamilia.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Адреса
Case 4
If InStr (Trim (txtAdress.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Будинок
Case 5
If InStr (Trim (txtdoma.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Квартира
Case 6
If InStr (Trim (txtkvartira.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Телефон
Case 7
If InStr (Trim (txtPhone.Text), sInfo) <> 0 Then
bInform = True
iCount = 0
Else
iCount = iCount + 1
End If
'Коментар
Case 8
If InStr (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
With User (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 Sub txtPhone_KeyPress (KeyAscii As Integer)
If Not IsNumeric (Chr (KeyAscii)) And Not KeyAscii = 8 Then KeyAscii = 0
End Sub
Private Sub Form_Load ()
If Reg.RegRead ("HKCU \ Book \ OnTop") = True Then SetTop hWnd, True
End Sub
FrmOptions
Option Explicit
Private Sub butCancel_Click ()
Unload Me
End Sub
Private Sub butOk_Click ()
Reg.RegWrite "HKCU \ Book \ Port", txtPort
Reg.RegWrite "HKCU \ Book \ OnTop", chkOnTop.Value
If optDialMode (0). Value = True Then
Reg.RegWrite "HKCU \ Book \ DialMode", 0
Else
Reg.RegWrite "HKCU \ Book \ DialMode", 1
End If
If chkOnTop.Value = 1 Then
SetTop frmMain.hWnd, True
Else
SetTop frmMain.hWnd, False
End If
Unload Me
End Sub
Private Sub Form_Load ()
On Error Resume Next
txtPort = Reg.RegRead ("HKCU \ Book \ Port")
chkOnTop.Value = Reg.RegRead ("HKCU \ Book \ OnTop")
optDialMode (Reg.RegRead ("HKCU \ Book \ DialMode")). Value = True
If Reg.RegRead ("HKCU \ Book \ OnTop") = True Then SetTop hWnd, True
End Sub
Private Sub Form_Unload (Cancel As Integer)
If Not IsNumeric (txtPort) Then
MsgBox "Поле номера порту модему повинно бути цифровим"
Cancel = True
End If
End Sub
Private Sub txtPort_KeyPress (KeyAscii As Integer)
If Not IsNumeric (Chr (KeyAscii)) And Not KeyAscii = 8 Then KeyAscii = 0
End Sub
FrmAbout
Option Explicit
Private Sub butOk_Click ()
Unload Me
End Sub
ModMain
Option Explicit
Public Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As Rect, ByVal edge As Long, ByVal grfFlags As Long) As Long
Public Declare Function SystemParametersInfoA Lib "user32" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Public Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As Rect) As Long
Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter 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 Type UserInfo
strName As String
strOtchectvo As String
strFamilia As String
strAdress As String
strDoma As String
strKvartira As String
strPhone As String
strComment As String
End Type
Public User () As UserInfo
Public lngIndex As Long
Public Reg As Object
Public blnDial As Boolean
Public Const Square As Long = & H1 Or & H2 Or & H4 Or & H8
'Для пошуку
Public bPoisk As Boolean
Sub Main ()
Set Reg = CreateObject ("WSCRIPT.SHELL")
If App.PrevInstance = True Then
MsgBox "Програма вже запущена ..."
Else
Load frmMain
frmMain.Show
End If
End Sub
Public Sub SetTop (hWnd As Long, Top As Boolean)
Select Case Top
Case True
SetWindowPos hWnd, -1, 0, 0, 0, 0, 1 Or 2 Or 16
Case False
SetWindowPos hWnd, -2, 0, 0, 0, 0, 1 Or 2 Or 16
End Select
End Sub
Public Function Path () As String
If Right (App.Path, 1) = "\" Then Path = App.Path Else Path = App.Path & "\"
End Function
Public Function Exist (strFileName As String) As Boolean
If Dir (strFileName) = vbNullString Then Exist = False Else Exist = True
End Function
Використані джерела та література
Програма допомоги VB
Матеріали сайту http://azbukavb.narod.ru/
Матеріали сайту http://void.ru
Матеріали сайту www.FileArea.co.il