Адресная книга на языке Visual Basic
Адресная книга на языке Visual Basic
6 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. Руководство пользователя 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(KeyAscii As Integer) - процедура проверяющая правильность ввода номера телефона. Даёт вводить только цифры. FrmAbout Эта форма выводит окно «About» c кратким описанием программы. FrmOptions Эта форма используется для настройки параметров модема. - butOk_Click() - процедура сохраняющая параметры дозвона, которые выбирает пользователь. - txtPort_KeyPress(KeyAscii As Integer) - процедура проверяющая правильность ввода номера порта. Даёт вводить только цифры. Все процедуры можно формы можно разделить на следующие группы: 1. процедуры загрузки 2. процедуры, обрабатывающие данные на конкретных шагах 3. процедуры обработки и ввода данных. 4.5 Настройка программы Данная программа не содержит сложных настроек. Всё что пользователь может настроить - это параметры модемы - порт соединения и тип звонка (тоновый или импульсный в зависимости от тока какой звонок поддерживает АТС) Подробное описание программы находится в файле readme.txt 5. Контрольный пример В качестве примера рассмотрим вопрос о внесении нового пользователя в БД. 1. Для добавления элемента заполним следующие поля: - Имя - Отчество - Фамилия - Адрес - Дом - Квартира - Телефон Далее называем кнопку «Добавить» и если всё было верно сделано, в БД занесётся новый элемент. 2. Для того чтобы проверить, выделяем интересующий нас элемент и жмем кнопку «Изменить» Приложение 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 Использованные источники и литература 1. Программа помощи VB 2. Материалы сайта http://azbukavb.narod.ru/ 3. Материалы сайта http://void.ru 4. Материалы сайта www.FileArea.co.il
|