Адресная книга на языка Visual Basic

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) – процедура проверяющая правильность ввода номера телефона. Даёт вводить только цифры.

FrmAbout

Эта форма выводит окно «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





2