|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Создание базы данныхСоздание базы данных164 МОСКОВСКИЙ ОРДЕНА ЛЕНИНА, ОРДЕНА ОКТЯБРЬСКОЙ РЕВОЛЮЦИИ И ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМ. Н.Э. БАУМАНА Калужский филиал Факультет ?Фундаментальных Наук? Кафедра ?Программного Обеспечения ЭВМ, Информационных Технологий и Прикладной Математики? РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ ПО ОСНОВАМ ИНФОРМАТИКИ Тема: “Создание базы данных” содержание
Добавляемый столбец. Запросы: сколько участников соревнований состязалось в прыжках в длину; какой показатель является лучшим в этом виде состязаний? получить список учащихся школы № 20, принявших участие в соревнованиях; сколько участников Ленинского района приняли участие в соревнованиях? каков наилучший показатель в прыжках в высоту, кто установил рекорд? получить список участников соревнований, принявших участие более, чем в трех видах состязаний. Добавляемый столбец «Фамилия, Имя, Отчество тренера». Дополнительные запросы: какое количество участников состязаний подготовил тренер Сидоров И. И.; получить фамилию, Имя, Отчество тренера, подготовившего участника с лучшими показателями в толкании ядра. 1.2. Общие сведенияVisual Basic является прямым потомком языка Basic, создававшегося как очень простой язык для обучения основам программирования. С тех пор язык значительно расширился, а с появлением Visual Basic стал поддерживать концепцию ООП. Однако он всё-таки ещё слишком прост, и не приспособлен к написанию широкого круга программ. С другой стороны, он вполне подходит для своей основной цели - написанию офисных приложений. Благодаря простоте и склонности к офисным приложениям диалект Visual Basic VBA (Visual Basic for Application) сделан внутренним языком для приложений Microsoft Office, а также в сторонних программах, имеющих лицензию на использование языка. Также существует скриптовый вариант языка VBScript, который используется в технологии HTML, а именно в DHTML, т.е. для динамической работы с содержимым гипертекстовых документов, наравне с JavaScript, JScript. Однако даже сейчас VBScript поддерживается далеко не всеми современными и наиболее распространёнными браузерами, в отличие от JavaScript, что сокращает область его использования. Сердцем любой программы на Visual Basic является исполняемый файл и ряд динамических библиотек (DLL - Dynamic Link Library, библиотека динамического связывания). Кроме того, Visual Basic обладает интегрированной возможностью использования внешних компонентов, встраиваемых в программу и облегчающих работу программиста (технология ActiveX). Благодаря тому, что компоненты ActiveX являются независимыми от исходного языка, то в программах Visual Basic можно использовать сторонние компоненты, которые могут помочь в осуществлении поставленной цели. 1.3. Элементы языкаВ данной курсовой работе использовались различные типы данных: byteintegerlongbooleanstring (в формате UNICODE) variantпользовательские типымассивы элементов данных типовОбъявление переменных: (Dim | Private | Public | Static) <имя переменной> As <тип переменной>Описание констант: Const <идентификатор> As <тип>Использовались записи: Type <название><поля_записи>End TypeА также использовались основные операторы: Альтернативные операторы условияIf <условие> Then <оператор 1>[ElseIf <условие> Then <оператор 2>…] [Else <оператор 3>] End IfОператоры выбораSelect Case <условие>[Case <метка 1><оператор 1>] ………[Case Else<оператор 2>] End SelectЦиклыс предусловиемDo (While | Until) <условие><оператор 1>LoopWhile <условие><оператор 1>Wendсо счётчиком For <счётчик>=<начальное значение> To <конечное значение> [шаг] <оператор 1>[Exit For <оператор 2>] Next <счётчик>с постусловиемLoop<оператор 1>Do (While | Until) <условие>Процедуры[Dim | Private | Public | Static] Sub <имя процедуры> ([список параметров]) <тело процедуры>End SubФункции[Dim | Private | Public | Static] Function <имя функции> ([список параметров]) [As <тип возвращаемого значения>] <тело процедуры>End FunctionМассивыСтатическийDim <иденитифекатор>([нижняя граница to] верхняя граница) As <тип>ДинамическийDim <идентификатор> As <тип> - описание массива1.4. Средства обмена даннымиВнутренний обмен данными осуществляется с помощью переменных. Переменные могут передаваться в процедуры и функции тремя способами: По ссылке. Передаётся адрес переменной, что позволяет изменять ее значение. Используется By Ref, режим по умолчанию. По значению. Создается локальная копия переменной равная передаваемой. Значение изменить нельзя. Используется By Val. Переменная может быть описана как глобальная и расположена вне процедур и функций. Таким образом она будет глобально доступна. 1.5. Встроенные элементыCheck boxФлажок для выбора из двух вариантовCombo boxПоле ввода со спискомFrameГруппирование элементов управленияImageДобавление на форму изображенийLabelОтображение надписейLineИзображение линий для легкого зрительного разделения частей интерфейсаList boxОтображение списка элементовOption buttonГруппы переключателейText boxПоле ввода текстаTimerТаймерНе встроенные, но используемые: Common DialogСтандартные системные диалоги(comdlg32. ocx) List ViewРасширенный список элементов(mscomctl. ocx) Rich Text BoxРедактор текстовых полей (richtx32. ocx) Status BarСтрока состояния для отображения глобальных параметров (путь к БД, необходимость сохранения и т.д.) (mscomctl. ocx) MonthViewКалендарь (comct332. ocx) 1.6. Средства отладки программПри написании программ возникают ситуации, когда, например, необходимо выполнить участок программы по действиям, либо найти место и причину возникающей ошибки. Для этих целей в Visual Basic реализован механизм отладки, позволяющий выполнять программу по шагам и наблюдать за значениями переменных. Используя точки останова, окно наблюдения значений переменных можно изучать выполнение программы: выполнение операций, ветвлений, вызовов процедур и функций и т.д. Также Visual Basic предоставляет возможность встроенной в код обработки исключений (ошибок, связанных с неправомерными действиями программы, происходящими из-за ошибок в коде, либо состояния среды выполнения - операционной системы). Для этого в языке реализованы конструкции: On Error GoTo <метка>. Если во время выполнения программы возникнет исключение в одном из операторов, расположенных после данной конструкции, то управление передается обработчику ошибок, указанному меткой.Т. е. выполнение программы продолжится с места, следующего за меткой. Если в некоторый момент обработку ошибок следует отключить, то используется конструкция On Error GoTo 0. В обработчик ошибок можно включить оператор Resume, который указывает на игнорирование любых ошибок. В этом случае никакая ошибка не будет обработана, что весьма чревато. Resume имеет несколько форм: Resume возобновляет выполнение программы с оператора, вызвавшего ошибку; Resume Next возобновляет выполнение программы со следующего оператора; Resume <метка> возобновляет выполнение программы с оператора, следующего за указанной меткой. 2. конструкторская часть2.1. Общие сведенияПрограмма DB Xtension состоит из следующих частей: Основного исполняемого файла DBX. exeВспомогательной программы assoc. exeНабора wav-файлов в папке \DataФайлы справки в папке \Help, ключевой файл - \Help\index. htmlИз-за особенностей реализации Visual Basic также могут потребоваться библиотеки: asyncfilt. dllcomcat. dllctl3d32. dllmsvbvm60. dlloleaut32. dllolepro32. dllstdole. tlbа также библиотеки используемых ActiveX-компонентовПри написании программы использовались следующие программы: Среда разработкиMicrosoft Visual Basic 6.0Borland/Inprise Delphi 6.0Графический инструметарийXaraX 1.0Xara3D 5.0Microangelo 5.57IrfanView 3.91ICA Converter 1.1.0.8Написание справки, пояснительной записки и структурной схемыMicrosoft Office Word Professional 2003Help&Manual 3.3Microsoft Office Visio Professional 2003Дополнительно использовалась программа UGH! 0.9422.2. Функциональное назначениеДанная программа представляет собой удобное средство для работы с однотабличной ненормализованной базой данных. Максимально удобный и функциональный интерфейс облегчает работу с базой данных. Запросная система, позволяющая добавлять, удалять, сортировать, выводить, обменивать и преобразовывать данные, построена на основе нескольких универсальных запросов, охватывающих весь круг решаемых задач: Добавление полей и записейУдаление полей и записейСортировка записей по любому полю по и против алфавитаВывод записей по любому полю, подходящий по параметрам: Равенства выражениюБольше выраженияМеньше выражениеВстречается в таблице N разВстречается в таблице более N разВстречается в таблице менее N разОбмен полей и записейПереименование и смена типа полей (произвольные строки и целые числа) Запросы формируют копии базы данных, которые можно сохранять в качестве новых баз данных. По любым числовым данным можно строить диаграммы следующих видов: СтолбчатаяЛинейнаяТочечнаяКруговаяСтолбчатые, линейные, точечные и круговые диаграммы можно строить в плоскости и в аксонометрической проекции (3D, только для столбчатой и круговой). Результаты работы с базой данных можно сохранить в HTML. В случае необходимости защиты данных предусмотрена возможность защиты по паролю и шифрования данных в базе данных. В данной реализации программы база данных может содержать поля трех типов данных: строки длиной до ~248 символовцелые числа в диапазоне - 2147483647. .2147483647псевдоформат Дата, являющийся строковым, но редактируемый с использованием календарем2.3. Описание логической структуры программы2.3.1. Главная форма (MainForm. frm) (рис.1) Запуск программы.Запускается форма MainForm(строка 1), в процедуре Form_Load(строка 245) устанавливаются начальные значения и состояние панели инструментов. Создание новой БД.Вначале управление получает процедура CreateDB_Click(строка 96), в которой вызывается стандартный системный диалог выбора файла. Если файл выбран, то вызывается процедура NewDB(строка 2788), создающая новую БД, и процедурой ShowTable(строка 2378) отображается пустая таблица. Открытие БД.В процедуре OpenDB_Click(строка 292) вызывается диалог выбора файла. Если файл был выбран вызывается функция LoadDB(строка 2600), загружающая БД из файла. В случае отсутствия ошибок в файле и нужных прав для открытия файла кнопки на панели инструментов меняют состояние при помощи процедуры DisEnImage(строка 37) и отображается загруженная таблица процедурой ShowTable(строка 2378). Если прав недостаточно для открытия БД будет вызван мастер защиты (рис.5, Рис.6). Сохранение БД.В процедуре SaveDB_Click(строка 345) вызывается диалог выбора файла. Если файл был выбран, то изменяется путь к текущей БД в переменной DBPath(строка 2309) и БД сохраняется в указанный файл процедурой FlushDB(строка 2500). Закрытие БД.Если переменная DBChanged(строка 2311), являющаяся флагом несохраненных изменений в БД, равна истине, то предлагается отменить закрытие. Если пользователь все же закрывает БД, то процедура ClearAll(строка 2806) освобождает используемую под таблицы память, а процедура ShowTable(строка 2378) скрывает пустую таблицу. Создание резервной копии.В процедуре ResCopyDB_Click(строка 328) сначала вызывается диалог выбора файла. Если он удачен, то проверяется совпадение текущей БД с ее создаваемой копией. Если файлы различны API функция CopyFile(строка 2824) создает копию файла текущей БД и появляется сообщение об удачном выполнении операции. Выход (завершение работы). Выход из программы реализован процедурой ExitPr_Click(строка 124). В ней происходит проверка на внесенные в БД изменения, которые еще не были сохранены. Если изменений нет, или пользователь выбрал выход без сохранения, программа завершает свою работу. Запуск Мастера запросов (QueryMasterForm. frm) (рис.2) При выборе Запросы>Мастер запросов выполняется процедура QueryM_Click. (строка 319) В ней модально показывается форма QueryMasterForm(рис.2). Управление передается этой форме, ее процедуре Form_Load(строка 785). В ней настраивается внешний вид формы. При выборе элемента в списке QueryTypeCombo вызывается процедура QueryTypeCombo_Click(строка 801), заполняющая список QuerySubtypeCombo значениями в зависимости от поля QueryTypeCombo. ListIndex. При нажатии на изображении «+» в правой части окна вызывается процедура AddImage_Click(строка 667). В ней в зависимости от полей QueryTypeCombo. ListIndex и QuerySubtypeCombo. ListIndex вызываются вложенные процедура AddStr(строка 659) и функция Generate_XXX(строки 2982, 2996, 3031, 3043, 3068, 3089). AddStr определена в модуле формы и выполняет проверку в добавление строки в список QueryList. Generate_XXX, являющаяся серией функций, начинающихся Generate_, и определенных в модуле QueryRunner, формируют тексты запросов на основе диалогов. Нажатие изображения «-» вызывает процедуру DelImage_Click(строка 774), удаляющую выбранный в списке QueryList элемент. Если нажать на изображение «X», то будет вызвана процедура ClearImage_Click(строка 762), удаляющая все элементы в списке QueryList. При щелчке по кнопке CancelBut управление переходит к процедуре обработки этого события. Эта процедура выгружает форму QueryMasterForm из памяти. Ну и нажатие на кнопку «Выполнить» приводит к выполнению процедуры RunBut_Click(строка 832), которая вызывает процедуру RunQuery(модуль QueryRunner) для каждого элемента списка QueryList, а также показывает выбранную таблицу вызовом ShowTable(QMFDBIndex). После этого список QueryList очищается и выдается сообщение о завершении выполнения запросов. Формирование HTML.При выборе пункта меню Результаты>Формирование HTML вызывается процедура HTMLCreator_Click(строка 208). В ней вызывается диалог выбора файла. Если файл выбран, то процедура CreateHTML сохраняет текущую БД в файл, иначе выдается сообщение об отмене формирования HTML. Защита (PasswordForm. frm) (рис.9).При выборе Настройки>Защита вызывается процедура Security_Click(строка 356). В ней показывается форма PasswordForm в режиме настройки параметров безопосности. Если после завершения работы с формой значение переменной PasswordForm. res истинно, то новые параметры сохраняются и выбается соответствующее сообщение. После этого форма PasswordForm выгружается из памяти. Также данная форма используется при открытии БД, защищенной паролем. О программе (AboutForm. frm) (рис.10). При выботе пункта О программе в меню? вызывается процедура AboutProg_Click(строка 11). В ней модально отображается форма AboutForm. Помощь.После выбора? >Помощь управление переходит к процедуре HelpProg_Click(строка 140), запускающей с помощью API функции ShellExecute(строка 2827) браузер с файлом программной справки. Форму можно перетаскивать мышью за любое место. Для этого используются процедуры MDown(строка 2874), MUp(строка 2880), MMove(строка 2862). В процедуре MMove вызываются API функции GetWindowRect(строка 2846) и MoveWindow(строка 2847). При щелчке по надписи «Xerx» вызывается API функция ShellExecute(строка 2827), вызывающая программу, зарегистрированную в системе как почтовая. 2.3.2. Мастер диаграмм (DiagMasterForm. frm) (рис.11) При выборе Результаты>Мастер диаграмм выполняется процедура DiagDraw_Click(строка 114). В ней модально показывается форма DiagMasterForm. Управление передается этой форме, ее процедуре Form_Load(строка 1196). В ней настраивается внешний вид формы, очищаются все списки и в список TableIndexCombo добавляются названия всех открытых таблиц. При выборе элемента в TableIndexCombo в процедуре TableIndexCombo_Click(строка 1306) список TableColList заполняется заголовками полей выбранной таблицы. При двойном щелчке в TableColList вызывается процедура TableColList_DblClick(строка 1291), в которой выбранный заголовок вместе с названием таблицы добавляется в список SelectColList с предварительной проверкой на уже добавленность. Двойной щелчок в списке SelectColList вызывает процедуру SelectColList_DblClick(строка 1301), в которой выбранная строчка удаляется. Выбор элемента списка DiagTypeCombo приводит к вызову процедуры DiagTypeCombo_Click(строка 1184), в которой изменяется картинка типа диаграмм в компоненте DiagTypeImage, а также скрывается либо показывается фрейм Frame2. Нажатие на кнопку Отмена закроет форму DiagMasterForm. Нажатие на кнопку Принять приводит к вызову процедуры OkBut_Click(строка 1275), в которой вызывается функция GettingDiagData(строка 1229), формирующая данные для диаграммы. В случае успешности этой загрузки загружается в память форма DiagResForm(рис.16) и вызывается ее процедура InitDiagData(строка 1424), после чего загруженная форма модально показывается. 2.3.3. Работа с окном диаграммы (DiagResForm. frm) (рис.16) Форма DiagResForm, вызываемая из формы DiagMasterForm(рис.11) кнопкой «Принять», предназначена непосредственно для построения диаграмм. Диаграммы строятся на канве компонента Chart типа PictureBox, используя его методы. Кнопка Image1 с изображение дискеты позволяет сохранить диаграмму в качестве BMP файла. Для этого предназначена процедура Image1_Click(строка 2046), в которой, используя компонент CD типа CommonDialog, указывается путь к создаваемому растровому файлу, после чего (если файл был указан) вызывается встроенная процедура SavePicture, сохраняющая диаграмму. Нажатие на изображение Image2 с изображением вопроса показывает модально окно настроек DiagOptForm(рис.15). Кнопка Image3 с изображение стрелки выгружает форму из памяти. Процедура DrawDiagram(строка 1975), вызываемая при изменении размеров и изменении настроек, непосредственно не строит диаграммы, она лишь заливает фон градиентной заливкой (процедура ColorFill(строка 1440)), а также в зависимости от типа строимой диаграммы вызывает процедуры DrawCircle(строка 1673) (круговая диаграмма) и DrawPoint(строка 1749) (колончатая, точечная и линейчатая диаграммы). Также DrawCircle вызывает процедуру OutOneElem(строка 1482), стоящую один элемент круговой диаграммы. Данные для построения хранятся в массиве DiagData(строка 1387), режим построения (тип диаграммы) в переменной DrawingMode(строка 1388), а флаг использования 3D в переменной Use3D(строка 1388). Значения этих переменных определяются в процедуре InitDiagData(строка 1424). При перемещении мыши над диаграммой Chart вызывается процедура Chart_MouseMove(строка 1988), выводящая в метку Label2 текст о значении функции в указанной точке. Перемещение ползунка полосы прокрутки VScroll вызывает процедуру VScroll_Change(строка 2122), изменяющую значение переменной Ellipce в зависимости от позиции ползунка и перерисовывающую диаграмму. 2.3.4. Работа с окном настроек диаграммы (DiagOpt. frm) (рис.15) На закладке «Цвета и текст» щелчок по любому компоненту Frame2 вызывает диалог выбора цвета (используется ColorDlg). Изменение цвета фреймов с индексами 0 или 1 вызывает процедуру ColorFill(строка 1440) для компонента Picture1 типа PictureBox. В списке List1 хранятся надписи элементов диаграммы, а в массиве List1. ItemData хранятся цвета соответствующих элементов. В текстовом поле Text1 можно менять значение выбранной в List1 записи. При нажатии кнопки [Enter] вызывается процедура Text1_KeyDown(строка 2203), сохраняющая значение подписи в массив List1. Item. При нажатии кнопки Принять переменной res присваивается значение 1, что сигнализирует об необходимости применить внесенные изменения. После этого форма скрывается. При нажатии на кнопку Отмена форма делается невидимой без изменения переменной res. 2.3.5. Работа с редактором записей (EditRecordForm. frm) (рис.3) Двойной щелчок по строке в списке ListView вызывает процедуру ListView_DblClick(строка 220), в которой настраивается внешний вид формы EditRecordForm, вызывается процедура LoadData(строка 855), определенная в модуле формы, и форма модально отображается. При загрузке формы вызываются процедура Form_Load(строка 891), настраивающая внешний вид формы. В списке CellList_Click выводятся поля выбранной в списке ListView записи. Выбор элемента в списке сопровождается вызовом процедуры CellList_Click(строка 866), в которой в зависимости от типа выбранного поля в метку Label6 выводится соответствующий текст, а также процедурой ButEnabled(строка 2934), определенной в модуле DBConst, меняется состояние кнопки «Редактор». После этого в текстовое поле Text1 загружается значение выбранного поля и полностью выделяется. Нажатие кнопки «Редактор» вызывает процедуру EditorBut_Click(строка 917), в которой сначала проверяется тип редактируемого поля, затем, если оно числовое, выдается сообщение об ошибке, иначе поле сравнивается с форматом даты. Если формат совпадает и флажок MonthForm. Check1(рис. 19) (установлен - календарь не показывается) не установлен, то загружается форма TextEditForm(рис.8) (в ином случае загружается форма MonthForm), в текстовый редактор TextEdit типа RichTextBox загружается значение из текстового поля Text1. Если окно TextEditForm было закрыто с сохранением текста, то переменная TextEditForm. res истинна и измененный текст загружается в текстовое поле Text1. После этого форма TextEditForm выгружается из памяти. Нажатие на кнопку «Применить» вызывает процедуру FlipBut_Click(строка 1010), проверяющую введенное значение на корректность (соответствие типу и разрядной сетке) и, в случае отсутствия ошибок, присваивает выбранному в списке CellList элементу введенное значение. В случае какой-либо ошибки выдается соответствующее сообщение. Нажатие на кнопку «Вернуть» восстанавливает все поля записи из БД в процедуре ReturnBut_Click(строка 908), вызывающей последовательно LoadData(строка 855) и OverloadList(строка 883), получающие и копирующие запись во временный буфер Arr(строка 853). Нажатие на кнопку «Отмена» вызывает процедуру CancelBut_Click(строка 982), выгружающая форму EditRecordForm из памяти. Кнопка «Принять» вызывает процедуру SelectBut_Click(строка 954), работа которой заключается в сохранении полей записи из локального массива Arr в глобальную таблицу. 2.3.6. Работа с окном выбора (SelectForm. frm) (Рис.6) Выбор записей и полей БД производится при помощи формы SelectForm, предоставляющей удобный выбор среды указанных списков. В модуле формы глобально объявлены функции SelectDlg(строка 556) и MultiSelectDlg(строка 598), предназначенные для организации диалога по выбору одного (SD) или нескольких (MSD) записей (SD) либо полей (SD, MSD) из указанной при вызове таблицы. Функция SelectDlg возвращает число равное номеру выбранного элемента, либо «-1», если выбор был отменен. Функция MultiSelectDlg возвращает строку, в которой через запятую перечислены индексы всех выбранных элементов. Если строка пуста, то это однозначно указывает, что ничего не было выбрано. 2.3.7. Работа с редактором текста (TextEditForm. frm) (рис.8) Нажатие кнопки «Редактор» вызывает форму «Редактор текстовых полей» (TextEditForm), главной частью которой является компонент TextEdit типа RichTextBox. На панель Toolbar1, расположен ряд кнопок, обработка нажатий которых расположена в процедуре Toolbar1_ButtonClick(строка 522). Кнопка «ClearText» очищает весь текст в TextEdit, а кнопка «SaveText» указывает вызывающей форме о необходимости внести изменения в данные. Кнопки «CopyText», «PasteText», «CutText» и «DeleteText» работают с системным буфером обмена. Кнопка «Properties» позволяет, используя компонент FontDlg, настраивать шрифт в редакторе. 2.3.8. Работа с календарем (MonthForm. frm) (рис. 19) При загрузке формы в процедуре Form_Load настраивается внешний вид окна а также переменной res(строка 2231), хранящей результат работы с окном, присваивается значение 0. При нажатии кнопки Принять вызывается процедура YesBut_Click(строка 2249), устанавливающая значение res в 1 (дата выбрана) и скрывает форму. При нажатии кнопки Текст вызывается процедура EditBut_Click(строка 2237), устанавливающая значение res в - 1 (редактирование как текст) и также скрывает форму. Нажатие кнопки Отмена просто скрывает форму в процедуре CancelBut_Click(строка 2233). 2.3.9. Работа DBConst (DBConst. bas) В модуле описаны глобальные константы, процедуры: SoundClick(строка 2914), для проигрывания звука нажатия на кнопкуIsInteger(строка 2918), для проверки возможности преобразования строки в целое числоButEnabled(строка 2934), для анимации кнопок2.3.10. Работа DBTypes (DBTypes. bas) Модуль предназначен для обеспечения всей работы с БД как с физическим файлом. Для этого в модуле объявлены необходимые типы, переменные и константы. Также модуль содержит следующие процедуры и функции: DelCol_(строка 2318), процедура для удаления поля из указанной таблицыDelRow_(строка 2348), процедура для удаления записи из указанной таблицыTestDBChanged(строка 2369), процедура проверки изменения БД и отображения дискеты в первом секторе строки состояния главной формыShowTable(строка 2378), процедура вывода указанной БД на экранItColAlreadyCreate(строка 2419), функция проверки уникальности поляAddCol(строка 2432), процедура добавление поляAddField(строка 2465), процедура добавления записиDelTable(строка 2475), процедура удаления указанной таблицы из массива таблиц DBCodeDecode(строка 2483), функция шифрует строкиFlushDB(строка 2500), процедура сохранения БДLoadDB(строка 2600), функция загрузки БДNewDB(строка 2788), процедура создания новой БД и инициализации настроекClearAll(строка 2806), процедура освобождения занимаемой памяти и сброса настроекClearHeader(строка 2814), процедура установки полей заголовка БД в стандартное (начальное) состояние2.3.11. Работа QueryRunner (QueryRunner. bas) Модуль предназначен для работы с запросами. Для формирования и выполнения запросов в модуле описаны необходимые константы и процедуры с функциями: Формирование строки запросов на основе диалогов: Generate_Add(строка 2982) - добавление полей и записейGenerate_Del(строка 2996) - удаление полей и записейGenerate_Sort(строка 3031) - сортировка записейGenerate_Out(строка 3043) - вывод записейGenerate_Swap(строка 3068) - перестановка полей и записейGenerate_Change(строка 3089) - изменение типа и заголовка поляErrorInQuery(строка 3105) - сообщение об ошибке в запросе, связано с ручной правкой запросов и/или некорректными параметрамиTestZero(строка 3109) - проверка параметра на равенство нулю. В случае равенства вызывается ErrorInQueryВыполнение запросов: AddRun(строка 3118) - добавление полей и записейDelRun(строка 3187) - удаление полей и записейSortRun(строка 3227) - сортировка записейOutRun(строка 3340) - вывод записей. Используются дополнительные функции: Equal(строка 3290) - сравнение передаваемых значений в соответствии с типамиCalcCount(строка 3308) - подсчет количества записей с полем равным заданномуEarlierDontFind(строка 3316) - проверка на существование ранее идентичного поля по записямFindRow(строка 3326) - поиск записиSwapRun(строка 3464) - перестановка полей и записейChangeRun(строка 3518) - изменение типа и заголовка поляRunQuery(строка 3583) - выполнение произвольного запроса. Выполняет ветвление и передачу процедурам указанных в запросе данных2.4. Запуск и выполнениеДля запуска программы необходимо запустить DBX. exe. Сразу после запуска (при условии наличия в системе всех необходимых файлов, перечисленных в общих сведениях) будет открыто окно заставки(рис.17). После нажатия клавишь Enter или Esc будет загружено главное окно программы. Программа может быть запущена с любого носителя данных, будь то: жесткий диск (HDD), дискета (FDD), CD-диск (CD - и DVD - ROM), различных внешних устройств (Flash и ZIP) и т.д., а также по локальной сети. 3. технологическая часть3.1. Руководство системного программиста3.1.1. Общие сведения о программеДанная программа представляет собой удобное средство для работы с однотабличной ненормализованной базой данных. В программу встроена запросная система, позволяющая добавлять, удалять, сортировать, выводить, обменивать и преобразовывать данные, построенная на основе нескольких универсальных запросов, охватывающих весь круг конкретных решаемых задач. Системные требованияПроцессор не ниже Intel Pentium 133,Операционная система семейства Windows не ниже 9x, желательно XP,Оперативная память не менее 32MB, Мышь (не менее 1 кнопки),Клавиатура,1 MB свободного пространства на жестком диске (плюс файлы баз данных, результирующих HTML и сохраненных в BMP диаграмм),Монитор, поддерживающий режим не менее 800x600x8, желательно 1024x768x24. Программа DB Xtension состоит из следующих частей: Основного исполняемого файла DBX. exeВспомогательной программы assoc. exeНабора wav-файлов в папке \DataФайлы справки в папке \Help, ключевой файл - \Help\index. htmlИз-за особенностей реализации Visual Basic также могут потребоваться библиотеки: asyncfilt. dllcomcat. dllctl3d32. dllmsvbvm60. dlloleaut32. dllolepro32. dllstdole. tlbплюс библиотеки используемых ActiveX-компонентов3.1.2. Структура программыПрограмма включает в себя следующие файлы: Формы: AboutForm. frm (окно О программе) DiagMasterForm. frm (мастер диаграмм) DiagResForm. frm (окно построения диаграмм) EditRecordForm. frm (редакрор записей) InputForm. frm (окно ввода, замена InputBox) MainForm. frm (главное окно программы) MsgForm. frm (окна диалогов, замена MsgBox) PasswordForm. frm (настройки безопасности и ввод пароля) QueryMasterForm. frm (мастер запросов) SelectForm. frm (окно выбора полей или записей) TableForm. frm (окно создания нового поля) TextEditForm. frm (редактор текстовых полей) Модули: API. bas (объявление и использование функций WinAPI) DBConst. bas (глобальные описания) DBTypes. bas (работа с БД как с файлом) QueryRunner. bas (формирование и выполнение запросов) Набор графических и аудио файлов3.1.3. Проверка программыДля проверки правильности функционирования программы выполните следующие действия: После запуска программы и появления главной формы Создайте новую БД. В качестве имени укажите «test». Будет создан файл «test. dbx» размером в 13 байт, выведено сообщение, показана пустая таблица на закладке «Главная таблица» и во второе поле строки состояния выведен полный путь к файлу. Используя мастер запросов добавьте в БД два поля «ФИО» и «Оценка» строкового и числового типа соответственно. Поле значение по умолчанию измените в поле «ФИО» на пустое. Также создайте новую запись. В таблице появились две колонки с указанными заголовками и запись вида «'','0'». Измените значения этого поля на «Иванов И.И. | 4». Аналогично добавьте записи «Петров П.П. | 5» и «Сидоров С.С. | 3». Должна получится таблица с соответствующими данными. Используя Выборку на превышение записи по полю «Оценка» более 0 получите копию БД на закладке «Вывод? >0». Удалите запись с ФИО Петров П.П., воспользовавшись Удалением записи с выбором «1) Петров П.П. - 5». Предупреждение отмените. В полученной двухстрочной таблице воспользуйтесь Обменом записей. В результате таблица примет вид:
Закройте созданную таблицу. Отсортируйте по полю ФИО против алфавита. Добавится закладка «Я->А» и таблица «Сидоров, Петров, Иванов». В мастере запросов из таблицы сортировки выберите поле «Я->А» и тип диаграммы «Колонки». Установите режим 3D. Отрисованная столбчатая диаграмма должна содержать три столбца черного, серого и белого цветов со значениями процентов 25%, 42%, 33%. Сохраните полученную диаграмму в файл «diag. bmp». Одноименный файл будет создан по указанному пути. Создайте гипертекстовый файл «hiper. html» с заголовком «Тестовый файл». Согласитесь на открытие после создания. Если в вашей системе установлен и зарегистрирован браузер, он будет запущен с содержимым «hiper. html». Также можно настроить параметры безопасности (Настройки>Защита), сохранить БД на диск и повторно ее открыть для проверки правильности указанных настроек. Выбор «? - >Помощь» приведет к открытию справки. Если этого не произошло, убедитесь, что выполняется условие запуска браузера с HTML-результатом (пункт X), а также в наличие непосредственно файлов справки. 3.2. Руководство оператора3.2.1. Общие сведения о программеДанная программа представляет собой удобное средство для работы с однотабличной ненормализованной базой данных. Максимально удобный и функциональный интерфейс облегчает работу с базой данных. Запросная система, позволяющая добавлять, удалять, сортировать, выводить, обменивать и преобразовывать данные, построена на основе нескольких универсальных запросов, охватывающих весь круг конкретных решаемых задач. 3.2.2. Выполнение программыДля запуска программы необходимо запустить DBX. exe. Для выхода из программы выполните одно из следующих действий: Выберите Файл>ВыходНажмите клавишу F12. Нажмите правую кнопку на панели инструментов главного окна в виде кнопки выключения питания. Все пункты меню Файл дублируются панелью инструментов в эквивалентном порядке. Для создания, открытия, сохранения, закрытия и создания копии БД используйте одноименные пункты в меню Файл, либо кнопки на панели инструментов. Почти вся работа с БД выполняется в Мастере запросов, расположенном в Запросы>Мастер запросов. Возможные запросы:
Для построения диаграмм выберите Результаты>Мастер диаграмм. Диаграммы можно строить только по полям числового типа. Для сохранения БД в гипертекстовом формате воспользуйтесь пунктом меню Результаты>Формирование HTML. Достаточно указать путь к файлу и заголовок таблицы. Для установки защиты выберите Настройки>Защита. Условием защиты по паролю является наличие произвольного, отличного от пробелов текста в поле ввода пароля. Если поле пусто никакие настройки не учитываются. Для получения справки выберите? >Помощь. 3.2.3. Сообщения оператору (рис.12, рис.13, рис.14) Мастер диаграмм: Нельзя строить диаграмму по нечисловым данным! (попытка строить диаграмму по строковым значениям) Редактор записей: Восстановить поля из БД? Поля были восстановлены! Для редактирования чисел редактор не используется. (редактор предназначен лишь для удобства редактирования многострочного текста) Сохранить поля в БД? Поля были сохранены в БД! Изменённое поле перекрывает уже существующее! Измените данные. (измененное поле стало эквивалентно другому полю, либо не было внесено изменений в данные) Числовое значение превышает разрядную сетку! (введено целое число, большее по модулю 2147483647) Значение не является целым числом! (введено значение, не являющееся целым числом либо 0) Строка пуста. Продолжить? (измененная строка пуста) Мастер запросов: Запрос отменен! Список запросов не пуст. Выйти? (были созданы и не выполнены запросы) Очистить список запросов? Удалить выбранный запрос из списка? Запросы выполнены. Выводить в новую таблицу? Нет для вывода в уже существующую. (запрос может выводить результат либо в уже существующую таблицу, дописывая в конец, либо создать новую) Не задано относительное значение! (для выполнения запроса недостаточно данных) Ошибка в запросе! (произошла ошибка во время интерпретации или выполнения запроса) Добавляемое поле уже существует! Добавляемый столбец дублируется! Нельзя добавлять записи в БД без полей! (запись добавляется, а полей в БД еще нет) В БД нет полей! В БД нет записей! Нечего сортировать! (вызвана сортировка пустой БД) Не с чем сравнивать! (сравнения по пустой БД) Эквивалентом вывода целочисленного столбца не является целое число! Условие всегда истинно! (в запросе вывода указано строковое значение, а вывод идет по числовому полю) Добавляемая запись уже существует! Поле строкового типа преобразуется в числовой тип. Все нечисловые значения будут преобразованы в 0. Продолжить? (при изменении типа поля из строкового в числовое все строки, которые нельзя преобразовать в целые числа, будут заменены 0). Поле с названием XXX уже существует! Окно настроек создаваемого поля: Введенное значение не является целым числом. Преобразовано к '0'. Главное окно: Недостаточно прав для выполнения действия! (открыта БД, защищенная паролем, в режиме чтения и производится попытка изменения данных) Ошибка удаления столбца! Удалить столбец? Ошибка удаления записи! Удалить запись? БД сохранена! БД повреждена! (при загрузке БД произошла ошибка) Пароль принят! (БД, защищенная паролем, открыта с корректно введенным паролем) Только чтение! (БД, защищенная паролем, открыта в режиме чтения) Пароль не принят! Доступ запрещён! БД загружена! БД создана с настройками по-умолчанию! литератураMicrosoft Corporation Microsoft Visual Basic 6.0 Programmer's Guide, Microsoft Press, 2003 г. Microsoft® Win32® Programmer's Reference, 1996 г. Приложение 1Исходный код программыФорма: MainForm. frm0' разница ширины и высоты формы и TabStrip'а1Dim dW1%, dH1%2' разница ширины и высоты TabStrip'а и ListView'а3Dim dW2%, dH2%4' последний выбранный элемент5Dim saveItemIndex%6' текущая таблица7Public DBCurIndex%8' последний Image, над которым был курсор9Dim OldImageIndex%1011Private Sub AboutProg_Click() 12 CoolTimer. Enabled = False13 AboutForm. Show vbModal14 CoolTimer. Enabled = True15End Sub1617Private Sub CloseDB_Click() 18 CoolTimer. Enabled = False19 20 If DBChanged Then21 If (MsgForm. QuestMsg("В БД внесены не сохранённые изменения. Закрыть не сохраняя? ") <> resOk) Then GoTo exit_22 End If23 24 SB. Panels(3). Text = ""25 Call ClearAll26 Call ShowTable(-1) 27 Call DisEnImage(2, 1) 28 Call DisEnImage(3, 1) 29 Call DisEnImage(4, 1) 30 31exit_: 3233 CoolTimer. Enabled = True34End Sub3536' index,mode / сегмент, смещение37Sub DisEnImage(Index%, Mode%) 38 CoolBut(Index). Picture = CoolImgs. ListImages(1 + (Index * 3 + Mode)). Picture39 CoolBut(Index). Enabled = (Mode <> 1) 40End Sub4142Sub RetImage() 43 If (OldImageIndex > - 1) Then44 If CoolBut(OldImageIndex). Enabled Then45 Call DisEnImage(OldImageIndex, 0) 46 Else47 Call DisEnImage(OldImageIndex, 1) 48 End If49 End If50 OldImageIndex = - 151End Sub5253Sub CoolMouseMove(Index%) 54 If (Index = OldImageIndex) Then Exit Sub55 Call DisEnImage(Index, 2) 56 Call RetImage57 OldImageIndex = Index58End Sub5960Private Sub CoolBut_Click(Index As Integer) 61 Call DisEnImage(Index, 0) 62 Select Case Index63 Case 0: Call CreateDB_Click64 Case 1: Call OpenDB_Click65 Case 2: Call SaveDB_Click66 Case 3: Call CloseDB_Click67 Case 4: Call ResCopyDB_Click68 Case 5: Call ExitPr_Click69 End Select70End Sub7172Private Sub CoolTimer_Timer() 73 Dim Point As POINTAPI74 Dim R As RECT, R2 As RECT75 Call GetCursorPos(Point) 76 Call GetWindowRect(Frame1. hwnd, R) 77 For i% = 0 To 578 If (Not CoolBut(i). Enabled) Then GoTo loop_79 x% = R. Left + CoolBut(i). Left / Screen. TwipsPerPixelX80 y% = R. Top + CoolBut(i). Top / Screen. TwipsPerPixelY81 X2% = x + CoolBut(i). Width / Screen. TwipsPerPixelX82 Y2% = y + CoolBut(i). Height / Screen. TwipsPerPixelY83 R2. Left = x84 R2. Top = y85 R2. Right = X286 R2. Bottom = Y287 If ((Point. x >= R2. Left) And (Point. x <= R2. Right) And (Point. y >= R2. Top) And (Point. y <= R2. Bottom)) Then88 Call CoolMouseMove(i) 89 Exit Sub90 End If91loop_: 92 Next i93 Call RetImage94End Sub9596Private Sub CreateDB_Click() 97 CoolTimer. Enabled = False98 Dlgs. FileName = ""99 Dlgs. ShowSave100 If (Dlgs. FileName <> "") Then101 ' создаю новую БД102 Call NewDB(Dlgs. FileName) 103 ' вывожу путь к БД104 SB. Panels(3). Text = DBPath105 ' разрешения106 Call DisEnImage(2, 0) 107 Call DisEnImage(3, 0) 108 Call DisEnImage(4, 0) 109 Call ShowTable(DBCurIndex) 110 End If111 CoolTimer. Enabled = True112End Sub113114Private Sub DiagDraw_Click() 115 CoolTimer. Enabled = False116 DiagMasterForm. Show vbModal117 CoolTimer. Enabled = True118End Sub119120Private Sub ExitBut_Click() 121 Call ExitPr_Click122End Sub123124Private Sub ExitPr_Click() 125 CoolTimer. Enabled = False126 If Not DBChanged Then127 End128 Else129 If (MsgForm. QuestMsg("В БД внесены не сохранённые изменения. Выйти не сохраняя? ") = resOk) Then End130 End If131 CoolTimer. Enabled = True132End Sub133134Private Sub File_Click() 135 SaveDB. Enabled = DBPath <> ""136 CloseDB. Enabled = SaveDB. Enabled137 ResCopyDB. Enabled = SaveDB. Enabled138End Sub139140Private Sub HelpProg_Click() 141 CoolTimer. Enabled = False142 Call ShellExecute(hwnd, "open", "Help\index. html", "", "", 0) 143 CoolTimer. Enabled = True144End Sub145146Sub CreateHTML(Path$) 147 Call DeleteFile(Path) 148 DBI% = FreeFile149 Open Path For Binary As DBI150 151 Capt$ = InputForm. InputVal("Введите заголовок для таблицы") 152 153 HTMLHeader$ = Replace("<html><head><meta http-equiv=~Content-Language~ content=~ru~>" + _154 "<meta http-equiv=~Content-Type~ content=~text/html; charset=windows-1251~>", "~", Chr(34)) 155156 HTMLInfo$ = "<title>" + Capt + "</title>"157 158 HTMLStart$ = Replace("</head><body><div align=~center~><table border=~1~ cellspacing=~2~ style=~border-collapse: collapse~>", "~", Chr(34)) 159160 HTMLEnd$ = "</table></div><br><br><br><hr><i>Файл сгенерирован программой DB Xtension по содержимому БД </i><b>' " + DBPath + "' </b></body></html>"161 162 HTMLCaption$ = Replace("<tr><td colspan=~" + CStr(DB(DBCurIndex). Header. ColCount) + "~ align=~center~ bgcolor=~#66CCFF~><font color=~#FFFF00~ size=~5~>" + Capt + "</font></td></tr>", "~", Chr(34)) 163164 HTMLRowS$ = "<tr>"165 HTMLRowE$ = "</tr>"166 167 If (DB(DBCurIndex). Header. ColCount > 0) Then ColWidth% = 100 \ DB(DBCurIndex). Header. ColCount168 169 HTMLCols$ = Replace("<td bgcolor=~#999999~ width=~" + CStr(ColWidth) + "%~ align=~center~><b><font face=~Arial~ color=~#FFFFFF~>^</font></b></td>", "~", Chr(34)) 170 171 HTMLCells$ = Replace("<td width=~" + CStr(ColWidth) + "%~ align=~center~>^</td>", "~", Chr(34)) 172173 Put DBI,, HTMLHeader174 Put DBI,, HTMLInfo175 176 If (DB(DBCurIndex). Header. ColCount > 0) Then177 Put DBI,, HTMLStart178 Put DBI,, HTMLCaption179 180 Put DBI,, HTMLRowS181 For c% = 0 To DB(DBCurIndex). Header. ColCount - 1182 Put DBI,, Replace(HTMLCols, "^", CStr(DB(DBCurIndex). Cols(c). title)) 183 Next c184 Put DBI,, HTMLRowE185 186 For R% = 0 To DB(DBCurIndex). Header. RowCount - 1187 Put DBI,, HTMLRowS188 For c% = 0 To DB(DBCurIndex). Header. ColCount - 1189 tmp$ = CStr(DB(DBCurIndex). Rows(R). Fields(c)) 190 If (Trim(tmp) = "") Then tmp = " "191 Put DBI,, Replace(HTMLCells, "^", tmp) 192 Next c193 Put DBI,, HTMLRowE194 Next R195 196 Put DBI,, HTMLEnd197 Else198 Put DBI,, "</head><body>База не содержит данных</body></html>"199 End If200 201 Close DBI202 203 If (MsgForm. QuestMsg("Файл '" + Path + "' создан. Открыть? ") = resOk) Then204 Call ShellExecute(hwnd, "open", Path, "", "", 0) 205 End If206End Sub207208Private Sub HTMLCreator_Click() 209 CoolTimer. Enabled = False210 HTMLPath. FileName = ""211 HTMLPath. ShowSave212 If (HTMLPath. FileName <> "") Then213 Call CreateHTML(HTMLPath. FileName) 214 Else215 Call MsgForm. ErrorMsg("Формирование HTML-документа отменено! ") 216 End If217 CoolTimer. Enabled = True218End Sub219220Private Sub ListView_DblClick() 221 If (saveItemIndex > 0) Then222 Load EditRecordForm223 With EditRecordForm224. CellList. Clear225. ERFDBIndex = DBCurIndex226 Call. LoadData(saveItemIndex - 1) 227 Call. OverloadList228. Show vbModal229 End With230 End If231End Sub232233Private Sub ListView_ItemClick(ByVal Item As MSComctlLib. ListItem) 234 saveItemIndex = Item. Index235End Sub236237Private Sub ListView_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 238 saveItemIndex = 0239End Sub240241Private Sub OptDB_Click() 242 Security. Enabled = DBPath <> ""243End Sub244245Private Sub Form_Load() 246' регистрации расширения247 Call ShellExecute(0, "", "assoc. exe", App. Path + "\" + App. EXEName + ". exe", "", 0) 248 DBCurIndex = 0249 UserIsAdmin = True250 saveItemIndex = 0251 OldImageIndex = - 1252 Call ClearAll253 dW1 = Width - TabStrip. Width254 dH1 = Height - TabStrip. Height255 dW2 = Width - ListView. Width256 dH2 = Height - ListView. Height257 Call DisEnImage(0, 0) 258 Call DisEnImage(1, 0) 259 Call DisEnImage(2, 1) 260 Call DisEnImage(3, 1) 261 Call DisEnImage(4, 1) 262 Call DisEnImage(5, 0) 263End Sub264265Private Sub Form_Resize() 266 CoolBar1. Width = 2 * Width267268 Min% = MainForm. Width - dW2269 If (Min < 0) Then: Min = 0270 ListView. Width = Min271 272 Min = MainForm. Height - dH2273 If (Min < 0) Then: Min = 0274 ListView. Height = Min275 276 Min = MainForm. Width - dW1277 If (Min < 0) Then: Min = 0278 TabStrip. Width = Min279 280 Min = MainForm. Height - dH1281 If (Min < 0) Then: Min = 0282 TabStrip. Height = Min283End Sub284285Private Sub Form_Unload(Cancel%) 286 If DBChanged Then287 If (MsgForm. QuestMsg("Выйти? ") = resNo) Then Cancel = 1288 End If289 Close ' пожалуй, это лишнее, но да мало ли:) 290End Sub291292Private Sub OpenDB_Click() 293 CoolTimer. Enabled = False294 Dlgs. FileName = ""295 Dlgs. ShowOpen296 If (Dlgs. FileName <> "") Then297 ' открываю БД298 If LoadDB(DBCurIndex, Dlgs. FileName) Then299 ' вывожу путь к БД300 SB. Panels(3). Text = DBPath301 Call DisEnImage(2, 0) 302 Call DisEnImage(3, 0) 303 Call DisEnImage(4, 0) 304 Call ShowTable(DBCurIndex) 305 End If306 End If307 CoolTimer. Enabled = True308End Sub309310Private Sub QueryDB_Click() 311 QueryM. Enabled = DBPath <> ""312End Sub313314Private Sub ResDB_Click() 315 DiagDraw. Enabled = DBPath <> ""316 HTMLCreator. Enabled = DBPath <> ""317End Sub318319Private Sub QueryM_Click() 320 CoolTimer. Enabled = False321 With QueryMasterForm322. QMFDBIndex = DBCurIndex323. Show vbModal324 End With325 CoolTimer. Enabled = True326End Sub327328Private Sub ResCopyDB_Click() 329 CoolTimer. Enabled = False330 Dlgs. FileName = ""331 Dlgs. ShowSave332 If (Dlgs. FileName <> "") Then333 If (Dlgs. FileName = DBPath) Then334 Call MsgForm. ErrorMsg("Нельзя копировать файл сам в себя! ") 335 Else336 Call CopyFile(DBPath, Dlgs. FileName, False) 337 Call MsgForm. InfoMsg("Архивная копия БД создана. ") 338 End If339 Else340 Call MsgForm. ErrorMsg("Резервное копирование БД отменено! ") 341 End If342 CoolTimer. Enabled = True343End Sub344345Private Sub SaveDB_Click() 346 CoolTimer. Enabled = False347 Dlgs. FileName = ""348 Dlgs. ShowSave349 If (Dlgs. FileName <> "") Then350 DBPath = Dlgs. FileName351 Call FlushDB(DBCurIndex) 352 End If353 CoolTimer. Enabled = True354End Sub355356Private Sub Security_Click() 357 CoolTimer. Enabled = False358 If UserIsAdmin Then359 With PasswordForm360. SetPassText = DB(DBCurIndex). Password361 362 If (DB(DBCurIndex). Header. Flags And flCoded) Then363. CheckCoded = 1364 Else365. CheckCoded = 0366 End If367 If (DB(DBCurIndex). Header. Flags And flReadOnlyEnable) Then368. CheckNoRO = 1369 Else370. CheckNoRO = 0371 End If372. CaptionLabel = "Настройка защиты"373. TextLabel = "Вы можете изменить пароль и права доступа к данной БД. Наличие пароля предполагает ограниченный доступ. "374. Frame1. Visible = False375. Frame2. Visible = True376. Show vbModal377 If (. res) Then378 DB(DBCurIndex). Header. Flags = 0379 If (Trim(. SetPassText) <> "") Then380 DB(DBCurIndex). Password = Trim(. SetPassText) 381 DB(DBCurIndex). Header. Flags = flPasswordNeed382 Call MsgForm. InfoMsg("Был задан пароль! ") 383 End If384 DB(DBCurIndex). Header. Flags = DB(DBCurIndex). Header. Flags + (flCoded *. CheckCoded) + (flReadOnlyEnable *. CheckNoRO) 385 End If386 Unload PasswordForm387 End With388 Else389 Call ProtectedMsg390 End If391 CoolTimer. Enabled = True392End Sub393394Private Sub TabStrip_Click() 395 If (TabStrip. Tabs. Count = 0) Then Exit Sub396 If (DBCurIndex <> TabStrip. SelectedItem. Index - 1) Then397 DBCurIndex = TabStrip. SelectedItem. Index - 1398 Call ShowTable(DBCurIndex) 399End If400End Sub401402Private Sub TabStrip_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 403 If (Shift = vbCtrlMask) Then PopupMenu TSMenu404End Sub405406Private Sub TSClose_Click() 407 If (MsgForm. QuestMsg("Закрыть закладку? ") = resOk) Then408 TabIndex% = TabStrip. SelectedItem. Index409 TabStrip. Tabs. Remove (TabIndex) 410 Call DelTable(TabIndex - 1) 411 412 If (TabStrip. Tabs. Count = 0) Then413 DBChanged = False414 Call DisEnImage(2, 1) 415 Call DisEnImage(3, 1) 416 Call DisEnImage(4, 1) 417 Call ShowTable(-1) 418 Else419 TabStrip. SelectedItem = TabStrip. Tabs. Item(1) 420 End If421 End If422End SubФорма: TableForm. frm423Dim tmp As String424425Public Function AddColDlg(DBIndex%) As String426 tmp = ""427 With StCol428. Clear429 For i% = 1 To DB(DBIndex). Header. ColCount430. AddItem DB(DBIndex). Cols(i - 1). title431 Next432. ListIndex =. ListCount - 1433 End With434 ColType. ListIndex = 0435 Me. Show vbModal436 AddColDlg = tmp437 Unload Me438End Function439440Private Sub ColType_Click() 441 ' изменение допустимых длин442 If Visible Then443 Select Case ColType. ListIndex444 Case ccInteger: InitValue. MaxLength = 4445 Case ccString: InitValue. MaxLength = 255446 End Select447 End If448449' контроль ввода450 If Visible And (ColType. ListIndex = ccInteger) Then451 If (Not IsInteger(InitValue. Text)) Then InitValue. Text = "0"452 End If453End Sub454455Private Sub CreateBut_Click() 456 Call SoundClick457 s1$ = Trim(ColTitle. Text) 458 Do While (s1 = "") 459 s1 = Trim(InputForm. InputVal("Вы не ввели заголовок столбца. Повторите ввод. ")) 460 Loop461 tmp$ = s1 + ", "462 Dim ct463 Dim s2464 Select Case ColType. ListIndex465 Case ccInteger466 t$ = Trim(InitValue. Text) 467 If (Not IsInteger(t)) Then468 Call MsgForm. InfoMsg("Введённое значение не является целым числом. Преобразовано к '0'. ") 469 t = "0"470 End If471 tmp = tmp + " " + sI + ", " + t472 Case ccString473 t$ = Trim(InitValue. Text) 474 If (t = "") Then t = " "475 tmp = tmp + " " + sS + ", " + t476 End Select477 Dim pos%478 If (OnlyEndCheck. value = 1) Then479 pos = - 1480 Else481 pos = StCol. ListIndex482 If (Option2. value = True) Then pos = pos + 1483 End If484 tmp = tmp + ", " + CStr(pos) 485 Hide486End Sub487488Private Sub CancelBut_Click() 489 Call SoundClick490 Hide491End Sub492493Private Sub Form_Load() 494 Call ButEnabled(CreateImg, CreateBut, True) 495 Call ButEnabled(CancelImg, CancelBut, True) 496End SubФорма: TextEditForm. frm497Public res%498Dim dW%, dH%499500Private Sub Form_Activate() 501 With TextEdit502. SelStart = Len(. Text) 503 End With504End Sub505506Private Sub Form_Load() 507 res = 0508 dW = Width - TextEdit. Width509 dH = Height - TextEdit. Height510End Sub511512Private Sub Form_Resize() 513 Min% = Height - dH514 If (Min <= 1000) Then: Min = 1000: Height = dH + Min515 TextEdit. Height = Min516 517 Min = Width - dW518 If (Min <= 1000) Then: Min = 1000: Width = dW + Min519 TextEdit. Width = Min520End Sub521522Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib. Button) 523 On Error Resume Next524 Select Case Button. Key525 Case "ClearText"526 TextEdit. TextRTF = ""527 Case "SaveText"528 res = 1529 Hide530 Case "CopyText"531 Clipboard. SetText (TextEdit. SelText) 532 Case "PasteText"533 TextEdit. SelText = VB. Clipboard. GetText534 Case "CutText"535 Clipboard. SetText (TextEdit. SelText) 536 TextEdit. SelText = ""537 Case "DeleteText"538 TextEdit. SelText = ""539 Case "Properties"540 On Error GoTo checkerror541 FontDlg. ShowFont542 TextEdit. Font. Name = FontDlg. FontName543 TextEdit. Font. Bold = FontDlg. FontBold544 TextEdit. Font. Italic = FontDlg. FontItalic545 TextEdit. Font. Size = FontDlg. FontSize546 TextEdit. Font. Strikethrough = FontDlg. FontStrikethru547 TextEdit. Font. Underline = FontDlg. FontUnderline548 Exit Sub549checkerror: 550 MsgBox "error"551 End Select552End Sub553Форма: SelectForm. frm554Dim tmp%, tmps$555556Public Function SelectDlg(DBIndex%, ByVal title$, ByVal what$) As Integer557 Dim s$558 List1. Visible = True559 List2. Visible = False560 List1. Clear561 Select Case what562 Case sRow ' *******************...::: Select Row:::... ********************563 With MainForm. ListView. ListItems564 For i% = 1 To. Count565 s = CStr(i - 1) + ")" +. Item(i) 566 For j% = 1 To DB(DBIndex). Header. ColCount - 1567 s = s + " - " +. Item(i). SubItems(j) 568 Next j569 List1. AddItem s570 Next i571 End With572 573 Case sCol ' *******************...::: Select Col:::... ********************574 With MainForm. ListView. ColumnHeaders575 For i% = 1 To. Count576 List1. AddItem CStr(i - 1) + ")" +. Item(i) 577 Next i578 End With579 580 Case sTable ' *******************...::: Select Table:::... ********************581 For i% = 0 To (MainForm. TabStrip. Tabs. Count - 1) 582 List1. AddItem CStr(i) + ")" + MainForm. TabStrip. Tabs. Item(i + 1) 583 Next i584 End Select585586 If (List1. ListCount > 0) Then587 List1. ListIndex = 0588 Call ButEnabled(SelectImg, SelectBut, True) 589 Else590 Call ButEnabled(SelectImg, SelectBut, False) 591 End If592 Label1. Caption = title593 tmp = - 1594 Show vbModal595 SelectDlg = CStr(tmp) 596End Function597598Public Function MultiSelectDlg(DBIndex%, ByVal title$, ByVal what$) As String599 Dim s$600 List2. Visible = True601 List1. Visible = False602 List2. Clear603 CheckConfirm. Visible = False604 If (what = sRow) Then605 With MainForm. ListView. ListItems606 For i% = 1 To. Count607 s = CStr(i - 1) + ")" +. Item(i) 608 For j% = 1 To DB(DBIndex). Header. ColCount - 1609 s = s + " - " +. Item(i). SubItems(j) 610 Next j611 List2. AddItem s612 Next i613 End With614 Else615 With MainForm. ListView. ColumnHeaders616 For i% = 1 To. Count617 List2. AddItem CStr(i - 1) + ")" +. Item(i) 618 Next i619 End With620 End If621 Call ButEnabled(SelectImg, SelectBut, False) 622 Label1. Caption = title623 tmps = ""624 Show vbModal625 CheckConfirm. Visible = True626 MultiSelectDlg = tmps627End Function628629Private Sub Form_Activate() 630 Call ButEnabled(CancelImg, CancelBut, True) 631End Sub632633Private Sub SelectBut_Click() 634 If (SelectBut. Tag = 0) Then Exit Sub635 If (List1. Visible) Then636 tmp = List1. ListIndex637 Else638 For i = 0 To List2. ListCount - 1639 If List2. Selected(i) Then tmps = tmps + CStr(i) + ","640 Next i641 tmps = Strings. Left$(tmps, Len(tmps) - 1) 642 End If643 Hide644End Sub645646Private Sub CancelBut_Click() 647 Hide648End Sub649650Private Sub List1_Click() 651 Call ButEnabled(SelectImg, SelectBut, (List1. ListIndex <> - 1)) 652End Sub653654Private Sub List2_Click() 655 Call ButEnabled(SelectImg, SelectBut, (List2. SelCount = 2)) 656End SubФорма: QueryMasterForm. frm657Public QMFDBIndex%658659Sub AddStr(str$) 660 If (str <> "") Then661 QueryList. AddItem str662 Else663 Call MsgForm. ErrorMsg("Запрос отменен! ") 664 End If665End Sub666667Private Sub AddImage_Click() 668Call SoundClick669With QueryList670 Select Case QueryTypeCombo. ListIndex671 '******************* Добавление ***********************672 Case 0673 Select Case QuerySubtypeCombo. ListIndex674 Case 0 ' добавление столбца675 Call AddStr(Generate_Add(sCol)) 676 Case 1 ' добавление записи677 Call AddStr(Generate_Add(sRow)) 678 End Select679 '******************* Удаление ***********************680 Case 1681 Select Case QuerySubtypeCombo. ListIndex682 Case 0 ' удаление столбца683 Call AddStr(Generate_Del(sCol)) 684 Case 1 ' удаление записи685 Call AddStr(Generate_Del(sRow)) 686 End Select687 688 '******************* Сортировка ***********************689 Case 2690 Select Case QuerySubtypeCombo. ListIndex691 Case 0 ' сортировка по алфавиту692 Call AddStr(Generate_Sort(sAZ)) 693 Case 1 ' сортировка против алфавита694 Call AddStr(Generate_Sort(sZA)) 695 End Select696 697 '******************* Вывод ***********************698 Case 3699 Select Case QuerySubtypeCombo. ListIndex700 Case 0 ' вывод на равенство записи701 Call AddStr(Generate_Out(sEqual)) 702 Case 1 ' вывод больше записи703 Call AddStr(Generate_Out(sAbove)) 704 Case 2 ' вывод меньше записи705 Call AddStr(Generate_Out(sBelow)) 706 Case 3 ' вывод на равенство кол-ву707 Call AddStr(Generate_Out(sCountEqual)) 708 Case 4 ' вывод больше кол-ва709 Call AddStr(Generate_Out(sCountAbove)) 710 Case 5 ' вывод меньше кол-ва711 Call AddStr(Generate_Out(sCountBelow)) 712 End Select713 714 '******************* Обмен ***********************715 Case 4716 Select Case QuerySubtypeCombo. ListIndex717 Case 0 ' обмен столбцов718 Call AddStr(Generate_Swap(sCol)) 719 Case 1 ' обмен строк720 Call AddStr(Generate_Swap(sRow)) 721 End Select722 723 '******************* Смена ***********************724 Case 5725 Select Case QuerySubtypeCombo. ListIndex726 Case 0 ' смена типа поля727 Call AddStr(Generate_Change(sType)) 728 Case 1 ' смена названия поля729 Call AddStr(Generate_Change(sName)) 730 End Select731 End Select732 733End With734End Sub735736Private Sub CancelBut_Click() 737 Call SoundClick738 If (QueryList. ListCount > 0) Then739 If (MsgForm. QuestMsg("Список запросов не пуст. Выйти? ") = resOk) Then Unload Me740 Else741 Unload Me742 End If743End Sub744745' замена запроса746Private Sub ChangeImage_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 747 If (Trim(Text1) <> "") Then748 Call SoundClick749 With QueryList750 If (. ListIndex = - 1) Or (Shift And vbShiftMask <> 0) Then751. AddItem Text1752 Else753. List(. ListIndex) = Text1754 End If755 End With756 End If757 Text1 = ""758 Text1. SetFocus759End Sub760761' очистка запросов762Private Sub ClearImage_Click() 763 If (QueryList. ListCount > 0) Then764 Call SoundClick765 If (MsgForm. QuestMsg("Очистить список запросов? ") = resOk) Then766 QueryList. Clear767 Text1 = ""768 Text1. SetFocus769 End If770 End If771End Sub772773' удаление запроса774Private Sub DelImage_Click() 775 If (QueryList. ListIndex >= 0) Then776 Call SoundClick777 If (MsgForm. QuestMsg("Удалить выбранный запрос из списка? ") = resOk) Then778 QueryList. RemoveItem QueryList. ListIndex779 Text1 = ""780 Text1. SetFocus781 End If782 End If783End Sub784785Private Sub Form_Load() 786 QueryTypeCombo. ListIndex = 0787 Call ButEnabled(RunImg, RunBut, True) 788 Call ButEnabled(CancelImg, CancelBut, True) 789 TopImg. Picture = MainForm. TopImageList. ListImages(1). Picture790End Sub791792Private Sub QueryList_DblClick() 793 With QueryList794 If (. ListIndex <> - 1) Then795 Text1 =. List(. ListIndex) 796 Text1. SetFocus797 End If798 End With799End Sub800801Private Sub QueryTypeCombo_Click() 802 With QuerySubtypeCombo803. Clear804 Select Case QueryTypeCombo. ListIndex805 Case 0806. AddItem "Поля"807. AddItem "Записи"808 Case 1809. AddItem "Поля"810. AddItem "Записи"811 Case 2812. AddItem "По алфавиту"813. AddItem "Против алфавита"814 Case 3815. AddItem "Равно записи"816. AddItem "Больше записи"817. AddItem "Меньше записи"818. AddItem "Равно кол-ву копий"819. AddItem "Больше кол-ва копий"820. AddItem "Меньше кол-ва копий"821 Case 4822. AddItem "Полей"823. AddItem "Записей"824 Case 5825. AddItem "Типа поля"826. AddItem "Названия поля"827 End Select828. ListIndex = 0829 End With830End Sub831832Private Sub RunBut_Click() 833 If (QueryList. ListCount > 0) Then834 Call SoundClick835 For i% = 0 To QueryList. ListCount - 1836 Call RunQuery(QMFDBIndex, QueryList. List(i)) 837 Next i838 With MainForm839. TabStrip. SelectedItem =. TabStrip. Tabs(QMFDBIndex + 1) 840 Call ShowTable(QMFDBIndex) 841 End With842 QueryList. Clear843 Call MsgForm. InfoMsg("Запросы выполнены. ") 844 End If845End Sub846847Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) 848 If (KeyCode = 13) Then Call ChangeImage_MouseDown(vbLeftButton, Shift, 1, 1) 849End SubФорма: EditRecordForm. frm850Public ERFDBIndex%851Dim RowIndexSave%852Dim protect As Boolean853Dim Arr() 854855Public Sub LoadData(RowIndex%) 856 RowIndexSave = RowIndex857 With DB(ERFDBIndex). Header858 ReDim Arr(. ColCount, 1) 859 For i% = 0 To. ColCount - 1860 Arr(i, 0) = DB(ERFDBIndex). Rows(RowIndex). Fields(i) 861 Arr(i, 1) = DB(ERFDBIndex). Cols(i). Class862 Next i863 End With864End Sub865866Private Sub CellList_Click() 867 i% = CellList. ListIndex868 Select Case Arr(i, 1) 869 Case ccInteger870 Label6. Caption = "Поле числового типа"871 Call ButEnabled(EditorImg, EditorBut, False) 872 Case ccString873 Label6. Caption = "Поле строкового типа"874 Call ButEnabled(EditorImg, EditorBut, True) 875 End Select876 With Text1877. Text = CStr(Arr(i, 0)) 878. SelStart = 0879. SelLength = Len(. Text) 880 End With881End Sub882883Public Sub OverloadList() 884 CellList. Clear885 For i% = 0 To DB(ERFDBIndex). Header. ColCount - 1886 CellList. AddItem CStr(Arr(i, 0)) 887 Next i888 CellList. ListIndex = 0889End Sub890891Private Sub Form_Load() 892 protect = False893 Call ButEnabled(ReturnImg, ReturnBut, True) 894 Call ButEnabled(EditorImg, EditorBut, False) 895 Call ButEnabled(FlipImg, FlipBut, True) 896 Call ButEnabled(SelectImg, SelectBut, True) 897 Call ButEnabled(CancelImg, CancelBut, True) 898 TopImg. Picture = MainForm. TopImageList. ListImages(1). Picture899 900' If (Not protect) Then901' Call OverloadList902' Else903' protect = False904' End If905 906End Sub907908Private Sub ReturnBut_Click() 909 Call SoundClick910 If (MsgForm. QuestMsg("Восстановить поля из БД? ") = resOk) Then911 Call LoadData(RowIndexSave) 912 Call OverloadList913 Call MsgForm. InfoMsg("Поля были восстановлены! ") 914 End If915End Sub916917Private Sub EditorBut_Click() 918 If (EditorBut. Tag = 0) Then Exit Sub919 Call SoundClick920 i% = CellList. ListIndex921 If (Arr(i, 1) = ccInteger) Then922 Call MsgForm. InfoMsg("Для редактирования чисел редактор не исспользуется. ") 923 Exit Sub924 End If925 If IsDate(Text1. Text) And (MonthForm. Check1. value = 0) Then926 s$ = Text1. Text927 p% = InStr(1, s, ". ") 928 MonthForm. MonthView1. Day = CInt(Left(s, p - 1)) 929 s = Mid(s, p + 1) 930 p% = InStr(1, s, ". ") 931 MonthForm. MonthView1. Month = CInt(Left(s, p - 1)) 932 s = Mid(s, p + 1) 933 MonthForm. MonthView1. Year = CInt(s) 934935 MonthForm. Show vbModal936 Select Case MonthForm. res937 Case 1938 Text1. Text = CStr(MonthForm. MonthView1. Day) + ". " + CStr(MonthForm. MonthView1. Month) + ". " + CStr(MonthForm. MonthView1. Year) 939 Case - 1940 GoTo text_941 End Select942 Else943text_: 944 With TextEditForm945. TextEdit. Text = Text1. Text946 protect = True947. Show vbModal948 If (. res = 1) Then Text1. Text =. TextEdit. Text949 Unload TextEditForm950 End With951 End If952End Sub953954Private Sub SelectBut_Click() 955Call SoundClick956If UserIsAdmin Then957 If (MsgForm. QuestMsg("Сохранить поля в БД? ") = resOk) Then958 With DB(ERFDBIndex) 959 Dim tmparr() 960 ReDim tmparr(. Header. ColCount) 961 For i% = 0 To. Header. ColCount - 1962 tmparr(i) = Arr(i, 0) 963 Next i964 If (Not FindRow(ERFDBIndex, tmparr)) Then965 For i% = 0 To. Header. ColCount - 1966. Rows(RowIndexSave). Fields(i) = Arr(i, 0) 967 Next i968 DBChanged = True969 Call MsgForm. InfoMsg("Поля были сохранены в БД! ") 970 Call ShowTable(ERFDBIndex) 971 Unload Me972 Else973 Call MsgForm. ErrorMsg("Изменённое поле перекрывает уже существующее! Измените данные. ") 974 End If975 End With976 End If977Else978 Call ProtectedMsg979End If980End Sub981982Private Sub CancelBut_Click() 983 Call SoundClick984 Unload Me985End Sub986987' Посимвольное сравнение str с '2147483647' - максимальным значением Long988Function isVeryLong(str$) As Boolean989 If (Left(str, 1) = "-") Then str = Mid(str, 2) 990 For i% = 1 To (10 - Len(str)) 991 str = "0" + str992 Next i993 994 maxval$ = "2147483647"995 For i% = 1 To 10996 ch1$ = Mid(maxval, i, 1) 997 ch2$ = Mid(str, i, 1) 998 If (Asc(ch2) > Asc(ch1)) Then999 isVeryLong = True1000 GoTo exit_1001 ElseIf (ch2 <> ch1) Then1002 isVeryLong = False1003 GoTo exit_1004 End If1005 Next i1006 isVeryLong = False1007exit_: 1008End Function10091010Private Sub FlipBut_Click() 1011Call SoundClick1012If UserIsAdmin Then1013 tmp = Null1014 i% = CellList. ListIndex1015 mln% = 101016 If (Left(Text1. Text, 1) = "-") Then mln = mln + 11017 If (Arr(i, 1) = ccInteger) Then1018 If (Len(Trim(Text1. Text)) > mln) Or (isVeryLong(Trim(Text1. Text))) Then1019 Call MsgForm. ErrorMsg("Числовое значение превышает разрядную сетку! ") 1020 With Text11021. SelStart = 01022. SelLength = Len(. Text) 1023 End With1024 GoTo exit_1025 End If1026 1027 If IsInteger(Trim(Text1. Text)) Then1028 tmp = CLng(Text1. Text) 1029 Else1030 Call MsgForm. ErrorMsg("Значение не является целым числом! ") 1031 With Text11032. SelStart = 01033. SelLength = Len(. Text) 1034 End With1035 End If1036 Else1037 If (Trim(Text1. Text) = "") Then1038 If (MsgForm. QuestMsg("Строка пуста. Продолжить? ") = resOk) Then1039 tmp = Text1. Text1040 GoTo exit_1041 Else1042 With Text11043. SelStart = 01044. SelLength = Len(. Text) 1045 End With1046 End If1047 Else1048 tmp = Text1. Text1049 End If1050 End If1051 1052 ' Введёное значение прошло контроль1053 If (Not IsNull(tmp)) Then1054 Select Case Arr(i, 1) 1055 Case ccInteger: Arr(i, 0) = CLng(tmp) 1056 Case ccString: Arr(i, 0) = CStr(tmp) 1057 End Select1058 curpos% = CellList. ListIndex1059 Call OverloadList1060 CellList. ListIndex = curpos1061 End If1062exit_: 1063Else1064 Call ProtectedMsg1065End If1066End Sub10671068Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) 1069 If (KeyCode = 13) Then FlipBut_Click1070End SubФорма: MsgForm. frm1071Dim res As Byte10721073Public Function ErrorMsg(str$) As Integer1074 Caption = "Ошибка"1075 Text = str1076 1077 YesFrame. Visible = True1078 NoFrame. Visible = False1079 CancelFrame. Visible = False10801081 InfoImage. Visible = False1082 ErrImage. Visible = True1083 QuestImage. Visible = False10841085 YesFrame. Move 24001086 res = resBad1087 Call sndPlaySound("Data\Error. wav", SND_ASYNC + SND_FILENAME + SND_LOOP + SND_APPLICATION) 1088 Show vbModal1089 ErrorMsg = res1090 Unload Me1091End Function10921093Public Function InfoMsg(str$) As Integer1094 Caption = "Информация"1095 Text = str1096 1097 YesFrame. Visible = True1098 NoFrame. Visible = False1099 CancelFrame. Visible = False11001101 InfoImage. Visible = True1102 ErrImage. Visible = False1103 QuestImage. Visible = False1104 1105 YesFrame. Move 240011061107 res = 01108 Call sndPlaySound("Data\Info. wav", SND_ASYNC + SND_FILENAME + SND_LOOP + SND_APPLICATION) 1109 Show vbModal1110 InfoMsg = res1111 Unload Me1112End Function11131114Public Function QuestMsg(str$, Optional showcancel As Boolean = False) As Integer1115 Caption = "Вопрос"1116 Text = str1117 1118 If showcancel Then1119 YesFrame. Visible = True1120 NoFrame. Visible = True1121 CancelFrame. Visible = True1122 1123 YesFrame. Move 3601124 NoFrame. Move 43801125 CancelFrame. Move 24001126 1127 Else1128 YesFrame. Visible = True1129 NoFrame. Visible = True1130 CancelFrame. Visible = False1131 1132 YesFrame. Move 9001133 NoFrame. Move 38401134 End If11351136 InfoImage. Visible = False1137 ErrImage. Visible = False1138 QuestImage. Visible = True11391140 res = 01141 Call sndPlaySound("Data\Quest. wav", SND_ASYNC + SND_FILENAME + SND_LOOP + SND_APPLICATION) 1142 Show vbModal1143 QuestMsg = res1144 Unload Me1145End Function11461147Private Sub CancelBut_Click() 1148 res = resCancel1149 Call SoundClick1150 Hide1151End Sub11521153Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 1154 Select Case KeyCode1155 Case 131156 Call YesBut_Click1157 Case 271158 Call NoBut_Click1159 Case 81160 If (CancelFrame. Visible = True) Then Call CancelBut_Click1161 End Select1162End Sub11631164Private Sub Form_Load() 1165 Call ButEnabled(YesImg, YesBut, True) 1166 Call ButEnabled(CancelImg, CancelBut, True) 1167 Call ButEnabled(NoImg, NoBut, True) 1168End Sub11691170Private Sub NoBut_Click() 1171 res = resNo1172 Call SoundClick1173 Hide1174End Sub11751176Private Sub YesBut_Click() 1177 res = resOk1178 Call SoundClick1179 Hide1180End Sub1181Форма: DiagMasterForm. frm1182Dim DiagData() 11831184Private Sub DiagTypeCombo_Click() 1185 DiagTypeImage. Picture = DiagTypeImgs. ListImages(DiagTypeCombo. ListIndex + 1). Picture1186 Select Case DiagTypeCombo. ListIndex1187 Case 0, 2: Frame2. Visible = False1188 Case 1, 3: Frame2. Visible = True1189 End Select1190End Sub11911192Private Sub Enabled3DCheck_Click() 1193 DimImg. Picture = DiagTypeImgs. ListImages(5 + Enabled3DCheck. value). Picture1194End Sub11951196Private Sub Form_Load() 1197 Call ButEnabled(OkImg, OkBut, False) 1198 Call ButEnabled(CancelImg, CancelBut, True) 1199 TopImg. Picture = MainForm. TopImageList. ListImages(1). Picture1200 DiagTypeCombo. ListIndex = 01201 DimImg. Picture = DiagTypeImgs. ListImages(5). Picture1202 1203 TableIndexCombo. Clear1204 SelectColList. Clear1205 For i% = 1 To MainForm. TabStrip. Tabs. Count1206 TableIndexCombo. AddItem MainForm. TabStrip. Tabs(i). Caption1207 Next i1208 TableIndexCombo. ListIndex = 01209End Sub12101211' по строке "{x, YYY} ZZZ" возвращает номер таблицы (x) 1212Sub GetTableIndex(ByVal str As String, TI As Integer) 1213 s$ = Trim$(Mid$(str, 2, InStr(1, str, ",") - 2)) 1214 TI = CInt(s) 1215End Sub12161217' по строке "{x, YYY} ZZZ" и номеру таблицы возвращает номер поля с заголовком ZZZ1218Sub GetColIndex(ByVal str As String, ByVal TI As Integer, CI As Integer) 1219 s$ = Trim$(Mid$(str, InStr(1, str, "}") + 1)) 1220 For i% = 0 To DB(TI). Header. ColCount - 11221 If (s = Trim(DB(TI). Cols(i). title)) Then1222 CI = i1223 Exit Sub1224 End If1225 Next i1226 CI = - 1 ' событие невозможное но вероятное1227End Sub12281229Function GettingDiagData(OnlyOneCol As Boolean) As Boolean1230 GettingDiagData = False12311232 Dim TI As Integer, CI As Integer1233 1234 Select Case OnlyOneCol1235 Case True ' ************************************************************************1236 Call GetTableIndex(SelectColList. List(0), TI) 1237 Call GetColIndex(SelectColList. List(0), TI, CI) 1238 ' зная номер таблицы и номер поля данных нужно проверить тип поля1239 If (DB(TI). Cols(CI). Class <> ccInteger) Then1240 Call MsgForm. ErrorMsg("Нельзя строить диаграмму по нечисленным данным! ") 1241 Exit Function1242 End If1243 ' заполнение массива данных1244 ReDim DiagData(2 * DB(TI). Header. RowCount) 1245 For i% = 0 To DB(TI). Header. RowCount - 11246 DiagData(2 * i) = DB(TI). Rows(i). Fields(CI) 1247 DiagData(2 * i + 1) = DiagData(2 * i) 1248 Next i1249 GettingDiagData = True1250 1251 Case False ' ************************************************************************1252 ReDim DiagData(2 * SelectColList. ListCount) 1253 For R% = 0 To SelectColList. ListCount - 11254 Call GetTableIndex(SelectColList. List(R), TI) 1255 Call GetColIndex(SelectColList. List(R), TI, CI) 1256 ' зная номер таблицы и номер поля данных нужно проверить тип поля1257 If (DB(TI). Cols(CI). Class <> ccInteger) Then1258 Call MsgForm. ErrorMsg("Нельзя строить диаграмму по нечисленным данным! ") 1259 Exit Function1260 End If1261 Dim Summary As Integer1262 Summary = 01263 For i% = 0 To DB(TI). Header. RowCount - 11264 Summary = Summary + DB(TI). Rows(i). Fields(CI) 1265 Next i1266 ' заполнение массива данных1267 DiagData(2 * R) = Summary1268 DiagData(2 * R + 1) = MainForm. TabStrip. Tabs(TI + 1). Caption + ". " + DB(TI). Cols(CI). title1269 Next R1270 GettingDiagData = True1271 End Select1272 1273End Function12741275Private Sub OkBut_Click() 1276 If (OkBut. Tag = 0) Then Exit Sub1277 Call SoundClick1278 1279 If GettingDiagData(SelectColList. ListCount = 1) Then1280 Load DiagResForm1281 Call DiagResForm. InitDiagData(DiagData, DiagTypeCombo. ListIndex, (Enabled3DCheck. value = 1)) 1282 DiagResForm. Show vbModal1283 End If1284End Sub12851286Private Sub CancelBut_Click() 1287 Call SoundClick1288 Unload Me1289End Sub12901291Private Sub TableColList_DblClick() 1292 i% = TableColList. ListIndex1293 s$ = "{ " + CStr(TableIndexCombo. ListIndex) + ", " + TableIndexCombo. Text + " } " + TableColList. List(i) 1294 For j% = 0 To SelectColList. ListCount - 11295 If (SelectColList. List(j) = s) Then Exit Sub1296 Next j1297 Call ButEnabled(OkImg, OkBut, True) 1298 SelectColList. AddItem s1299End Sub13001301Private Sub SelectColList_DblClick() 1302 If (SelectColList. ListIndex > - 1) Then SelectColList. RemoveItem SelectColList. ListIndex1303 Call ButEnabled(OkImg, OkBut, (SelectColList. ListCount > 0)) 1304End Sub13051306Private Sub TableIndexCombo_Click() 1307 DBI% = TableIndexCombo. ListIndex1308 TableColList. Clear1309 For i% = 0 To DB(DBI). Header. ColCount - 11310 TableColList. AddItem DB(DBI). Cols(i). title1311 Next i1312 If (TableColList. ListCount > 0) Then TableColList. ListIndex = 01313End SubФорма: PasswordForm. frm1314Public res As Boolean13151316Private Sub Form_Activate() 1317 res = False1318 If Frame1. Visible Then1319 PassText. SetFocus1320 Else1321 SetPassText. SetFocus1322 End If1323End Sub13241325Private Sub Form_Load() 1326 Call ButEnabled(OkImg, OkBut, True) 1327 Call ButEnabled(CancelImg, CancelBut, True) 1328 TopImg. Picture = MainForm. TopImageList. ListImages(1). Picture1329End Sub13301331Private Sub OkBut_Click() 1332 res = True1333 Call SoundClick1334 Hide1335End Sub13361337Private Sub CancelBut_Click() 1338 Call SoundClick1339 Hide1340End Sub13411342Private Sub PassText_KeyDown(KeyCode As Integer, Shift As Integer) 1343 If (KeyCode = 13) Then Call OkBut_Click1344End Sub13451346Private Sub SetPassText_KeyDown(KeyCode As Integer, Shift As Integer) 1347 If (KeyCode = 13) Then Call OkBut_Click1348End SubФорма: AboutForm. frm1349Private Sub Form_Load() 1350 Call MInit1351 Call ButEnabled(OkImg, OkBut, True) 1352 Label6. Caption = "v. " + CStr(App. Major) + ". " + CStr(App. Minor) + ". " + CStr(App. Revision) 1353End Sub13541355Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 1356 Call MDown(x, y) 1357End Sub13581359Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 1360 Call MMove(hwnd, x, y) 1361End Sub13621363Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) 1364 Call MUp1365End Sub13661367Private Sub Image2_Click() 1368 Call ShellExecute(0, "", "mailto: xerx@nightmail. ru", "", "", 1) 1369End Sub13701371Private Sub NoViewLabel_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 1372 Call MDown(x, y) 1373End Sub13741375Private Sub NoViewLabel_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 1376 Call MMove(hwnd, x, y) 1377End Sub13781379Private Sub NoViewLabel_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) 1380 Call MUp1381End Sub13821383Private Sub OkBut_Click() 1384 Unload Me1385End SubФорма: DiagResForm. frm1386Dim dW%, dH%, dX%, dH2%1387Dim DiagData() As TDiagElem1388Dim DrawingMode As Byte, Use3D As Boolean13891390' константы для вывода куска более 270 градусов (выводимая часть) 1391Const mode270begin As Byte = 11392Const mode270end As Byte = 213931394' данные для процедур рисования1395 Const Pi_180 As Double = 1.74532925199433E-021396 Const Pi_2 As Double = 1.57079632679491397 Const NearZero As Double = 1E-4513981399 Dim Xc%, Yc% ' центр диаграммы1400 Dim Radius# ' радиус кусков1401 Dim InRad# ' радиус разноса кусков1402 Dim OneGradus# ' единиц в одном градусе1403 Dim ChartHeight% ' высота графика1404 Dim ChartWidth% ' ширина графика1405 Dim ChartTop% ' верх графика1406 Dim ChartDown% ' низ графика1407 Dim ItemCount% ' кол-во элементов1408 Dim Max%, Sum% ' максимальное значение и сумма всех значений1409 Dim OldGrad# ' предыдущий угол1410 Dim LineCount As Long ' количество полос заливки1411 Dim d3D% ' смещение в 3D, в пикселях1412 Dim dWidth As Single ' ширина одного столбца1413 Dim dHeight As Single ' высота 'единицы высоты'1414 Dim StartFillColor As Long1415 Dim EndFillColor As Long1416 Dim LineColor As Long1417 Dim LineWidth As Byte1418 Dim PointRadius%1419 Dim Ellipce#1420 Dim UseColorFill As Boolean1421 Dim UseCircleLegend As Boolean1422 Dim UseLineLeftValues As Boolean14231424Public Sub InitDiagData(Data(), ByVal Mode As Byte, ByVal May3D As Boolean) 1425 ReDim DiagData(UBound(Data) \ 2 - 1) 1426 d# = 255 / (UBound(Data) \ 2 - 1) 1427 For i% = 0 To (UBound(Data) \ 2 - 1) 1428 DiagData(i). Val = Abs(Data(2 * i)) 1429 DiagData(i). Text = Data(2 * i + 1) 1430 DiagData(i). Color = RGB(i * d, i * d, i * d) 1431 Next i1432 DrawingMode = Mode1433 Use3D = May3D1434 1435 Label2. Visible = (DrawingMode <> 3) 1436 Label3. Visible = Label2. Visible1437 VScroll. Enabled = Not Label2. Visible1438End Sub14391440Public Sub ColorFill(PB As PictureBox, ByVal StColor As Long, ByVal EnColor As Long) 1441 Dim dR#, dG#, DB#, dC1 As Long, dC2 As Long1442 Dim R#, G#, B#1443 Dim intLoop As Long1444 1445 PB. Line (0, 0) - (PB. Width, PB. Height), EnColor, BF14461447 ' get Red1448 dC1 = StColor - (StColor \ &H100) * &H1001449 R = dC11450 dC2 = EnColor - (EnColor \ &H100) * &H1001451 dR = (dC1 - dC2) / LineCount1452 1453 ' get Green1454 dC1 = (StColor - (StColor \ &H10000) * &H10000 - dC1) \ &H1001455 G = dC11456 dC2 = (EnColor - (EnColor \ &H10000) * &H10000 - dC2) \ &H1001457 dG = (dC1 - dC2) / LineCount1458 1459 ' get Blue1460 dC1 = StColor \ &H100001461 B = dC11462 dC2 = EnColor \ &H100001463 DB = (dC1 - dC2) / LineCount14641465 With PB1466. DrawStyle = 11467. DrawMode = vbCopyPen1468. ScaleMode = vbPixels1469. DrawWidth = 21470. ScaleHeight = LineCount1471 For intLoop = 0 To LineCount - 11472 PB. Line (0, intLoop) - (PB. Width, intLoop - 1), RGB(R, G, B), BF1473 R = R - dR: If (R < 0) Then R = 255: If (R > 255) Then R = 01474 G = G - dG: If (G < 0) Then G = 255: If (G > 255) Then G = 01475 B = B - DB: If (B < 0) Then B = 255: If (B > 255) Then B = 01476 Next intLoop1477. ScaleMode = vbTwips1478. DrawWidth = 11479 End With1480End Sub14811482Sub OutOneElem(ElemIndex As Integer, StAn#, EnAn#, Optional Mode270Mode As Byte = 0) 1483 ' центральный угол1484 angle# = (StAn + (EnAn - StAn) / 2) * Pi_1801485 1486 ' динамическая глубина1487 d3D_% = Round(d3D / 100 * (100 - Round(100 * Ellipce))) 1488 If (d3D_ = 0) Then d3D_ = 11489 ' динамическое смещение центров кусков1490 r_# = Ellipce * d3D / 1001491 1492 X1# = Xc + Radius * Cos(angle) 1493 Y1# = Yc - Radius * Sin(angle) 1494 1495 x# = Xc + InRad / Radius * (X1 - Xc) 1496 y# = Yc + InRad / Radius * (Y1 - Yc) * r_1497 1498 If (Not Use3D) Then1499 Chart. FillStyle = 01500 Chart. FillColor = DiagData(ElemIndex). Color1501 If (StAn <> 0) Then1502 Chart. Circle (x, y), Radius, LineColor, - StAn * Pi_180, - EnAn * Pi_180, Ellipce1503 Else1504 Chart. Circle (x, y), Radius, LineColor, - 1E-45, - EnAn * Pi_180, Ellipce1505 End If1506 Chart. FillStyle = 11507 1508 ' вывод значений1509 R# = 1.3. * Radius1510 X2# = x + R * Cos(angle) 1511 Y2# = y - Ellipce * R * Sin(angle) 1512 1513 x0# = x + Radius * Cos(angle) 1514 y0# = y - Ellipce * Radius * Sin(angle) 1515 1516 str_1$ = CStr(DiagData(ElemIndex). Text) 1517 d1# = Chart. TextWidth(str_1) 1518 str_2$ = CStr(DiagData(ElemIndex). Val) 1519 d2# = Chart. TextWidth(str_2) 1520 1521 If UseCircleLegend Then1522 Chart. DrawStyle = 41523 Chart. Line (x0, y0) - (X2, Y2), LineColor1524 Chart. DrawStyle = 01525 1526 If Not ((angle > Pi_2) And (angle <= 3 * Pi_2)) Then1527 Chart. Line (X2, Y2) - (X2 + d1, Y2), LineColor1528 Chart. CurrentX = X21529 Chart. CurrentY = Y21530 Chart. Print CStr(str_1) 1531 1532 Chart. CurrentX = X21533 Chart. CurrentY = Y2 - Chart. TextHeight(str_2) 1534 Chart. Print CStr(str_2) 1535 Else1536 Chart. Line (X2, Y2) - (X2 - d1, Y2), LineColor1537 Chart. CurrentX = X2 - d11538 Chart. CurrentY = Y21539 Chart. Print CStr(str_1) 1540 1541 Chart. CurrentX = X2 - d11542 Chart. CurrentY = Y2 - Chart. TextHeight(str_2) 1543 Chart. Print CStr(str_2) 1544 End If1545 End If1546 1547 Else1548 Chart. FillStyle = 01549 Chart. FillColor = DiagData(ElemIndex). Color1550 1551 Select Case Mode270Mode1552 Case 01553 sa# = StAn1554 If (sa = 0) Then sa = 1E-45 Else sa = sa * Pi_1801555 For i% = d3D_ To 1 Step - 11556 If (i = d3D_) Then1557 Chart. DrawStyle = vbSolid1558 Chart. Circle (x, Screen. TwipsPerPixelY * (i - 1) + y), Radius, LineColor, - sa, - EnAn * Pi_180, Ellipce1559 Chart. DrawStyle = vbInvisible1560 ElseIf (i = 1) Then1561 Chart. DrawStyle = vbSolid1562 Chart. Circle (x, y), Radius, LineColor, - sa, - EnAn * Pi_180, Ellipce1563 Chart. DrawStyle = vbInvisible1564 Else1565 Chart. Circle (x, Screen. TwipsPerPixelY * (i - 1) + y), Radius, LineColor, - sa, - EnAn * Pi_180, Ellipce1566 End If1567 Next i1568 1569 Case mode270begin1570 For i% = d3D_ To 1 Step - 11571 If (i = d3D_) Then1572 Chart. DrawStyle = vbSolid1573 Chart. Circle (x, Screen. TwipsPerPixelY * (i - 1) + y), Radius, LineColor, - StAn * Pi_180, - EnAn * Pi_180, Ellipce1574 Chart. DrawStyle = vbInvisible1575 Else1576 Chart. Circle (x, Screen. TwipsPerPixelY * (i - 1) + y), Radius, LineColor, - StAn * Pi_180, - angle, Ellipce1577 End If1578 Next i1579 1580 Case mode270end1581 For i% = d3D_ To 1 Step - 11582 If (i = 1) Then1583 Chart. DrawStyle = vbSolid1584 Chart. Circle (x, y), Radius, LineColor, - StAn * Pi_180, - EnAn * Pi_180, Ellipce1585 Else1586 Chart. DrawStyle = vbInvisible1587 Chart. Circle (x, Screen. TwipsPerPixelY * (i - 1) + y), Radius, LineColor, - angle, - EnAn * Pi_180, Ellipce1588 End If1589 Next i1590 End Select1591 1592 Chart. FillStyle = 11593 Chart. DrawStyle = vbSolid1594 1595 ' вывод значений1596 R# = 1.3. * Radius1597 X2# = x + R * Cos(angle) 1598 Y2# = y - Ellipce * R * Sin(angle) 1599 1600 x0# = x + Radius * Cos(angle) 1601 y0# = y - Ellipce * Radius * Sin(angle) 1602 1603 str_1$ = CStr(DiagData(ElemIndex). Text) 1604 d1# = Chart. TextWidth(str_1) 1605 str_2$ = CStr(DiagData(ElemIndex). Val) 1606 d2# = Chart. TextWidth(str_2) 1607 1608 If UseCircleLegend Then1609 Chart. DrawStyle = 41610 Chart. Line (x0, y0) - (X2, Y2), LineColor1611 Chart. DrawStyle = 01612 1613 If Not ((angle > Pi_2) And (angle <= 3 * Pi_2)) Then1614 Chart. Line (X2, Y2) - (X2 + d1, Y2), LineColor1615 Chart. CurrentX = X21616 Chart. CurrentY = Y21617 Chart. Print CStr(str_1) 1618 1619 Chart. CurrentX = X21620 Chart. CurrentY = Y2 - Chart. TextHeight(str_2) 1621 Chart. Print CStr(str_2) 1622 Else1623 Chart. Line (X2, Y2) - (X2 - d1, Y2), LineColor1624 Chart. CurrentX = X2 - d11625 Chart. CurrentY = Y21626 Chart. Print CStr(str_1) 1627 1628 Chart. CurrentX = X2 - d11629 Chart. CurrentY = Y2 - Chart. TextHeight(str_2) 1630 Chart. Print CStr(str_2) 1631 End If1632 End If1633 1634 ' а теперь вывод боковых линий1635 Chart. DrawStyle = 016361637 ' начальный угол1638 If Not ((StAn > 90) And (StAn < 180)) Then1639 sa# = StAn * Pi_1801640 x0 = x + Radius * Cos(sa) 1641 y0 = y - Radius * Ellipce * Sin(sa) 16421643 If (Mode270Mode <> mode270end) Then1644 Chart. Line (x0, y0) - (x0, y0 + d3D_ * Screen. TwipsPerPixelY), LineColor1645 End If1646 End If16471648 ' конечный угол1649 If Not ((EnAn > 0) And (EnAn < 90)) Then1650 x0 = x + Radius * Cos(EnAn * Pi_180) 1651 y0 = y - Radius * Ellipce * Sin(EnAn * Pi_180) 16521653 Chart. Line (x0, y0) - (x0, y0 + d3D_ * Screen. TwipsPerPixelY), LineColor1654 End If1655 1656 ' центр1657 If Not ((EnAn >= 270) And (StAn <= 270)) Then1658 Chart. Line (x, y) - (x, y + d3D_ * Screen. TwipsPerPixelY), LineColor1659 End If1660 1661 ' левый край1662 If ((StAn <= 180) And (EnAn >= 180)) Then1663 Chart. Line (x - Radius, y) - (x - Radius, y + d3D_ * Screen. TwipsPerPixelY), LineColor1664 End If1665 1666 End If1667 1668 OldGrad = Grad1669End Sub167016711672' рисование круговой диаграммы1673Sub DrawCircle() 1674 Dim Mode270 As Boolean1675 Dim Item270%16761677 ItemCount = UBound(DiagData) + 11678 1679 With Chart1680 Max = - 11681 Sum = 01682 For i% = 1 To ItemCount1683 If (DiagData(i - 1). Val > Max) Then Max = DiagData(i - 1). Val1684 Sum = Sum + DiagData(i - 1). Val1685 Next i1686 1687 Mode270 = (Max > 3 / 4 * Sum) 1688 1689 OneGradus = 360 / Sum1690 OldGrad = 0.000011691 1692 Xc = Chart. Width \ 21693 Yc = Chart. Height \ 21694 1695 Dim pos90%, pos270% ' индексы ключевых элементов1696 pos90 = - 11697 pos270 = - 11698 OldGrad = 01699 1700 Dim Angles() As Double1701 ReDim Angles(ItemCount - 1, 1) 1702 1703 For i% = 1 To ItemCount1704 If Mode270 Then If (DiagData(i - 1). Val = Max) Then Item270 = i - 11705 Grad# = DiagData(i - 1). Val * OneGradus + OldGrad1706 If (OldGrad <= 90) And (Grad >= 90) Then pos90 = i - 11707 If (OldGrad <= 270) And (Grad >= 270) Then pos270 = i - 11708 Angles(i - 1, 0) = OldGrad1709 Angles(i - 1, 1) = Grad1710 OldGrad = Grad1711 Next i1712 1713 Chart. DrawStyle = 01714 1715 If Not Mode270 Then1716 1717 For i% = pos90 To 0 Step - 11718 Call OutOneElem(i, Angles(i, 0), Angles(i, 1)) 1719 Next i1720 1721 For i% = pos90 + 1 To pos270 - 11722 Call OutOneElem(i, Angles(i, 0), Angles(i, 1)) 1723 Next i1724 1725 For i% = ItemCount - 1 To pos270 Step - 11726 Call OutOneElem(i, Angles(i, 0), Angles(i, 1)) 1727 Next i1728 Else1729 1730 i% = pos90 - 11731 If (i < 0) Then i = ItemCount - 11732 1733 Call OutOneElem(Item270, Angles(Item270, 0), Angles(Item270, 1), mode270begin) 1734 1735 Do While (i <> Item270) 1736 Call OutOneElem(i, Angles(i, 0), Angles(i, 1)) 1737 1738 i = i - 11739 If (i < 0) Then i = ItemCount - 11740 Loop1741 1742 Call OutOneElem(Item270, Angles(Item270, 0), Angles(Item270, 1), mode270end) 1743 1744 End If1745 End With1746End Sub17471748' рисование линейной, точечной и столбчатой диаграмм1749Sub DrawPoint() 1750 Dim d3DX%1751 Dim d3DY%1752 Dim OldX%, OldY% ' координаты предыдущей точки1753 1754 ItemCount = UBound(DiagData) + 11755 ChartHeight = Chart. Height * 0.81756 ChartTop = Chart. Height * 0.11757 ChartDown = Chart. Height * 0.91758 1759 With Chart1760 dWidth = Chart. Width / (2 * ItemCount + 1) 1761 1762 Max = - 11763 Sum = 01764 For i% = 1 To ItemCount1765 If (DiagData(i - 1). Val > Max) Then Max = DiagData(i - 1). Val1766 Sum = Sum + DiagData(i - 1). Val1767 Next i1768 1769 dHeight = ChartHeight / Max1770 1771 d3DX = Screen. TwipsPerPixelX1772 d3DY = Screen. TwipsPerPixelY1773 1774 With Chart1775. DrawWidth = 11776. DrawStyle = 31777 Chart. Line (dWidth * 0.9, ChartTop \ 2) - (dWidth * 0.9, ChartDown), LineColor1778 Chart. Line (dWidth * 0.9, ChartDown) - ((2 * ItemCount + 0.5) * dWidth, ChartDown), LineColor1779. DrawStyle = 017801781. FontSize =. FontSize + 31782. FontUnderline = True17831784. CurrentX = 2 * d3DX1785. CurrentY = 2 * d3DY1786 Chart. Print "Значения"1787 1788 str_$ = "Подписи"1789. CurrentX =. Width - . TextWidth(str_) - 10 * d3DX1790. CurrentY = ChartDown +. TextHeight(str_) 1791 Chart. Print str_17921793. FontSize =. FontSize - 31794. FontUnderline = False1795 End With179617971798 For i% = 1 To ItemCount1799 j% = 2 * i - 11800 Dim y#, x#1801 y = ChartTop + dHeight * (Max - DiagData(i - 1). Val) 1802 1803 Select Case DrawingMode1804 Case 0 ' // // // // // // // // // // // // // // // // / ЛИНИИ // // // // // // // // // // // // // // // // // // // // /1805 x# = (j + 0.5) * dWidth1806 1807 If (i > 1) Then1808 Chart. DrawWidth = LineWidth1809 Chart. Line (OldX, OldY) - (x, y), DiagData(i - 1). Color1810 Chart. DrawWidth = 11811 End If1812 Chart. DrawStyle = 11813 Chart. Line (x, y) - (x, ChartDown), DiagData(i - 1). Color1814 Chart. DrawStyle = 01815 OldX = x1816 OldY = y1817 1818 str_$ = CStr(DiagData(i - 1). Text) 1819 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21820 Chart. CurrentY = ChartDown + Chart. TextHeight(str_) \ 101821 Chart. Print str_1822 1823 str_ = CStr(Round(DiagData(i - 1). Val / Sum * 100)) + "%"1824 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21825 Chart. CurrentY = y - Chart. TextHeight(str_) * 1.21826 Chart. Print str_1827 1828 ' значение слева с засечкой и линией1829 str_ = CStr(DiagData(i - 1). Val) 1830 If UseLineLeftValues Then1831 Chart. CurrentX = dWidth * 0.8 - Chart. TextWidth(str_) 1832 Chart. DrawStyle = 21833 Chart. Line (dWidth * 0.9, y) - (x, y), LineColor1834 Chart. DrawStyle = 01835 End If18361837 Chart. DrawWidth = 21838 Chart. Line (dWidth * 0.85, y) - (dWidth * 0.95, y), LineColor1839 Chart. DrawWidth = 11840 x# = dWidth * 0.8 - Chart. TextWidth(str_) 1841 Chart. CurrentX = x1842 Chart. CurrentY = y - Chart. TextHeight(str_) \ 21843 Chart. Print str_1844 1845 Case 1 ' // // // // // // // // // // // // // // // // / КОЛОНКИ // // // // // // // // // // // // // // // // // // // /1846 If (Not Use3D) Then1847 Chart. Line (j * dWidth, y) - ((j + 1) * dWidth, ChartDown), DiagData(i - 1). Color, BF1848 Chart. Line (j * dWidth, y) - ((j + 1) * dWidth, ChartDown), LineColor, B1849 1850 str_ = CStr(DiagData(i - 1). Text) 1851 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21852 Chart. CurrentY = ChartDown + Chart. TextHeight(str_) \ 101853 Chart. Print str_1854 1855 str_ = CStr(Round(DiagData(i - 1). Val / Sum * 100)) + "%"1856 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21857 Chart. CurrentY = y - Chart. TextHeight(str_) * 1.21858 Chart. Print str_1859 1860 ' значение слева с засечкой и линией1861 str_ = CStr(DiagData(i - 1). Val) 1862 If UseLineLeftValues Then1863 Chart. CurrentX = dWidth * 0.8 - Chart. TextWidth(str_) 1864 Chart. DrawStyle = 21865 Chart. Line (dWidth * 0.9, y) - (j * dWidth, y), LineColor1866 Chart. DrawStyle = 01867 End If1868 1869 x# = dWidth * 0.8 - Chart. TextWidth(str_) 1870 Chart. CurrentX = x1871 Chart. CurrentY = y - Chart. TextHeight(str_) \ 21872 Chart. Print str_1873 Chart. CurrentX = x1874 Chart. CurrentY = y1875 Chart. DrawWidth = 21876 Chart. Line (dWidth * 0.85, y) - (dWidth * 0.95, y), LineColor1877 Chart. DrawWidth = 11878 Else1879 For k% = 0 To d3D - 11880 Chart. Line (j * dWidth + k * d3DX, y - k * d3DY) - ((j + 1) * dWidth + k * d3DX, ChartDown - k * d3DY), DiagData(i - 1). Color, B1881 Next k1882 Chart. Line (j * dWidth, y) - ((j + 1) * dWidth, ChartDown), DiagData(i - 1). Color, BF1883 ' верхняя левая в глубине1884 ltdx% = j * dWidth + (d3D - 1) * d3DX1885 ltdy% = y - (d3D - 1) * d3DY1886 ' верхняя правая в глубине1887 rtdx% = (j + 1) * dWidth + (d3D - 1) * d3DX1888 rtdy% = y - (d3D - 1) * d3DY1889 ' нижняя правая в глубине1890 rddx% = (j + 1) * dWidth + (d3D - 1) * d3DX1891 rddy% = ChartDown - (d3D - 1) * d3DY1892 ' верхняя в глубине1893 Chart. Line (rtdx, rtdy) - (rddx, rddy), LineColor1894 ' правая в глубине1895 Chart. Line (ltdx, ltdy) - (rtdx, rtdy), LineColor1896 1897 ' левая переходная1898 Chart. Line (ltdx, ltdy) - (ltdx - d3D * d3DX, ltdy + d3D * d3DY), LineColor1899 ' правая верхняя переходная1900 Chart. Line (rtdx, rtdy) - (rtdx - d3D * d3DX, rtdy + d3D * d3DY), LineColor1901 ' правая нижняя переходная1902 Chart. Line (rddx, rddy) - (rddx - d3D * d3DX, rddy + d3D * d3DY), LineColor1903 Chart. Line (j * dWidth, y) - ((j + 1) * dWidth, ChartDown), LineColor, B1904 1905 ' надпись внизу1906 str_ = CStr(DiagData(i - 1). Text) 1907 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21908 Chart. CurrentY = ChartDown + Chart. TextHeight(str_) \ 101909 Chart. Print str_1910 ' процент вверху1911 str_ = CStr(Round(DiagData(i - 1). Val / Sum * 100)) + "%"1912 Chart. CurrentX = d3D * d3DX + j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21913 Chart. CurrentY = y - d3D * d3DY - Chart. TextHeight(str_) * 1.21914 Chart. Print str_1915 ' значение слева с засечкой и линией1916 str_ = CStr(DiagData(i - 1). Val) 1917 If UseLineLeftValues Then1918 Chart. CurrentX = dWidth * 0.8 - Chart. TextWidth(str_) 1919 Chart. DrawStyle = 21920 Chart. Line (dWidth * 0.9, y) - (j * dWidth, y), LineColor1921 Chart. DrawStyle = 01922 End If1923 1924 x# = dWidth * 0.8 - Chart. TextWidth(str_) 1925 Chart. CurrentX = x1926 Chart. CurrentY = y - Chart. TextHeight(str_) \ 21927 Chart. Print str_1928 Chart. CurrentX = x1929 Chart. CurrentY = y1930 Chart. DrawWidth = 21931 Chart. Line (dWidth * 0.85, y) - (dWidth * 0.95, y), LineColor1932 Chart. DrawWidth = 11933 End If1934 1935 Case 2 ' // // // // // // // // // // // // // // // // / ТОЧКИ // // // // // // // // // // // // // // // // // // // // /1936 Chart. FillStyle = 01937 Chart. FillColor = DiagData(i - 1). Color1938 x# = (j + 0.5) * dWidth1939 Chart. Circle (x, y), PointRadius * d3DX, LineColor1940 Chart. FillStyle = 11941 Chart. DrawStyle = 11942 Chart. Line (x, y) - (x, ChartDown), DiagData(i - 1). Color1943 Chart. DrawStyle = 01944 1945 str_ = CStr(DiagData(i - 1). Text) 1946 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21947 Chart. CurrentY = ChartDown + Chart. TextHeight(str_) \ 101948 Chart. Print str_1949 1950 str_ = CStr(Round(DiagData(i - 1). Val / Sum * 100)) + "%"1951 Chart. CurrentX = j * dWidth + (dWidth - Chart. TextWidth(str_)) \ 21952 Chart. CurrentY = y - PointRadius * d3D - Chart. TextHeight(str_) * 1.21953 Chart. Print str_1954 1955 ' значение слева с засечкой и линией1956 str_ = CStr(DiagData(i - 1). Val) 1957 Chart. CurrentX = dWidth * 0.8 - Chart. TextWidth(str_) 1958 Chart. DrawStyle = 21959 Chart. Line (dWidth * 0.9, y) - (x, y), LineColor1960 Chart. DrawStyle = 01961 1962 Chart. DrawWidth = 21963 Chart. Line (dWidth * 0.85, y) - (dWidth * 0.95, y), LineColor1964 Chart. DrawWidth = 11965 x# = dWidth * 0.8 - Chart. TextWidth(str_) 1966 Chart. CurrentX = x1967 Chart. CurrentY = y - Chart. TextHeight(str_) \ 21968 Chart. Print str_1969 End Select1970 Next i1971 1972 End With1973End Sub19741975Sub DrawDiagram() 1976 If (Chart. Height > Screen. TwipsPerPixelX * 5) And (UseColorFill) Then1977 Call ColorFill(Chart, StartFillColor, EndFillColor) 1978 Else1979 Chart. Line (0, 0) - (Chart. Width, Chart. Height), StartFillColor, BF1980 End If19811982 Select Case DrawingMode1983 Case 3: Call DrawCircle1984 Case Else: Call DrawPoint1985 End Select1986End Sub19871988Private Sub Chart_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 1989 If (DrawingMode <> 3) Then1990 y = Round((ChartDown - y) * Max / (ChartDown - ChartTop)) 1991 Label3. Caption = CStr(y) 1992 End If1993End Sub19941995Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 1996 If (KeyCode = vbKeyF5) Then Call DrawDiagram1997End Sub19981999Private Sub Form_Load() 2000 dW = Width - Chart. Width2001 dH = Height - Chart. Height2002 dX = Width - VScroll. Left2003 dH2 = Height - VScroll. Height2004 DrawingMode = 02005 Use3D = False2006 LineCount = 1002007 d3D = 152008 StartFillColor = RGB(255, 255, 128) 2009 EndFillColor = RGB(0, 128, 255) 2010 LineColor = 02011 LineWidth = 12012 Ellipce = 2 / 52013 PointRadius = 152014 2015 UseColorFill = True2016 UseCircleLegend = True2017 UseLineLeftValues = True2018 2019 ChartHeight = Chart. Height * 0.852020 ChartWidth = Chart. Width * 0.852021 ChartTop = Chart. Height * 0.0752022 ChartDown = Chart. Height * 0.9252023 If (ChartWidth < ChartHeight) Then Radius = ChartWidth Else Radius = ChartHeight2024 Radius = Radius * 0.52025 InRad = 0.1 * Radius2026End Sub20272028Private Sub Form_Resize() 2029 Min% = Width - dW + 5 * Screen. TwipsPerPixelX2030 If (Min < 0) Then Min = 02031 Chart. Width = Min2032 2033 Min% = Height - dH + Screen. TwipsPerPixelY2034 If (Min < 0) Then Min = 02035 Chart. Height = Min2036 2037 VScroll. Left = Width - dX2038 2039 Min% = Height - dH2 + Screen. TwipsPerPixelY2040 If (Min < 0) Then Min = 02041 VScroll. Height = Min2042 2043 Call DrawDiagram2044End Sub20452046Private Sub Image1_Click() 2047 CD. FileName = ""2048 CD. ShowSave2049 If (CD. FileName <> "") Then2050 Call SavePicture(Chart. Image, CD. FileName) 2051 End If2052End Sub20532054Private Sub Image2_Click() 2055 With DiagOptForm2056 ' цвета2057. Frame2(0). BackColor = StartFillColor2058. Frame2(1). BackColor = EndFillColor2059. Frame2(2). BackColor = Chart. ForeColor2060. Frame2(3). BackColor = LineColor2061 ' размеры2062. UpDown1. value = LineWidth2063. UpDown2. value = d3D2064. UpDown3. value = PointRadius2065. UpDown4. value = LineCount2066. UpDown5. value = Round(Ellipce * 100) 2067 2068. UpDown6. Max = Chart. Width2069 If (Chart. Height < Chart. Width) Then. UpDown6. Max = Chart. Width2070. UpDown6. Max = Round(. UpDown6. Max / Screen. TwipsPerPixelX) 2071. UpDown6. value = Round(Radius / Screen. TwipsPerPixelX) 20722073. UpDown7. Max =. UpDown6. Max * 0.92074. UpDown7. value = Round(InRad / Screen. TwipsPerPixelX) 2075 2076 ' цвета и надписи2077. List1. Clear2078 For i% = 1 To ItemCount2079. List1. AddItem (DiagData(i - 1). Text) 2080. List1. ItemData(i - 1) = DiagData(i - 1). Color2081 Next i2082 If (. List1. ListCount > 0) Then. List1. ListIndex = 02083 2084 ' флаги2085. Check1. value = - CInt(UseColorFill) 2086. Check3. value = - CInt(UseCircleLegend) 2087. Check2. value = - CInt(UseLineLeftValues) 2088 2089. Show vbModal2090 If (. res = 1) Then2091 ' цвета2092 StartFillColor =. Frame2(0). BackColor2093 EndFillColor =. Frame2(1). BackColor2094 Chart. ForeColor =. Frame2(2). BackColor2095 LineColor =. Frame2(3). BackColor2096 ' размеры2097 LineWidth =. UpDown1. value2098 d3D =. UpDown2. value2099 PointRadius =. UpDown3. value2100 LineCount =. UpDown4. value2101 Ellipce =. UpDown5. value / 1002102 Radius =. UpDown6. value * Screen. TwipsPerPixelX2103 InRad =. UpDown7. value * Screen. TwipsPerPixelX2104 ' цвета и надписи2105 For i% = 1 To ItemCount2106 DiagData(i - 1). Text =. List1. List(i - 1) 2107 DiagData(i - 1). Color =. List1. ItemData(i - 1) 2108 Next i2109 ' флаги2110 UseColorFill = (. Check1. value = 1) 2111 UseCircleLegend = (. Check3. value = 1) 2112 UseLineLeftValues = (. Check2. value = 1) 2113 Call DrawDiagram2114 End If2115 End With2116End Sub21172118Private Sub Image3_Click() 2119 Hide2120End Sub21212122Private Sub VScroll_Change() 2123 Ellipce = VScroll. value / 1002124 Call DrawDiagram2125End SubФорма: InputForm. frm2126Dim res%21272128Private Sub CancelBut_Click() 2129 Call SoundClick2130 Hide2131End Sub21322133Private Sub Form_Activate() 2134 Text1. SetFocus2135End Sub21362137Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 2138 Select Case KeyCode2139 Case 13: Call YesBut_Click2140 Case 27: Call CancelBut_Click2141 End Select2142End Sub21432144Private Sub Form_Load() 2145 Call ButEnabled(YesImg, YesBut, True) 2146 Call ButEnabled(CancelImg, CancelBut, True) 2147End Sub21482149Public Function InputVal(str$) As String2150 Label1. Caption = str2151 Text1. Text = ""2152 res = 02153 Me. Show vbModal2154 If (res = 1) Then InputVal = Text1. Text2155 Unload Me2156End Function21572158Private Sub YesBut_Click() 2159 Call SoundClick2160 res = 12161 Hide2162End SubФорма: DiagOpt. frm2163Public res%21642165Private Sub Form_Load() 2166 res = 02167 Call ButEnabled(SelectImg, SelectBut, True) 2168 Call ButEnabled(CancelImg, CancelBut, True) 2169End Sub21702171Private Sub Form_Paint() 2172 Call DiagResForm. ColorFill(Picture1, Frame2(0). BackColor, Frame2(1). BackColor) 2173End Sub21742175Private Sub Frame2_Click(Index As Integer) 2176 ColorDlg. Color = Frame2(Index). BackColor2177 ColorDlg. ShowColor2178 Frame2(Index). BackColor = ColorDlg. Color2179 If (Index < 2) Then Call DiagResForm. ColorFill(Picture1, Frame2(0). BackColor, Frame2(1). BackColor) 2180 If (Index = 4) Then List1. ItemData(List1. ListIndex) = Frame2(4). BackColor2181End Sub21822183Private Sub Label10_Click() 2184 res = 12185 Hide2186End Sub21872188Private Sub Label15_Click() 2189 Hide2190End Sub21912192Private Sub List1_Click() 2193 If (List1. ListIndex > - 1) Then2194 Text1. Text = List1. List(List1. ListIndex) 2195 Frame2(4). BackColor = List1. ItemData(List1. ListIndex) 2196 End If2197End Sub21982199Private Sub List1_KeyPress(KeyAscii As Integer) 2200 Call List1_Click2201End Sub22022203Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) 2204 If (KeyCode = 13) Then2205 List1. List(List1. ListIndex) = Text1. Text2206 List1. ItemData(List1. ListIndex) = Frame2(4). BackColor2207 End If2208End SubФорма: SplashScreenForm. frm2209Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 2210 If (KeyCode = 27) Or (KeyCode = 13) Then2211 MainForm. Show2212 Unload Me2213 End If2214End Sub22152216Private Sub Form_Load() 2217 Label2. Caption = "v. " + CStr(App. Major) + ". " + CStr(App. Minor) 2218End Sub22192220Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 2221 Call MDown(x, y) 2222End Sub22232224Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 2225 Call MMove(hwnd, x, y) 2226End Sub22272228Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) 2229 Call MUp2230End SubФорма: MonthForm. frm2231Public res%22322233Private Sub CancelBut_Click() 2234 Hide2235End Sub22362237Private Sub EditBut_Click() 2238 res = - 12239 Hide2240End Sub22412242Private Sub Form_Load() 2243 Call ButEnabled(YesImg, YesBut, True) 2244 Call ButEnabled(EditImg, EditBut, True) 2245 Call ButEnabled(CancelImg, CancelBut, True) 2246 res = 02247End Sub22482249Private Sub YesBut_Click() 2250 res = 12251 Hide2252End SubМодуль: DBTypes. bas2253'************************************2254' модуль DBTypes. bas2255' вся работа с файлом БД2256'************************************22572258'************************************** Описание типов **************************************22592260' заголовок файла2261Type TDBHeader2262 ' "DBX" - проверка файла2263 Header As String * 32264 ' флаги2265 Flags As Byte2266 ' количество полей2267 ColCount As Long2268 ' количество записей2269 RowCount As Long2270End Type22712272' имеет ли пользователь права на редактирование2273Public UserIsAdmin As Boolean22742275' данные о столбце2276Type TDBElemData2277 ' тип данных2278 Class As Byte2279 ' длина заголовка2280 TitleLen As Byte2281 ' заголовок, длины TitleLen2282 title As String2283 ' значение по-умолчанию2284 DefValue As Variant2285End Type22862287' запись2288Type TDBElem2289 ' поля записи2290 Fields() As Variant2291End Type22922293' элемент в массиве DB2294Type TDBCell2295 Header As TDBHeader2296 Cols() As TDBElemData2297 Rows() As TDBElem2298 Password As String2299End Type23002301'************************************** Описание констант **************************************23022303' контрольный байт2304Public Const ValidateByte As Byte = &H7F23052306'************************************** Описание переменных **************************************23072308' путь к БД2309Public DBPath$2310' флаг изменения БД2311Public DBChanged As Boolean2312' данные таблиц: каждый элемент - это копия некоторой таблицы2313Public DB() As TDBCell23142315'************************************** Процедуры и функции **************************************23162317' удаление поля2318Public Sub DelCol_(DBIndex%, Optional ByVal Index% = - 1, Optional ByVal conf As Boolean = True) 2319 With DB(DBIndex). Header2320 If (. ColCount = 0) Then Exit Sub2321 If (Index = - 1) Then Index =. ColCount - 12322 If (Index >. ColCount - 1) Or (Index < - 1) Then2323 Call MsgForm. ErrorMsg("Ошибка удаления столбца! ") 2324 Exit Sub2325 End If2326 2327 If conf Then2328 If (MsgForm. QuestMsg("Удалить столбец? ") <> resOk) Then Exit Sub2329 End If2330 ' вырезаю из полей2331 For i% = Index To (. ColCount - 2) 2332 DB(DBIndex). Cols(i) = DB(DBIndex). Cols(i + 1) 2333 Next i2334 ' вырезаю из записей2335 For R% = 0 To (. RowCount - 1) 2336 For c% = Index To (. ColCount - 2) 2337 DB(DBIndex). Rows(R). Fields(c) = DB(DBIndex). Rows(R). Fields(c + 1) 2338 Next c2339 Next R2340 2341. ColCount =. ColCount - 12342 ReDim Preserve DB(DBIndex). Cols(. ColCount) 2343 DBChanged = True2344End With2345End Sub23462347' удаление записи2348Public Sub DelRow_(DBIndex%, Optional ByVal Index% = - 1, Optional ByVal conf As Boolean = True) 2349 With DB(DBIndex). Header2350 If (. RowCount = 0) Then Exit Sub2351 If (Index = - 1) Then Index =. RowCount - 12352 If (Index >. RowCount - 1) Then2353 Call MsgForm. ErrorMsg("Ошибка удаления записи! ") 2354 Exit Sub2355 End If2356 2357 If conf Then2358 If (MsgForm. QuestMsg("Удалить запись? ") = resNo) Then Exit Sub2359 End If2360 For i% = Index To (. RowCount - 2) 2361 DB(DBIndex). Rows(i) = DB(DBIndex). Rows(i + 1) 2362 Next i2363. RowCount =. RowCount - 12364 ReDim Preserve DB(DBIndex). Rows(. RowCount) 2365 DBChanged = True2366End With2367End Sub23682369Public Sub TestDBChanged() 2370 If DBChanged Then2371 MainForm. SB. Panels(1). Picture = MainForm. ImageList1. ListImages(2). Picture2372 Else2373 Set MainForm. SB. Panels(1). Picture = Nothing2374 End If2375End Sub23762377' отображение таблицы2378Public Sub ShowTable(DBIndex%) 2379 MainForm. ListView. ListItems. Clear2380 MainForm. ListView. ColumnHeaders. Clear2381 If (DBIndex = - 1) Then2382 DBPath = ""2383 MainForm. SB. Panels(3). Text = ""2384 GoTo exit_2385 End If2386 If (DB(DBIndex). Header. ColCount = 0) Then GoTo exit_2387 For c% = 0 To DB(DBIndex). Header. ColCount - 12388 Call MainForm. ListView. ColumnHeaders. Add(_2389 MainForm. ListView. ColumnHeaders. Count + 1, _2390 "col_key_" + CStr(c), _2391 DB(DBIndex). Cols(c). title, _2392 1440, _2393 lvwColumnLeft, _2394 0 _2395) 23962397 Next c2398 For R% = 0 To DB(DBIndex). Header. RowCount - 12399 With MainForm. ListView. ListItems. Add2400. Key = "row_key_" + CStr(R) 2401. Text = DB(DBIndex). Rows(R). Fields(0) 2402 For i% = 1 To DB(DBIndex). Header. ColCount - 12403. SubItems(i) = DB(DBIndex). Rows(R). Fields(i) 2404 Next i2405 End With2406 Next R2407exit_: 2408 MainForm. TabStrip. Visible = (DBPath <> "") 2409 MainForm. ListView. Visible = MainForm. TabStrip. Visible2410 If (DBIndex <> - 1) Then2411 MainForm. SB. Panels(2). Text = CStr(DB(DBIndex). Header. RowCount) 2412 Else2413 MainForm. SB. Panels(2). Text = ""2414 End If2415 Call TestDBChanged2416End Sub24172418' поиск поля *************************************************2419Public Function ItColAlreadyCreate(QRDBIndex%, title$) As Boolean2420 With DB(QRDBIndex) 2421 For i% = 0 To (DB(QRDBIndex). Header. ColCount - 1) 2422 If (. Cols(i). title = title) Then2423 ItColAlreadyCreate = True2424 Exit Function2425 End If2426 Next i2427 End With2428 ItColAlreadyCreate = False2429End Function24302431' добавление поля *************************************************2432Public Sub AddCol(DBIndex%, ByVal Class%, ByVal title$, ByVal defval, Optional ByVal pos% = - 1) 2433 With DB(DBIndex). Header2434 ReDim Preserve DB(DBIndex). Cols(. ColCount) 2435 If (pos = - 1) Then2436 pos =. ColCount2437 Else2438 For i% = 1 To (. ColCount - pos) 2439 DB(DBIndex). Cols(. ColCount - i + 1) = DB(DBIndex). Cols(. ColCount - i) 2440 Next i2441 End If2442 With DB(DBIndex). Cols(pos) 2443. Class = Class2444. title = title2445. TitleLen = Len(title) 2446. DefValue = defval2447 End With2448 2449 ' увеличиваю размерность записей2450 For R% = 0 To DB(DBIndex). Header. RowCount - 12451 ReDim Preserve DB(DBIndex). Rows(R). Fields(. ColCount) 2452 For i% = 1 To (. ColCount - pos) 2453 DB(DBIndex). Rows(R). Fields(. ColCount - i + 1) = DB(DBIndex). Rows(R). Fields(. ColCount - i) 2454 Next i2455 DB(DBIndex). Rows(R). Fields(pos) = DB(DBIndex). Cols(pos). DefValue2456 Next R2457 2458. ColCount =. ColCount + 12459 2460 DBChanged = True2461 End With2462End Sub24632464' добавление записи *************************************************2465Public Sub AddField(DBIndex%, row) 2466 With DB(DBIndex). Header2467 ReDim Preserve DB(DBIndex). Rows(. RowCount) 2468 DB(DBIndex). Rows(. RowCount). Fields = row2469. RowCount =. RowCount + 12470 DBChanged = True2471 End With2472End Sub24732474' удаление таблицы *************************************************2475Public Sub DelTable(Index%) 2476 For i% = Index To (UBound(DB) - 1) 2477 DB(i) = DB(i + 1) 2478 Next i2479 If (UBound(DB) > 0) Then ReDim Preserve DB(UBound(DB) - 1) 2480End Sub24812482' если нужно то строка шифруется по паролю, иначе не изменяется2483Function CodeDecode(Index%, str$, col%, row%, Optional pass$ = "", Optional usepass As Boolean = False) As String2484 If Not usepass Then pass$ = DB(Index). Password2485 If (pass = "") Then2486 CodeDecode = str2487 Exit Function2488 End If2489 CodeDecode = ""2490 p% = 12491 Dim ch As Byte2492 For i% = 1 To Len(str) 2493 ch = Asc(Mid(str, i, 1)) Xor Asc(Mid(pass, p, 1)) Xor col Xor row2494 CodeDecode = CodeDecode + Chr(ch) 2495 p = p + 1: If p > Len(pass) Then p = 12496 Next i2497End Function24982499' сохранение БД в файле *************************************************2500Public Sub FlushDB(DBIndex%) 2501 Dim s$, W%2502 If Not UserIsAdmin Then2503 Call ProtectedMsg2504 Exit Sub2505 End If2506 If (DBPath <> "") Then2507 Call DeleteFile(DBPath) 2508 DBI% = FreeFile2509 Open DBPath For Binary As DBI2510 2511 ' заголовок - 122512 Put DBI,, DB(DBIndex). Header2513 2514 ' если надо, то сохраняю пароль2515 If (DB(DBIndex). Header. Flags And flPasswordNeed) Then2516 Dim str$, ch1 As Byte, ch2 As Byte2517 Dim lng As Byte, lng2 As Byte2518 lng = Len(DB(DBIndex). Password) 2519 lng2 = lng / 22520 Put DBI,, lng2521 2522 For i% = 1 To lng22523 ch1 = Asc(Mid(DB(DBIndex). Password, i, 1)) 2524 ch2 = Asc(Mid(DB(DBIndex). Password, lng - i + 1, 1)) 2525 str = Chr(ch1 Xor ch2) + str2526 Next i2527 For i = lng2 To 1 Step - 12528 Put DBI,, CByte(Asc(Mid(str, i, 1))) 2529 Next i2530 End If ' сохранение пароля2531 2532 ' данные полей2533 Dim l As Long2534 For i% = 0 To DB(DBIndex). Header. ColCount - 12535 Put DBI,, DB(DBIndex). Cols(i). Class2536 Put DBI,, DB(DBIndex). Cols(i). TitleLen2537 If (DB(Index). Header. Flags And flCoded) Then2538 Put DBI,, CodeDecode(DBIndex, DB(DBIndex). Cols(i). title, i, 0) 2539 Else2540 Put DBI,, DB(DBIndex). Cols(i). title2541 End If2542 Select Case DB(DBIndex). Cols(i). Class2543 Case ccString2544 If (DB(Index). Header. Flags And flCoded) Then2545 s = CodeDecode(DBIndex, CStr(DB(DBIndex). Cols(i). DefValue), i, 0) 2546 Else2547 s = CStr(DB(DBIndex). Cols(i). DefValue) 2548 End If2549 W = Len(s) 2550 Put DBI,, W2551 Put DBI,, s2552 Case ccInteger2553 l = CInt(DB(DBIndex). Cols(i). DefValue) 2554 Put DBI,, l2555 End Select2556 Next i2557 2558 ' запись контрольного байта2559 Put DBI,, ValidateByte2560 2561 ' записи2562 Dim f As TDBElem2563 Dim col As TDBElemData2564 For R% = 0 To DB(DBIndex). Header. RowCount - 12565 f = DB(DBIndex). Rows(R) 2566 For c% = 0 To DB(DBIndex). Header. ColCount - 12567 col = DB(DBIndex). Cols(c) 2568 ' в зависимости от типа данных колонки пишу в файл определённый тип данных2569 Select Case col. Class2570 ' если число - записываю как long2571 Case ccInteger2572 l = CLng(f. Fields(c)) 2573 Put DBI,, l2574 ' если строка - то байт длины и сама строка2575 Case ccString2576 If (DB(Index). Header. Flags And flCoded) Then2577 s = CodeDecode(DBIndex, CStr(f. Fields(c)), c, R) 2578 Else2579 s = CStr(f. Fields(c)) 2580 End If2581 ' Len возвращает 4 байта, а мне нужно 22582 W = Len(s) 2583 Put DBI,, W2584 Put DBI,, s2585 End Select2586 Next c2587 Next R2588 2589 MainForm. SB. Panels(3). Text = DBPath2590 Call MsgForm. InfoMsg("БД сохранена! ") 2591 2592 ' закрытие файла2593 Close2594 DBChanged = False2595 Call TestDBChanged2596 End If2597End Sub25982599' загрузка БД *************************************************2600Public Function LoadDB(DBIndex%, ByVal Path$) As Boolean2601 Dim DBH As TDBHeader2602 pwrd$ = ""2603 LoadDB = False2604 DBI% = FreeFile2605 DBP$ = Path2606 ' открываю БД2607 Open DBP For Binary As DBI2608 ' считываю заголовок2609 Get DBI,, DBH2610 With DBH2611 If (. Header <> "DBX") Then2612 Call MsgForm. ErrorMsg("БД повреждена! ") 2613 GoTo Notdata2614 End If26152616 ' если надо, то загружаю пароль2617 If (DBH. Flags And flPasswordNeed) Then2618 Dim lng As Byte2619 Get DBI,, lng2620 Dim str$, ch1 As Byte, ch2 As Byte, ch3 As Byte2621 str = ""2622 For i% = 1 To lng \ 22623 Get DBI,, ch12624 str = str + Chr(ch1) 2625 Next i2626'********************************************************2627 With PasswordForm2628. PassText = ""2629 2630. CaptionLabel = "Защита БД"2631. TextLabel = "Открываемая БД защищена паролем. Для работы с БД необходимо ввести пароль. "2632. Frame2. Visible = False2633. Frame1. Visible = True2634 2635 Dim ROE As Boolean2636 2637 ROE = Not ((DBH. Flags And flReadOnlyEnable) = flReadOnlyEnable) 2638 2639 If ROE Then2640. Frame3. Visible = True2641. NoFullLabel. Visible = False2642 Else2643. Frame3. Visible = False2644. NoFullLabel. Visible = True2645 End If2646. Show vbModal2647 If (. res) Then2648 ' допустимый тип доступа2649 Mode% = 02650 ' введёный пароль2651 str2$ = Trim(. PassText) 2652 2653 ' проверка пароля2654 lng_2 = Len(str2) 2655 If (lng_2 <> lng) Then2656 Mode = - 12657 GoTo bad2658 End If2659 For i% = 1 To lng \ 22660 ch1 = Asc(Mid(str2, i, 1)) 2661 ch2 = Asc(Mid(str2, lng - i + 1, 1)) 2662 ch3 = Asc(Mid(str, i, 1)) 2663 If ((ch1 Xor ch2) <> ch3) Then2664 Mode = - 12665 GoTo bad2666 End If2667 Next i2668 2669bad: 2670 ' обработка правильности пароля и уровня доступа2671 If (Mode = 0) And (. Check1 = 0) Then2672 Call MsgForm. InfoMsg("Пароль принят! ") 2673 pwrd = str22674 UserIsAdmin = True2675 Else2676 If ROE And (. Check1 = 1) Then2677 Call MsgForm. InfoMsg("Только чтение! ") 2678 UserIsAdmin = False2679 Else2680 Call MsgForm. ErrorMsg("Пароль не принят! Доступ запрещён! ") 2681 Unload PasswordForm2682 GoTo Notdata2683 End If2684 End If2685 Else2686 Unload PasswordForm2687 GoTo Notdata2688 End If ' if (. res) 2689 Unload PasswordForm2690 End With2691'********************************************************2692 End If26932694 ' выделение нужной памяти2695 If (. ColCount > 0) Then2696 ReDim DB(DBIndex). Cols(. ColCount - 1) 2697 If (. RowCount > 0) Then2698 ReDim DB(DBIndex). Rows(. RowCount - 1) 2699 For R% = 0 To. RowCount - 12700 ReDim DB(DBIndex). Rows(R). Fields(. ColCount - 1) 2701 Next R2702 End If2703 End If2704 2705 ' считывание данных полей2706 For i% = 0 To DBH. ColCount - 12707 ' получение класса2708 Get DBI,, DB(DBIndex). Cols(i). Class2709 ' получение длины заголовка2710 Get DBI,, DB(DBIndex). Cols(i). TitleLen2711 ' получение заголовка2712 s$ = ""2713 Dim B As Byte2714 For j% = 1 To DB(DBIndex). Cols(i). TitleLen2715 Get DBI,, B2716 s = s + Chr(B) 2717 Next j2718 s = CodeDecode(DBIndex, s, i, 0, pwrd, True) 2719 DB(DBIndex). Cols(i). title = s2720 ' получение значения по-умолчанию2721 Dim l As Long2722 Dim W%2723 Select Case DB(DBIndex). Cols(i). Class2724 Case ccInteger2725 Get DBI,, l2726 DB(DBIndex). Cols(i). DefValue = l2727 Case ccString2728 Get DBI,, W2729 s = ""2730 For j% = 1 To W2731 Get DBI,, B2732 s = s + Chr(B) 2733 Next j2734 s = CodeDecode(DBIndex, s, i, 0, pwrd, True) 2735 DB(DBIndex). Cols(i). DefValue = s2736 End Select2737 Next i2738 2739 ' чтение контрольного байта2740 Dim VB As Byte2741 Get DBI,, VB2742 If (VB <> ValidateByte) Then2743 Call MsgForm. ErrorMsg("БД повреждена! ") 2744 GoTo Notdata2745 End If27462747 ' считывание записей2748 Dim col As TDBElemData2749 For R% = 0 To. RowCount - 12750 For c% = 0 To. ColCount - 12751 col = DB(DBIndex). Cols(c) 2752 ' в зависимости от типа данных колонки пишу в файл определённый тип данных2753 Select Case col. Class2754 ' если число - считываю как long2755 Case ccInteger2756 Get DBI,, l2757 DB(DBIndex). Rows(R). Fields(c) = l2758 ' если строка - то байт длины и сама строка2759 Case ccString2760 Get DBI,, W2761 s = ""2762 For j% = 1 To W2763 Get DBI,, B2764 s = s + Chr(B) 2765 Next j2766 s = CodeDecode(DBIndex, s, c, R, pwrd, True) 2767 DB(DBIndex). Rows(R). Fields(c) = s2768 End Select2769 Next c2770 Next R2771 2772 End With2773 LoadDB = True2774 2775 DB(DBIndex). Header = DBH2776 DBPath = DBP2777 DBChanged = False2778 DB(DBIndex). Password = pwrd2779 2780 Call MsgForm. InfoMsg("БД загружена! ") 2781 2782Notdata: 2783 ' закрытие файла2784 Close2785End Function27862787' создание новой БД *************************************************2788Public Function NewDB(Path$) 2789 DBI% = FreeFile2790 ' удаляю БД2791 Call DeleteFile(Path) 2792 ' открываю БД2793 Open Path For Binary As DBI2794 ' применяю стандартный заголовок к БД2795 Call ClearAll2796 DBPath = Path2797 ' записываю заголовок БД2798 Put DBI,, DB(0). Header2799 ' запись контрольного байта2800 Put DBI,, ValidateByte2801 Close2802 Call MsgForm. InfoMsg("БД создана с настройками по-умолчанию! ") 2803End Function28042805' очистка ВСЕГО2806Public Sub ClearAll() 2807 ReDim DB(0) 2808 Call ClearHeader(DB(0). Header) 2809 DBChanged = False2810 DBPath = ""2811End Sub28122813' установка полей в начальные значения *************************************************2814Public Sub ClearHeader(H As TDBHeader) 2815 H. Header = "DBX"2816 H. Flags = 02817 H. ColCount = 02818 H. RowCount = 02819End SubМодуль: API. bas2820' создание файла2821Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long28222823' создание архивной копии БД2824Public Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long28252826' запуск браузера и почтовой программы2827Public Declare Function ShellExecute Lib "shell32. dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long28282829' звук2830Public Declare Function sndPlaySound Lib "winmm. dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long2831Public Const SND_APPLICATION = &H802832Public Const SND_ASYNC = &H12833Public Const SND_FILENAME = &H2000028342835' перемещение окна и анимация кнопок2836Public Type RECT2837 Left As Long2838 Top As Long2839 Right As Long2840 Bottom As Long2841End Type2842Public Type POINTAPI2843 x As Long2844 y As Long2845End Type2846Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long2847Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long2848Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long2849Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long2850Public Declare Function PtInRect Lib "user32" (lpRect As RECT, pt As POINTAPI) As Long28512852' перетаскивание2853Dim ClickBool As Boolean2854Dim Xs%, Ys%28552856Sub MInit() 2857 ClickBool = False2858 Xs = 02859 Ys = 02860End Sub28612862Sub MMove(ByVal Handle As Long, ByVal x%, ByVal y%) 2863 Dim R As RECT2864 If ClickBool Then2865 Call GetWindowRect(Handle, R) 2866 W% = R. Right - R. Left2867 H% = R. Bottom - R. Top2868 x = R. Left + (x - Xs) / Screen. TwipsPerPixelX2869 y = R. Top + (y - Ys) / Screen. TwipsPerPixelY2870 Call MoveWindow(Handle, x, y, W, H, True) 2871 End If2872End Sub28732874Sub MDown(ByVal x%, ByVal y%) 2875 ClickBool = True2876 Xs = x2877 Ys = y2878End Sub28792880Sub MUp() 2881 ClickBool = False2882End SubМодуль: DBConst. bas2883' результаты работы диалогов из MsgBox2884Public Const resBad = 0 ' выход, закрытием окна2885Public Const resOk = 1 ' Да2886Public Const resNo = 2 ' Нет2887Public Const resCancel = 3 ' Отмена28882889' константы типов данных2890Public Const ccInteger As Byte = 02891Public Const ccString As Byte = 128922893' флаги доступа доступа к БД2894 ' требовать пароль для входа2895Public Const flPasswordNeed As Byte = 12896 ' запрещать доступ на чтение без пароля2897Public Const flReadOnlyEnable As Byte = 22898 ' зашифрованность данных2899Public Const flCoded As Byte = 429002901' для диаграмм2902Type TDiagElem2903 Text As String2904 Val As Integer2905 Color As Long2906End Type29072908' права Только чтение2909Public Sub ProtectedMsg() 2910 Call MsgForm. ErrorMsg("Недостаточно прав для выполнения действия! ") 2911End Sub29122913' звук нажатия кнопки2914Public Sub SoundClick() 2915 Call sndPlaySound("Data\Click. wav", SND_ASYNC + SND_FILENAME + SND_LOOP + SND_APPLICATION) 2916End Sub29172918Public Function IsInteger(ByVal str$) As Boolean2919 Dim Arr(1 To 4) As String * 12920 Arr(1) = "e": Arr(2) = "E": Arr(3) = ",": Arr(4) = ". "2921 IsInteger = True2922 If IsNumeric(str) Then2923 For i% = LBound(Arr) To UBound(Arr) 2924 If (InStr(1, str, Arr(i)) > 0) Then2925 IsInteger = False2926 Exit For2927 End If2928 Next i2929 Else2930 IsInteger = False2931 End If2932End Function29332934Public Sub ButEnabled(Pict As Image, Lbl As Label, enbl As Boolean) 2935 If enbl Then2936 Pict. Picture = MainForm. ButtonImageList. ListImages(1). Picture2937 Lbl. MousePointer = 12938 Else2939 Pict. Picture = MainForm. ButtonImageList. ListImages(2). Picture2940 Lbl. MousePointer = 122941 End If2942 Lbl. Tag = CInt(enbl) 2943End SubМодуль: QueryRunner. bas2944Public QRDBIndex%29452946'***********************************2947' Запросы чувствительны к регистру! 2948'***********************************29492950' константы видов запросов2951 ' ОБЯЗАТЕЛЬНО 3 ЗНАКА2952Public Const sAdd$ = "Add"2953Public Const sDel$ = "Del"2954Public Const sSort$ = "Srt"2955Public Const sOut$ = "Out"2956Public Const sSwap$ = "Swp"2957Public Const sChange$ = "Chg"29582959' константы подтипов запросов2960Public Const sCol$ = "Col"2961Public Const sRow$ = "Row"2962Public Const sTable$ = "Tbl" ' только для использования в запросе Вывод2963Public Const sAZ$ = "AZ"2964Public Const sZA$ = "ZA"2965Public Const sEqual$ = "? ="2966Public Const sAbove$ = "? >"2967Public Const sBelow$ = "? <"2968Public Const sCountEqual$ = "+="2969Public Const sCountAbove$ = "+>"2970Public Const sCountBelow$ = "+<"2971Public Const sI$ = "i"2972Public Const sS$ = "s"2973Public Const sYes$ = "yes"2974Public Const sNo$ = "no"2975Public Const sType$ = "Type"2976Public Const sName$ = "Name"29772978' остальные константы2979Public Const sSep$ = "; "29802981'************************ Формирует строку добавления 'What' ************************2982Public Function Generate_Add(ByVal what$) As String2983 If (what = sCol) Then2984 s$ = AddColForm. AddColDlg(QRDBIndex) 2985 If (s <> "") Then2986 Generate_Add = sAdd + sCol + "(" + s + ")"2987 Else2988 Generate_Add = ""2989 End If2990 Else2991 Generate_Add = sAdd + sRow + "()"2992 End If2993End Function29942995'************************ Формирует строку удаления 'What' ************************2996Public Function Generate_Del(ByVal what$) As String2997 With SelectForm. CheckConfirm2998. value = 12999. Visible = True3000 End With3001 Dim conf$3002 3003 If (what = sCol) Then3004 s$ = SelectForm. SelectDlg(QRDBIndex, "Выберите удаляемое поле", sCol) 3005 If (s <> - 1) Then3006 If (SelectForm. CheckConfirm. value = 1) Then3007 conf = sYes3008 Else3009 conf = sNo3010 End If3011 Generate_Del = sDel + sCol + "(" + s + ", " + conf + ")"3012 Else3013 Generate_Del = ""3014 End If3015 Else3016 s$ = SelectForm. SelectDlg(QRDBIndex, "Выберите удаляемую запись", sRow) 3017 If (s <> - 1) Then3018 If (SelectForm. CheckConfirm. value = 1) Then3019 conf = sYes3020 Else3021 conf = sNo3022 End If3023 Generate_Del = sDel + sRow + "(" + s + ", " + conf + ")"3024 Else3025 Generate_Del = ""3026 End If3027 End If3028End Function30293030'************************ Формирует строку сортировки по 'What' ************************3031Public Function Generate_Sort(ByVal what$) As String3032 SelectForm. CheckConfirm. Visible = False30333034 s$ = SelectForm. SelectDlg(QRDBIndex, "Выберите поле сортировки", sCol) 3035 If (s <> - 1) Then3036 Generate_Sort = sSort + "(" + s + ", " + what + ")"3037 Else3038 Generate_Sort = ""3039 End If3040End Function30413042'************************ Формирует строку вывода по 'What' ************************3043Public Function Generate_Out(ByVal what$) As String3044 Generate_Out = ""3045 SelectForm. CheckConfirm. Visible = False3046 Dim str$3047 3048 s$ = SelectForm. SelectDlg(QRDBIndex, "Выберите поле", sCol) 3049 If (s <> "-1") Then3050 str = Trim(InputForm. InputVal("Введите относительное значение")) 3051 If (str <> "") Then3052 Dim CreateNewTab As Boolean3053 CreateNewTab = (MsgForm. QuestMsg("Выводить в новую таблицу? Нет для вывода в уже существующую. ") = resOk) 3054 If (Not CreateNewTab) Then3055 Table$ = SelectForm. SelectDlg(QRDBIndex, "Выберите таблицу", sTable) 3056 If (Table = "-1") Then Exit Function3057 Generate_Out = sOut + "(" + s + ", " + what + str + ", " + Table + ")"3058 Else3059 Generate_Out = sOut + "(" + s + ", " + what + str + ")"3060 End If3061 Else3062 Call MsgForm. ErrorMsg("Не задано относительное значение! ") 3063 End If3064 End If3065End Function30663067'************************ Формирует строку обмена по 'What' ************************3068Public Function Generate_Swap(ByVal what$) As String3069 If (what = sCol) Then3070 s$ = SelectForm. MultiSelectDlg(QRDBIndex, "Выберите 2 обмениваемых поля", sCol) 3071 If (s <> "") Then3072 p% = InStr(1, s, ",") 3073 Generate_Swap = sSwap + sCol + "(" + Left(s, p - 1) + ", " + Mid(s, p + 1) + ")"3074 Else3075 Generate_Swap = ""3076 End If3077 Else3078 s$ = SelectForm. MultiSelectDlg(QRDBIndex, "Выберите 2 обмениваемые записи", sRow) 3079 If (s <> "") Then3080 p% = InStr(1, s, ",") 3081 Generate_Swap = sSwap + sRow + "(" + Left(s, p - 1) + ", " + Mid(s, p + 1) + ")"3082 Else3083 Generate_Swap = ""3084 End If3085 End If3086End Function30873088'************************ Формирует строку изменения 'What' ************************3089Public Function Generate_Change(ByVal what$) As String3090 Generate_Change = ""3091 SelectForm. CheckConfirm. Visible = False3092 3093 s$ = SelectForm. SelectDlg(QRDBIndex, "Выберите изменяемое поле", sCol) 3094 If (s = "-1") Then Exit Function3095 Select Case what3096 Case sType ' Изменение типа поля3097 Generate_Change = sChange + sType + "(" + s + ")"3098 Case sName ' Изменение названия столбца3099 Name$ = InputForm. InputVal("Введите новое название поля") 3100 If (Name = "") Then Exit Function3101 Generate_Change = sChange + sName + "(" + s + ", " + Name + ")"3102 End Select3103End Function31043105Sub ErrorInQuery() 3106 Call MsgForm. ErrorMsg("Ошибка в запросе! ") 3107End Sub31083109Function TestZero(i%) 3110 If (i = 0) Then3111 Call ErrorInQuery3112 TestZero = True3113 Else3114 TestZero = False3115 End If3116End Function31173118Sub AddRun(what$, str$) 3119 Select Case what3120 Case sCol3121 ' заголовок3122 p% = InStr(1, str, ",") 3123 If TestZero(p) Then Exit Sub3124 title$ = Trim(Left(str, p - 1)) 3125 str = Mid(str, p + 1) 3126 ' тип3127 p = InStr(1, str, ",") 3128 If TestZero(p) Then Exit Sub3129 ColType$ = Trim(Left(str, p - 1)) 3130 str = Mid(str, p + 1) 31313132 ' начальное значение3133 p = InStr(1, str, ",") 3134 If TestZero(p) Then Exit Sub3135 StValStr$ = Trim(Left(str, p - 1)) 3136 str = Mid(str, p + 1) 3137 3138 ' позиция3139 ColPosStr$ = str3140 If (Not IsNumeric(ColPosStr)) Then3141 Call ErrorInQuery3142 Exit Sub3143 End If3144 ColPos% = CInt(ColPosStr) 3145 3146 If ItColAlreadyCreate(QRDBIndex, title) Then3147 Call MsgForm. ErrorMsg("Добавляемое поле уже существует! ") 3148 Exit Sub3149 End If3150 3151 ' в зависимости от типа определяю значение3152 Select Case ColType3153 Case sI3154 If (Not IsInteger(StValStr)) Then3155 Call ErrorInQuery3156 Exit Sub3157 End If3158 stval = CInt(StValStr) 3159 Call AddCol(QRDBIndex, ccInteger, title, stval, ColPos) 3160 Case sS3161 stval = CStr(StValStr) 3162 Call AddCol(QRDBIndex, ccString, title, stval, ColPos) 3163 Case Default3164 Call ErrorInQuery3165 Exit Sub3166 End Select31673168 Case sRow3169 If (DB(QRDBIndex). Header. ColCount > 0) Then3170 Dim row() As Variant3171 ReDim row(DB(QRDBIndex). Header. ColCount - 1) 3172 For i = 0 To DB(QRDBIndex). Header. ColCount - 13173 row(i) = DB(QRDBIndex). Cols(i). DefValue3174 Next i3175 If (Not FindRow(QRDBIndex, row)) Then3176 Call AddField(QRDBIndex, row) 3177 Else3178 Call MsgForm. ErrorMsg("Добавляемый столбец дублируется! ") 3179 End If3180 Else3181 Call MsgForm. ErrorMsg("Нельзя добавлять записи в БД без полей! ") 3182 End If3183 End Select3184 3185End Sub31863187Sub DelRun(what$, str$) 3188 p% = InStr(1, str, ",") 3189 If TestZero(p) Then Exit Sub3190 IndexStr$ = Trim(Left(str, p - 1)) 3191 If (Not IsInteger(IndexStr)) Then3192 Call ErrorInQuery3193 Exit Sub3194 End If3195 Index% = CInt(IndexStr) 3196 str = Mid(str, p + 1) 3197 ConfirmStr$ = Trim(str) 3198 Dim Confirm As Boolean3199 Select Case ConfirmStr3200 Case sYes3201 Confirm = True3202 Case sNo3203 Confirm = False3204 Case Default3205 Call ErrorInQuery3206 Exit Sub3207 End Select3208 3209 Select Case what3210 Case sCol3211 If (DB(QRDBIndex). Header. ColCount > 0) Then3212 Call DelCol_(QRDBIndex, Index, Confirm) 3213 Else3214 Call MsgForm. ErrorMsg("В БД нет полей! ") 3215 Exit Sub3216 End If3217 Case sRow3218 If (DB(QRDBIndex). Header. RowCount > 0) Then3219 Call DelRow_(QRDBIndex, Index, Confirm) 3220 Else3221 Call MsgForm. ErrorMsg("В БД нет записей! ") 3222 Exit Sub3223 End If3224 End Select3225End Sub32263227Sub SortRun(str$) 3228 If (DB(QRDBIndex). Header. ColCount = 0) Or (DB(QRDBIndex). Header. RowCount = 0) Then3229 Call MsgForm. ErrorMsg("Нечего сортировать! ") 3230 Exit Sub3231 End If3232 3233 p% = InStr(1, str, ",") 3234 If TestZero(p) Then Exit Sub3235 what$ = Trim(Left(str, p - 1)) 3236 3237 If (Not IsInteger(what)) Then3238 Call ErrorInQuery3239 Exit Sub3240 End If3241 3242 whatint% = CInt(what) 3243 3244 If (whatint < 0) Or (whatint > DB(QRDBIndex). Header. ColCount - 1) Then3245 Call ErrorInQuery3246 Exit Sub3247 End If3248 3249 Mode$ = Trim(Mid(str, p + 1)) 3250 3251 Select Case Mode3252 Case sAZ3253 s$ = "А->Я"3254 Case sZA3255 s$ = "Я->А"3256 Case Default3257 Call ErrorInQuery3258 Exit Sub3259 End Select3260 3261 Count% = MainForm. TabStrip. Tabs. Count3262 ReDim Preserve DB(Count) 3263 3264 DB(Count) = DB(QRDBIndex) 3265 3266 MainForm. TabStrip. Tabs. Add pvCaption: =s, pvImage: =13267 3268 Dim find As Boolean, needswap As Boolean3269 Dim tmp As TDBElem3270 With DB(Count) 3271 Do3272 find = False3273 For R% = 1 To. Header. RowCount - 13274 If (Mode = sZA) Then3275 needswap = (. Rows(R). Fields(whatint) >. Rows(R - 1). Fields(whatint)) 3276 Else3277 needswap = (. Rows(R). Fields(whatint) <. Rows(R - 1). Fields(whatint)) 3278 End If3279 If (needswap) Then3280 tmp =. Rows(R) 3281. Rows(R) =. Rows(R - 1) 3282. Rows(R - 1) = tmp3283 find = True3284 End If3285 Next R3286 Loop While (find) 3287 End With3288End Sub32893290Function Equal(ByVal col%, ByVal row%, ByVal cmpstr$) As Long3291 If (DB(QRDBIndex). Cols(col). Class = ccInteger) Then3292 Rval = CLng(DB(QRDBIndex). Rows(row). Fields(col)) 3293 Equal = (Rval - CLng(cmpstr)) 3294 Else3295 Rval = CStr(DB(QRDBIndex). Rows(row). Fields(col)) 3296 If (Rval = cmpstr) Then3297 Equal = 03298 Else3299 If (Rval > cmpstr) Then3300 Equal = 13301 Else3302 Equal = - 13303 End If3304 End If3305 End If3306End Function33073308Function CalcCount(Index%, c%, value$) As Integer3309 Count% = 03310 For i% = 0 To (DB(Index). Header. RowCount - 1) 3311 If (CStr(DB(Index). Rows(i). Fields(c)) = value) Then Count = Count + 13312 Next i3313 CalcCount = Count3314End Function33153316Function EarlierDontFind(Index%, c%, R%, value$) As Boolean3317 For i% = 0 To (R - 1) 3318 If (CStr(DB(Index). Rows(i). Fields(c)) = value) Then3319 EarlierDontFind = False3320 Exit Function3321 End If3322 Next i3323 EarlierDontFind = True3324End Function33253326Public Function FindRow(Index%, row()) 3327 For R% = 0 To DB(Index). Header. RowCount - 13328 Sum% = 03329 For c% = 0 To DB(Index). Header. ColCount - 13330 If (CStr(DB(Index). Rows(R). Fields(c)) = row(c)) Then Sum = Sum + 13331 Next c3332 If (Sum = DB(Index). Header. ColCount) Then3333 FindRow = True3334 Exit Function3335 End If3336 Next R3337 FindRow = False3338End Function33393340Sub OutRun(str$) 3341 If (DB(QRDBIndex). Header. ColCount = 0) Or (DB(QRDBIndex). Header. RowCount = 0) Then3342 Call MsgForm. ErrorMsg("Не с чем сравнивать! ") 3343 Exit Sub3344 End If3345 3346 p% = InStr(1, str, ",") 3347 what$ = Trim(Left(str, p - 1)) 3348 3349 If (Not IsInteger(what)) Then3350 Call ErrorInQuery3351 Exit Sub3352 End If3353 3354 whatint% = CInt(what) 3355 3356 If (whatint < 0) Or (whatint > DB(QRDBIndex). Header. ColCount - 1) Then3357 Call ErrorInQuery3358 Exit Sub3359 End If3360 3361 pi% = p + 13362 Do3363 Mode$ = Trim(Mid(str, pi, 1)) 3364 pi = pi + 13365 Loop While (Mode = "") 3366 Mode = Mode + Mid(str, pi, 1) 3367 3368 If (Mode <> sEqual) And (Mode <> sAbove) And (Mode <> sBelow) And (Mode <> sCountEqual) And (Mode <> sCountAbove) And (Mode <> sCountBelow) Then3369 Call ErrorInQuery3370 Exit Sub3371 End If3372 3373 Dim CalcMode As Boolean3374 CalcMode = (Mode = sCountEqual) Or (Mode = sCountAbove) Or (Mode = sCountBelow) 3375 3376 str = Trim(Mid(str, pi + 1)) 3377 3378 If (str = "") Then3379 Call ErrorInQuery3380 Exit Sub3381 End If3382 3383 ' проверка на наличие индекса таблицы3384 p = InStr(1, str, ",") 3385 tableindex% = - 13386 If (p <> 0) Then3387 tableindexstr$ = Trim(Mid(str, p + 1)) 3388 If Not IsInteger(tableindexstr) Then3389 Call ErrorInQuery3390 Exit Sub3391 End If3392 tableindex% = CLng(tableindexstr) 3393 If (tableindex < 0) Or (tableindex > MainForm. TabStrip. Tabs. Count - 1) Then3394 Call ErrorInQuery3395 Exit Sub3396 End If3397 str = Trim(Left(str, p - 1)) 3398 End If3399 3400 Dim GlobEqual As Boolean3401 If (Not IsInteger(str)) And (DB(QRDBIndex). Cols(whatint). Class = ccInteger) Then3402 Call MsgForm. ErrorMsg("Эквивалентом вывода целочисленного столбца не является целое число! " + vbCrLf + _3403 "Условие всегда истинно! ") 3404 GlobEqual = True3405 Else3406 GlobEqual = False3407 End If3408 3409 Count% = MainForm. TabStrip. Tabs. Count3410 If (tableindex = - 1) Then3411 ReDim Preserve DB(Count) 3412 3413 DB(Count). Header = DB(QRDBIndex). Header3414 DB(Count). Header. RowCount = 03415 DB(Count). Cols = DB(QRDBIndex). Cols3416 3417 MainForm. TabStrip. Tabs. Add pvCaption: ="Вывод " + Mode + str, pvImage: =13418 Else3419 Count = tableindex3420 End If3421 3422 Dim NeedAdd As Boolean3423 With DB(Count) 3424 Dim Rval3425 For R% = 0 To DB(QRDBIndex). Header. RowCount - 13426 If (Not GlobEqual) Then3427 Select Case Mode3428 Case sEqual3429 NeedAdd = (Equal(whatint, R, str) = 0) 3430 Case sAbove3431 NeedAdd = (Equal(whatint, R, str) > 0) 3432 Case sBelow3433 NeedAdd = (Equal(whatint, R, str) < 0) 3434 Case sCountEqual3435 value$ = CStr(DB(QRDBIndex). Rows(R). Fields(whatint)) 3436 NeedAdd = ((CStr(CalcCount(QRDBIndex, whatint, value)) = str) And (EarlierDontFind(QRDBIndex, whatint, R, value))) 3437 Case sCountAbove3438 value$ = CStr(DB(QRDBIndex). Rows(R). Fields(whatint)) 3439 NeedAdd = ((CStr(CalcCount(QRDBIndex, whatint, value)) > str) And (EarlierDontFind(QRDBIndex, whatint, R, value))) 3440 Case sCountBelow3441 value$ = CStr(DB(QRDBIndex). Rows(R). Fields(whatint)) 3442 NeedAdd = ((CStr(CalcCount(QRDBIndex, whatint, value)) < str) And (EarlierDontFind(QRDBIndex, whatint, R, value))) 3443 End Select3444 Else3445 NeedAdd = True3446 End If3447 If (NeedAdd) Then3448 ReDim tmparr(DB(QRDBIndex). Header. ColCount) 3449 tmparr = DB(QRDBIndex). Rows(R). Fields3450 If (Not FindRow(Count, tmparr)) Then3451 addindex% = DB(Count). Header. RowCount3452 ReDim Preserve DB(Count). Rows(addindex) 3453 ReDim DB(Count). Rows(addindex). Fields(DB(Count). Header. ColCount - 1) 3454 DB(Count). Rows(addindex). Fields = DB(QRDBIndex). Rows(R). Fields3455 DB(Count). Header. RowCount = DB(Count). Header. RowCount + 13456 Else3457 Call MsgForm. ErrorMsg("Добавляемая запись уже существует! ") 3458 End If3459 End If3460 Next R3461 End With3462End Sub34633464Sub SwapRun(what$, str$) 3465 p% = InStr(1, str, ",") 3466 If TestZero(p) Then Exit Sub3467 index1str$ = Trim(Left(str, p - 1)) 3468 index2str$ = Trim(Mid(str, p + 1)) 3469 3470 If (Not IsInteger(index1str)) Then3471 Call ErrorInQuery3472 Exit Sub3473 End If3474 3475 index1% = CInt(index1str) 3476 index2% = CInt(index2str) 3477 3478 If (index1 < 0) Or (index2 < 0) Or (index1 = index2) Then3479 Call ErrorInQuery3480 Exit Sub3481 End If3482 3483 Select Case what3484 Case sCol3485 With DB(QRDBIndex) 3486 If (index1 >. Header. ColCount - 1) Or (index2 >. Header. ColCount - 1) Then3487 Call ErrorInQuery3488 Exit Sub3489 End If3490 ' обмен полей3491 Dim tmpcol As TDBElemData3492 tmpcol =. Cols(index1) 3493. Cols(index1) =. Cols(index2) 3494. Cols(index2) = tmpcol3495 ' обмен полей записей3496 Dim tmpcell As Variant3497 For R% = 0 To. Header. RowCount - 13498 tmpcell =. Rows(R). Fields(index1) 3499. Rows(R). Fields(index1) =. Rows(R). Fields(index2) 3500. Rows(R). Fields(index2) = tmpcell3501 Next R3502 3503 End With3504 Case sRow3505 With DB(QRDBIndex) 3506 If (index1 >. Header. RowCount - 1) Or (index2 >. Header. RowCount - 1) Then3507 Call ErrorInQuery3508 Exit Sub3509 End If3510 Dim tmprow As TDBElem3511 tmprow =. Rows(index1) 3512. Rows(index1) =. Rows(index2) 3513. Rows(index2) = tmprow3514 End With3515 End Select3516End Sub35173518Sub ChangeRun(what$, param$) 3519 Select Case what3520 Case sType ' **************...::: Type:::... ***************3521 If Not IsInteger(param) Then3522 Call ErrorInQuery3523 Exit Sub3524 End If3525 colindex% = CLng(param) 3526 If (colindex < 0) Or (colindex > DB(QRDBIndex). Header. ColCount - 1) Then3527 Call ErrorInQuery3528 Exit Sub3529 End If3530 If (DB(QRDBIndex). Cols(colindex). Class = ccString) Then3531 If (MsgForm. QuestMsg("Поле строкового типа преобразуется в числовой тип. " + _3532 "Все нечисловые значения будут преобразованы в 0. " + _3533 "Продолжить? ") <> resOk) Then Exit Sub3534 3535 End If3536 For i% = 0 To (DB(QRDBIndex). Header. RowCount - 1) 3537 Select Case DB(QRDBIndex). Cols(colindex). Class3538 Case ccInteger3539 DB(QRDBIndex). Rows(i). Fields(colindex) = CStr(DB(QRDBIndex). Rows(i). Fields(colindex)) 3540 Case ccString3541 If Not IsInteger(DB(QRDBIndex). Rows(i). Fields(colindex)) Then3542 DB(QRDBIndex). Rows(i). Fields(colindex) = 03543 Else3544 DB(QRDBIndex). Rows(i). Fields(colindex) = CLng(DB(QRDBIndex). Rows(i). Fields(colindex)) 3545 End If3546 End Select3547 Next i3548 Select Case DB(QRDBIndex). Cols(colindex). Class3549 Case ccInteger3550 DB(QRDBIndex). Cols(colindex). Class = ccString3551 Case ccString3552 DB(QRDBIndex). Cols(colindex). Class = ccInteger3553 End Select3554 3555 Case sName ' **************...::: Name:::... ***************3556 p% = InStr(1, param, ",") 3557 If TestZero(p) Then Exit Sub3558 colindexstr$ = Trim(Left(param, p - 1)) 3559 If Not IsInteger(colindexstr) Then3560 Call ErrorInQuery3561 Exit Sub3562 End If3563 colindex% = CLng(colindexstr) 3564 param = Trim(Mid(param, p + 1)) 3565 If (param = "") Then3566 Call ErrorInQuery3567 Exit Sub3568 End If3569 ' поиск на дубликат3570 For i% = 0 To DB(QRDBIndex). Header. ColCount - 13571 If (DB(QRDBIndex). Cols(i). title = param) And (i <> colindex) Then3572 Call MsgForm. ErrorMsg("Поле с названием " + param + " уже существует! ") 3573 Exit Sub3574 End If3575 Next i3576 DB(QRDBIndex). Cols(colindex). title = param3577 DB(QRDBIndex). Cols(colindex). TitleLen = Len(param) 3578 Case Default ' **************!! ***************3579 Call ErrorInQuery3580 End Select3581End Sub35823583Public Sub RunQuery(DBIndex_%, query$) 3584 Dim s1$, p%35853586 s1 = Mid(query, 4) 3587 query = Left(query, 3) 3588 3589 QRDBIndex = DBIndex_3590 3591 Select Case query3592 Case sAdd3593 query = Left(s1, 3) 3594 s1 = Mid(s1, InStr(1, s1, "(")) 3595 If (Left(s1, 1) <> "(") Or (Right(s1, 1) <> ")") Or ((Len(s1) < 8) And (query = sCol)) Then3596 Call ErrorInQuery3597 Else3598 Call AddRun(query, Trim(Mid(s1, 2, Len(s1) - 2))) 3599 End If3600 Case sDel3601 query = Left(s1, 3) 3602 s1 = Mid(s1, InStr(1, s1, "(")) 3603 If (Left(s1, 1) <> "(") Or (Right(s1, 1) <> ")") Or (Len(s1) < 5) Then3604 Call ErrorInQuery3605 Else3606 Call DelRun(query, Trim(Mid(s1, 2, Len(s1) - 2))) 3607 End If3608 Case sSort3609 If (Left(s1, 1) <> "(") Or (Right(s1, 1) <> ")") Or (Len(s1) < 5) Then3610 Call ErrorInQuery3611 Else3612 Call SortRun(Trim(Mid(s1, 2, Len(s1) - 2))) 3613 End If3614 Case sOut3615 If (Left(s1, 1) <> "(") Or (Right(s1, 1) <> ")") Or (Len(s1) < 5) Then3616 Call ErrorInQuery3617 Else3618 Call OutRun(Trim(Mid(s1, 2, Len(s1) - 2))) 3619 End If3620 Case sSwap3621 query = Left(s1, 3) 3622 s1 = Mid(s1, InStr(1, s1, "(")) 3623 If (Left(s1, 1) <> "(") Or (Right(s1, 1) <> ")") Or ((Len(s1) < 5) And (query = sCol)) Then3624 Call ErrorInQuery3625 Else3626 Call SwapRun(query, Trim(Mid(s1, 2, Len(s1) - 2))) 3627 End If3628 Case sChange3629 query = Left(s1, 4) 3630 s1 = Mid(s1, InStr(1, s1, "(")) 3631 If (Left(s1, 1) <> "(") Or (Right(s1, 1) <> ")") Or (Len(s1) < 3) Then3632 Call ErrorInQuery3633 Else3634 Call ChangeRun(query, Trim(Mid(s1, 2, Len(s1) - 2))) 3635 End If3636 End Select3637 3638End Sub |
РЕКЛАМА
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |