|
Разработка программного продукта "ПК инфо"
p align="left">- мост Silverrun-RDM <-> JAM;- комплекс средств тестирования QA; - менеджер транзакций Tuxedo; - комплекс средств планирования и управления проектом SE Companion; - комплекс средств конфигурационного управления PVCS; - объектно-ориентированное CASE-средство Rational Rose; - средство документирования SoDA [6]. Примерами других подобных комплексов являются: - Vantage Team Builder for Uniface + Uniface (фирмы "DataX/Florin" и "ЛАНИТ"); - комплекс средств, поставляемых и используемых фирмой "ФОРС": - CASE-средства Designer/2000 (основное), ERwin, Bpwin и Oowin (альтернативные); - средства разработки приложений Developer/2000, ORACLE Power Objects (основные) и Usoft Developer (альтернативное); - средство настройки и оптимизации ExplainSQL (Platinum); - cредства администрирования и сопровождения SQLWatch, DBVision, SQL Spy, TSReorg и др. (Platinum); - средство документирования ORACLE Book. - комплекс средств на основе продуктов фирмы CENTURA: - CASE-средства ERwin, Bpwin и Oowin (объектно-ориентированный анализ); - средства разработки приложений SQLWindows и TeamWindows; - средство тестирования и оптимизации приложений "клиент-сервер" SQLBench (ARC); - средства эксплуатации и сопровождения Quest и Crystal Reports [8]. 3. Анализ языков программирования 3.1. Обзор языков программирования 3.1.1. Языки программирования системного уровня Чтобы осознать различие между языками описания сценариев и системными, полезно вспомнить историю развития последних. Впервые они появились в качестве альтернативы языкам ассемблера, позволяющим использовать в программе практически все особенности конкретной аппаратной подсистемы. Каждому утверждению такого языка соответствует ровно одна машинная команда, и программисту приходиться иметь дело с такими низко уровневыми деталями, как распределение регистров и последовательности вызова процедур. В результате написание и сопровождение крупных программ на языке ассемблера оказывается чрезвычайно сложным делом. К концу 50-х годов начали появляться языки программирования более высокого уровня, такие как Lisp, Fortran, ALGOL. В них уже не было точного соответствия между языковыми конструкциями и машинными командами. Преобразование строк исходного кода в последовательности двоичных команд осуществлялось компилятором. Со временем их число пополнилось языками PL /1, Pascal, C, C++, Java. Все они менее эффективно используют аппаратуру по сравнению с языками ассемблера, но позволяет быстрее создавать приложения. В результате им удалось практически полностью вытеснить языки ассемблера при создании крупных приложений [2]. 3.1.2. Языки программирования высокого уровня Языки программирования системного уровня отличаются от ассемблеров, во-первых, тем, что они являются более высокоуровневыми, и, во-вторых, используют более строгий контроль типов. Термин “высокоуровневый” означает следующее: многие детали обрабатываются автоматически, а программисту для создания своего приложения приходится писать меньшее количество строк. В частности: - Распределением регистров занимается компилятор, так что программисту не надо писать код, обеспечивающий перемещение данных между регистрами и памятью; - Последовательности вызова процедур генерируются автоматически; программисту нет необходимости описывать помещение аргументов функции в стек и их извлечение оттуда; Для описания структур управления программист может использовать также ключевые слова, как if, while; последовательности машинных команд, соответствующие этим описаниям компилятор генерирует динамически [5]. 3.1.3. Языки описания сценариев Языки описания сценариев, такие как Perl, Python, Rexx, Tcl, Visual Basic и языки оболочек UNIX, предполагают стиль программирования, весьма отличный от характерного для языков системного уровня. Они предназначаются не для написания приложения с “нуля”, а для комбинирования компонентов, набор которых создается заранее при помощи других языков. Например, Tcl, Visual Basic могут использоваться для построения пользовательских интерфейсов из имеющихся элементов управления, а языки описания сценариев для оболочек UNIX применяются для формирования “конвейеров” обработки потоков данных из набора стандартных фильтров. Языки описания сценариев часто применяются и для дополнения готовых компонентов новыми возможностями; однако эта деятельность редко охватывает создание сложных алгоритмов или структур данных, которые уже обычно бывают уже заложены в компоненты. Иногда языки описания сценариев даже называют связующими или языками системной интеграции. Для языков описания сценариев характерно отсутствие типизации, которая только усложнила бы задачу соединения компонентов. Все элементы в них выглядят и функционируют одинаково и являются полностью взаимозаменяемыми. Например, в Tcl или Visual Basic переменная может содержать в одной точке программы строку, а в другой - целое число. Код и данные также часто бывают взаимозаменяемы. Например, Tcl, Visual Basic переменная может содержать в одной точке программы строку, а в другой - целое число. Код и данные также часто бывают взаимозаменяемы, так что программа может генерировать другую программу - и сразу же запускать ее исполнение. Обычно языки описания сценариев используют переменные строковых типов, которые обеспечивают единообразный механизм представления для различных сущностей. Отсутствие в языке деления переменных на типы упрощает соединение компонентов между собой. Нет априорных ограничений на то, каким образом может использоваться тот или иной элемент, а все компоненты значения представляются в едином формате. Таким образом, компонент или значение могут быть использованы в любой ситуации; будучи спроектированы для одних способов применения, они могут оказаться задействованы совершенно иными, о которых их создатель никогда не помышлял. Например, в UNIX - оболочках работа любой программы - фильтра включает чтение данных из входного потока и запись их в выходной поток. Любые две такие программы могут быть связаны путем назначения выходного потока одной в качестве входного потока другой. Следующая команда оболочки представляет систему из трех фильтров, подсчитывающую в выделенном фрагменте текста строки, содержащие слово “scripting”: Select | grep scripting | WC Программа select считывает текст, выделенный в данный момент на экране, и выводит его свои выходной поток; фильтр grep считывает входной поток и пропускает на выход строки, содержащие слово “scripting”; а программа wc подсчитывает число строк в своем потоке. Любой из подобных компонентов может найти применение во множестве различных ситуации, решая каждый раз иную общую задачу. Сильная типизация языков программирования системного уровня затрудняет повторное использование кода. Она поощряет программистов к созданию большого количества несовместимых друг с другом интерфейсов, каждый из которых требует применение объектов своего типа. Компилятор не позволяет объектам других типов взаимодействовать с этим интерфейсом, не смотря на то, что результат, мог бы оказаться и весьма полезным. Таким образом, чтобы использовать новый объект с существующем интерфейсом, программисту приходится писать “переходник”, преобразующий объект к типу, на который рассчитан интерфейс. А применение “переходника” требует, в свою очередь, перекомпиляции части или даже всего приложения целиком. Доминирующий в настоящее время способ распространения ПО в виде двоичных файлов делает этот подход невозможным. Чтобы оценить преимущества бес типового языка программирования, рассмотрим следующий пример на языке Tcl: Button .b -text Hello! -font {Times 16} - command {puts hello} Эта команда создает на экране новую кнопку с надписью на ней Hello! шрифтом Times 16 пунктов, при нажатии, на которую выводится короткое сообщение hello . В одной строке здесь уместилось шесть элементов различных типов: название команды (button), название кнопки (. b), идентификаторы атрибутов (-text, -font, -command), простые строки (Hello! hello), спецификация шрифта (Times 16), состоящая из названия начертания (Times) и размера в пунктах (16), а также целый Tcl-сценарий (puts hello). Все элементы представляются единообразно - в виде строк. В данном примере атрибуты могли быть перечислены в произвольном порядке, а неупомянутым атрибутам (их насчитывается более двадцати) будут присвоены значения по умолчанию. В случае реализации на Java тот же самый пример потребовал бы семи строк кода, составляющих два метода. Для С++ с использованием библиотеки Microsoft Foundation Classes (MFC) масштабы увеличились примерно до двадцати пяти строк кода, образующих три процедуры. Один только выбор шрифта требует нескольких обращении к функциямMFC Cfont *fontPtr=new Cront (); fontPtr->Crete Font (16, 0, 0, 0, 700, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH| FF_DONTCARE, “Times New Roman”); buttonPtr->SetFont(fontPtr); Можно было бы обойтись без значительной части этого кода, если бы не строгая типизация. Чтобы задать шрифт для кнопки, необходимо обратиться к методу Set Font; однако он требует передачи в качестве аргумента указателя на объект Cfont. Приходиться объявлять и инициализировать новый объект. Инициализацию объекта Cfont выполняет его метод Create Font, который имеет жесткий интерфейс, требующий задания 14 различных аргументов. В TCL существенные характеристики шрифта (начертание Times и кегль 16 пунктов) могут быть указаны непосредственно без каких-либо объявлений или преобразовании. Более того, TCL позволяет описать и поведение кнопки непосредственно в теле создающей ее команды, тогда как в С++ или Java для этого необходим отдельный метод [3]. 3.1.4. Другие языки Существует огромное количество атрибутов, помимо степени строгости контроля типов или уровня языка, и есть очень много интересных примеров, которые не могут быть однозначно отнесены к одной из двух рассмотренных нами категории. Например, семейство Lisp занимает некоторое промежуточное положение, обладая атрибутами языков описания сценариев и языков программирования системного уровня. В Lisp впервые были реализованы такие концепции, как интерпретация и динамический контроль типов, которые широко используются в современных языках описания сценариев, А также автоматическое управление хранением и интегрированные среды разработки, применяемые в языках обеих категории [7]. 3.2. Обоснование выбора языка программирования Visual Basic Исходя из поставленной задачи и смотря на большой выбор языков и средств программирования и создания программного обеспечения мой выбор пал на язык Visual Basic и среду разработки программного обеспечения Microsoft Visual Basic 6.0 Professional Edition. Выбор этот я сделал по следующим причинам: - данная среда разработки поддерживает все современные технологии программирования и разработки, описанные ниже (такие как методология RAD); - данная среда разработки имеет легкий для понимания интерфейс, содержит встроенную справку по всем функциям и объектам языка (браузер объектов); - содержит в себе помощники быстрого создания интерфейса приложения; - главное окно уже содержит дочернее окно, содержащее набор стандартных инструментов (кнопка, надпись, текстовое поле, таймер, поле со списком, раскрывающийся список, вертикальную и горизонтальную полосы прокрутки, два различных поля с изображением и некоторые другие); - так же в главном окне содержится окно просмотра проекта, браузер всех свойств выбранного элемента управления и окно положения формы проекта на экране монитора; - содержит меню, при помощи которого можно легко запустить, приостановить работу или откомпилировать проект, вызвать редактор меню, при помощи которого можно добавлять на форму проекта новые меню и редактировать старые, управлять проектом добавляя к нему новые формы, модули, классы и еще много других возможностей, которые можно выполнить при помощи меню. - из всех языков программирования данный язык наиболее подходит для разработки подобного рода программного обеспечения, поскольку содержит наиболее полный набор необходимых процедур и возможностей а также имеет расширение для применения стандартных функции среды Windows, так называемых API функций, позволяющих расширить возможности языка программирования и получить доступ ко многим функциям и средствам недоступным ни одному из существующих на данный момент средам разработки; - к тому же данный язык программирования и среду разработки я знаю наиболее хорошо из всех мною изучаемых и знакомых сред. 3.2.1. Достоинства Visual Basic Хотя программная оболочка Visual Basic выполнена полностью графической, а сам язык программирования весьма далек от языка, применяемого для ранних версий интерпретаторов Basic , простота и элегантность Basic осталась в большой мере присущей и новым версиям. Широкие возможности Visual Basic и его простота послужили основной причиной для выбора его в качестве языка программирования для создания таких Windows-приложений как Excel. Среда программирования Visual Basic содержит все необходимые инструменты для быстрого и эффективного создания мощных программ, работающих в среде Windows. Инструменты, имеющиеся в среде программирования Visual Basic, помогают при конструировании Basic-программ. Строка Меню обеспечивает доступ к большинству команд, управляющих средой программирования. Меню и команды работают в соответствии со стандартными соглашениями, общими для всех приложений Windows. Под строкой меню имеется панель инструментов - набор кнопок, являющихся ярлыками для команд, с помощью которых осуществляется работа в среде Visual Basic. В нижней части экрана расположена панель задач. Её можно использовать для переключения между компонентами Visual Basic или для активации других приложений Windows. Также имеется окно инструментов (Toolbox), окно содержания проекта (Project Container) , окно формы(Form) , окно проекта(Project), окно непосредственного выполнения(Immediate), окно свойств(Properties) и окно макета формы(Form layout). Файлы проектов Visual Basic имеют расширения .vbp, .wak, .vbg в имени файла. В среде Visual Basic имеется 7 инструментов. Форма Visual Basic - это окно в интерфейсе пользователя. Инструменты и средства управления на панели служат для того, чтобы добавлять новые элементы пользовательского интерфейса. Панель инструментов содержит также средства управления для создания объектов, выполняющих специальные “за экранные” операции: управление информацией в базе данных, контроль временных интервалов и т.д. Окно Properties (Свойства) позволяет изменять характеристики (установки) элементов пользовательского интерфейса в форме. Окно свойств содержит список всех объектов, использующихся в данном пользовательском интерфейсе. Здесь также могут перечисляться изменяемые установки свойств для каждого объекта. Visual Basic - программа состоит из нескольких файлов, которые собираются вместе, когда программа готова. В окне Project перечисляются все файлы, используемые при программировании. Файлы проекта содержат список всех поддерживаемых файлов и программ проекта и их расширение vbp (Visual Basic program). В Visual Basic 6 в окно Project можно одновременно загрузить несколько файлов проектов. В Visual Basic предусмотрена оперативная справочная система, включающая информацию о среде программирования, инструментах и языке программирования Visual Basic. Средства управления. С их помощью создаются объекты и формы, выводится информация в текстовом блоке, просматриваются диски и папки в системе, обрабатываются данные, вводимые пользователем, запускаются Windows-приложения и просматриваются записи баз данных. Язык программирования Visual Basic содержит несколько сотен инструкций, функций и специальных символов. Он предназначен не только для использования в программном продукте Visual Basic, Microsoft Visual Basic for Application включен в состав Microsoft Excel, Microsoft Word, Microsoft Access, Microsoft PowerPoint, Microsoft Project и других приложений для Windows. Переменные и операторы. Visual Basic позволяет резервировать переменные с указанием размера и без оного, работать с различными типами данных, использовать константы, работать с математическими операторами и функциями, использовать дополнительные операторы. Предусмотрено использование операторов циклов For..Next, Do, объектов типа “таймер” (невидимый секундомер в программе). Точность установления времени в программе составляет 1 миллисекунду, или 1/1000 сек. Запущенный таймер постоянно работает - т.е. выполняется соответствующая процедура обработки прерывания через заданный интервал времени - до тех пор, пока пользователь не остановит таймер или не отключит программу. 3.2.2. Методология RAD Одним из возможных подходов к разработке ПО в рамках спиральной модели ЖЦ является получившая в последнее время широкое распространение методология быстрой разработки приложений RAD (Rapid Application Development). Под этим термином обычно понимается процесс разработки ПО, содержащий 3 элемента: - небольшую команду программистов (от 2 до 10 человек); - короткий, но тщательно проработанный производственный график (от 2 до 6 мес.); - повторяющийся цикл, при котором разработчики, по мере того, как приложение начинает обретать форму, запрашивают и реализуют в продукте требования, полученные через взаимодействие с заказчиком. Команда разработчиков должна представлять из себя группу профессионалов, имеющих опыт в анализе, проектировании, генерации кода и тестировании ПО с использованием CASE-средств. Члены коллектива должны также уметь трансформировать в рабочие прототипы предложения конечных пользователей. Жизненный цикл программного обеспечения по методологии RAD состоит из четырех фаз: - фаза анализа и планирования требований; - фаза проектирования; - фаза построения; - фаза внедрения. На фазе анализа и планирования требований пользователи системы определяют функции, которые она должна выполнять, выделяют наиболее приоритетные из них, требующие проработки в первую очередь, описывают информационные потребности. Определение требований выполняется в основном силами пользователей под руководством специалистов-разработчиков. Ограничивается масштаб проекта, определяются временные рамки для каждой из последующих фаз. Кроме того, определяется сама возможность реализации данного проекта в установленных рамках финансирования, на данных аппаратных средствах и т.п. Результатом данной фазы должны быть список и приоритетность функций будущей ИС, предварительные функциональные и информационные модели ИС. На фазе проектирования часть пользователей принимает участие в техническом проектировании системы под руководством специалистов-разработчиков. CASE-средства используются для быстрого получения работающих прототипов приложений. Пользователи, непосредственно взаимодействуя с ними, уточняют и дополняют требования к системе, которые не были выявлены на предыдущей фазе. Более подробно рассматриваются процессы системы. Анализируется и, при необходимости, корректируется функциональная модель. Каждый процесс рассматривается детально. При необходимости для каждого элементарного процесса создается частичный прототип: экран, диалог, отчет, устраняющий неясности или неоднозначности. Определяются требования разграничения доступа к данным. На этой же фазе происходит определение набора необходимой документации. После детального определения состава процессов оценивается количество функциональных элементов разрабатываемой системы и принимается решение о разделении ИС на подсистемы, поддающиеся реализации одной командой разработчиков за приемлемое для RAD-проектов время - порядка 60 - 90 дней. С использованием CASE-средств проект распределяется между различными командами (делится функциональная модель). Результатом данной фазы должны быть: - общая информационная модель системы; - функциональные модели системы в целом и подсистем, реализуемых отдельными командами разработчиков; - точно определенные с помощью CASE-средства интерфейсы между автономно разрабатываемыми подсистемами; - построенные прототипы экранов, отчетов, диалогов. Все модели и прототипы должны быть получены с применением тех CASE-средств, которые будут использоваться в дальнейшем при построении системы. Данное требование вызвано тем, что в традиционном подходе при передаче информации о проекте с этапа на этап может произойти фактически неконтролируемое искажение данных. Применение единой среды хранения информации о проекте позволяет избежать этой опасности. В отличие от традиционного подхода, при котором использовались специфические средства прототипирования, не предназначенные для построения реальных приложений, а прототипы выбрасывались после того, как выполняли задачу устранения неясностей в проекте, в подходе RAD каждый прототип развивается в часть будущей системы. Таким образом, на следующую фазу передается более полная и полезная информация. На фазе построения выполняется непосредственно сама быстрая разработка приложения. На данной фазе разработчики производят итеративное построение реальной системы на основе полученных в предыдущей фазе моделей, а также требований нефункционального характера. Программный код частично формируется при помощи автоматических генераторов, получающих информацию непосредственно из репозитория CASE-средств. Конечные пользователи на этой фазе оценивают получаемые результаты и вносят коррективы, если в процессе разработки система перестает удовлетворять определенным ранее требованиям. Тестирование системы осуществляется непосредственно в процессе разработки. После окончания работ каждой отдельной команды разработчиков производится постепенная интеграция данной части системы с остальными, формируется полный программный код, выполняется тестирование совместной работы данной части приложения с остальными, а затем тестирование системы в целом. Завершается физическое проектирование системы: - определяется необходимость распределения данных; - производится анализ использования данных; - производится физическое проектирование базы данных; - определяются требования к аппаратным ресурсам; - определяются способы увеличения производительности; - завершается разработка документации проекта. Результатом фазы является готовая система, удовлетворяющая всем согласованным требованиям. На фазе внедрения производится обучение пользователей, организационные изменения и параллельно с внедрением новой системы осуществляется работа с существующей системой (до полного внедрения новой). Так как фаза построения достаточно непродолжительна, планирование и подготовка к внедрению должны начинаться заранее, как правило, на этапе проектирования системы. Приведенная схема разработки ИС не является абсолютной. Возможны различные варианты, зависящие, например, от начальных условий, в которых ведется разработка: разрабатывается совершенно новая система; уже было проведено обследование предприятия и существует модель его деятельности; на предприятии уже существует некоторая ИС, которая может быть использована в качестве начального прототипа или должна быть интегрирована с разрабатываемой. Следует, однако, отметить, что методология RAD, как и любая другая, не может претендовать на универсальность, она хороша в первую очередь для относительно небольших проектов, разрабатываемых для конкретного заказчика. Если же разрабатывается типовая система, которая не является законченным продуктом, а представляет собой комплекс типовых компонент, централизованно сопровождаемых, адаптируемых к программно-техническим платформам, СУБД, средствам телекоммуникации, организационно-экономическим особенностям объектов внедрения и интегрируемых с существующими разработками, на первый план выступают такие показатели проекта, как управляемость и качество, которые могут войти в противоречие с простотой и скоростью разработки. Для таких проектов необходимы высокий уровень планирования и жесткая дисциплина проектирования, строгое следование заранее разработанным протоколам и интерфейсам, что снижает скорость разработки. Методология RAD неприменима для построения сложных расчетных программ, операционных систем или программ управления космическими кораблями, т.е. программ, требующих написания большого объема (сотни тысяч строк) уникального кода. Не подходят для разработки по методологии RAD приложения, в которых отсутствует ярко выраженная интерфейсная часть, наглядно определяющая логику работы системы (например, приложения реального времени) и приложения, от которых зависит безопасность людей (например, управление самолетом или атомной электростанцией), так как итеративный подход предполагает, что первые несколько версий наверняка не будут полностью работоспособны, что в данном случае исключается. Оценка размера приложений производится на основе так называемых функциональных элементов (экраны, сообщения, отчеты, файлы и т.п.) Подобная метрика не зависит от языка программирования, на котором ведется разработка. Размер приложения, которое может быть выполнено по методологии RAD, для хорошо отлаженной среды разработки ИС с максимальным повторным использованием программных компонентов, показано в таблице 3.1. Таблица 3.1. |
< 1000 функциональных элементов | один человек | | 1000-4000 функциональных элементов | одна команда разработчиков | | > 4000 функциональных элементов | 4000 функциональных элементов на одну команду разработчиков | | |
В качестве итога перечислим основные принципы методологии RAD: - разработка приложений итерациями; - необязательность полного завершения работ на каждом из этапов жизненного цикла; - обязательное вовлечение пользователей в процесс разработки ИС; - необходимое применение CASE-средств, обеспечивающих целостность проекта; - применение средств управления конфигурацией, облегчающих внесение изменений в проект и сопровождение готовой системы; - необходимое использование генераторов кода; - использование прототипирования, позволяющее полнее выяснить и удовлетворить потребности конечного пользователя; - тестирование и развитие проекта, осуществляемые одновременно с разработкой; - ведение разработки немногочисленной хорошо управляемой командой профессионалов; - грамотное руководство разработкой системы, четкое планирование и контроль выполнения работ. 3.2.3. Методология функционального моделирования SADT. Методология SADT разработана Дугласом Россом и получила дальнейшее развитие в работе. На ее основе разработана, в частности, известная методология IDEF0 (Icam DEFinition), которая является основной частью программы ICAM (Интеграция компьютерных и промышленных технологий), проводимой по инициативе ВВС США. Методология SADT представляет собой совокупность методов, правил и процедур, предназначенных для построения функциональной модели объекта какой-либо предметной области. Функциональная модель SADT отображает функциональную структуру объекта, т.е. производимые им действия и связи между этими действиями. Основные элементы этой методологии основываются на следующих концепциях: - графическое представление блочного моделирования. Графика блоков и дуг SADT-диаграммы отображает функцию в виде блока, а интерфейсы входа/выхода представляются дугами, соответственно входящими в блок и выходящими из него. Взаимодействие блоков друг с другом описываются посредством интерфейсных дуг, выражающих "ограничения", которые в свою очередь определяют, когда и каким образом функции выполняются и управляются; - строгость и точность. Выполнение правил SADT требует достаточной строгости и точности, не накладывая в то же время чрезмерных ограничений на действия аналитика. Правила SADT включают: - ограничение количества блоков на каждом уровне декомпозиции (правило 3-6 блоков); - связность диаграмм (номера блоков); - уникальность меток и наименований (отсутствие повторяющихся имен); - синтаксические правила для графики (блоков и дуг); - разделение входов и управлений (правило определения роли данных). - отделение организации от функции, т.е. исключение влияния организационной структуры на функциональную модель. Методология SADT может использоваться для моделирования широкого круга систем и определения требований и функций, а затем для разработки системы, которая удовлетворяет этим требованиям и реализует эти функции. Для уже существующих систем SADT может быть использована для анализа функций, выполняемых системой, а также для указания механизмов, посредством которых они осуществляются. 4. Описание программного продукта «ПК инфо» 4.1. Алгоритм программного продукта При запуске программного продукта на экране отображается главное окно программы, находится оно по центру экрана для большего удобства. При щелчке левой клавиши мыши на одной из кнопок запускается дочернее окно, которое в зависимости от того какой модуль вы запустили может либо отображать информацию о модуле, либо его тестировать, либо открывать и отображать один из системных файлов, либо открывать стандартные диалоговые окна операционной системы (приложение 1). - Работа модуля «Память». При отображении на экране главного окна программы, Вы щелкаете левой клавишей мыши на кнопку «Память» во фрейме информационных модулей, после нажатия на кнопку, главное окно становится неактивным и передает работу окну свойств памяти компьютера, которое загружается и отображается на экране поверх главного окна программы. Отображение свойств физической и виртуальной памяти компьютера осуществляется при помощи специализированной API-функции - GlobalMemoryStatus, которая имеет ряд свойств. Поскольку свойства памяти могут меняться с течением достаточно небольших промежутков времени, то при помощи специального элемента управления «таймер», который повторяет обработку своей процедуры по истечении определенного промежутка времени, производится динамическое обновление API-функции - GlobalMemoryStatus и в связи с этим информация о памяти постоянно обновляется (приложение 2). - Работа модуля «Логические диски». При щелчке левой клавиши мыши на кнопке информационного модуля «Локальные диски», главная форма передает дочерней форме свойств дисковых устройств тип устройства и становится неактивной. Далее дочерняя форма свойств дисковых устройств загружается в память, отображается на экране и обрабатывает тип устройства (в данном случае это локальные диски). При выдаче информации о дисковых устройствах задействуется очень сложный программный код, который задействует семь API-функции (FindFirstFile FindNextFile lstrlen GetLogicalDrives GetDriveType GetVolumeInformation GetDiskFreeSpace) и цикл в результате которого выдается информация о полном объеме диска (сделано это потому что не существует специальных функций для отображения полного объема диска). Алгоритм работы информационных модулей «Съемные диски» и «CD и DVD» аналогичен работе алгоритма информационного модуля логических дисков (приложение 3). - Работа модуля «Дисплей». При щелчке на кнопку данного информационного модуля так же загружается дочернее окно свойств видео системы и монитора компьютера. Здесь задействованы две API-функции - GetDeviceCaps и EnumDisplaySettings содержащие много параметров. При их вызове необходимые параметры заносятся в надписи на форме и список (допустимые режимы монитора). Программный код данного модуля описан в приложении 4. - Работа модуля «Сеть». Алгоритм данного модуля является самым сложным в данном проекте, и был определен в отдельный проект. Суть его заключается в применении различных функций, как внутренних языка программирования так и API-функций для отображения полной информации о локальной сети компьютера, если таковая есть. - Работа модуля «Процессы». Задача данного модуля отобразить все запущенные в данный момент на компьютере процессы (резидентные программы, приложения пользователя). Осуществляется это при помощи трех API-функций (CreateToolhelpSnapshot, Process32First и Process32Next), данные функции при совместной работе за один их вызов могут вернуть имя лишь одного рабочего процесса, поэтому чтобы отобразить список всех процессов их вызов помещен в цикл, условием окончания которого является возвращение функцией «Process32First» параметра со значением логического выражения «ложь», что свидетельствует об окончании перебора списка рабочих процессов. - Тесты съемных и логических дисков работают по принципу создания на тестируемом диске файла определенного объема (для локальных дисков - один мегабайт, для съемных дисков, поскольку они обычно меньшего объема нежели логические - сто килобайт) и вычислении времени, которое ушло на создание данного файла, исходя из которого вычисляется скорость записи данных на диск. Далее уже созданный файл программа считывает и исходя из времени на считывание данного файла высчитывается скорость доступа (чтения) к данным с диска. Эти две процедуры повторяются определенное количество раз (для локальных дисков обе процедуры повторяются по десять раз, а для съемных дисков процедура записи производится один раз а чтение четыре раза) дабы вычислить среднюю скорость чтения и записи и уменьшить погрешность в ходе тестов. При тестах не рекомендуется производить за компьютером других действий (запуск программ, движение мышью), дабы исключить погрешности связанные с работой других программ и устройств, ведь они тоже занимают некоторое время процессора и работают с дисками. - При запуске листингого модуля главное окно программы передает имя системного файла дочернему окну. Дочернее окно обрабатывает данные имени файла и открывает для просмотра в текстовом поле формы листинга необходимого файла (приложение 5). Запуск дополнительных модулей осуществляется при помощи массива кнопок «Command8». При обработке нажатия на одну из этих кнопок программа отслеживает индекс кнопки из массива и по этому индексу определяет, какое диалоговое окно отобразить. Отображение необходимых диалоговых окон осуществляется через функцию языка программирования Visual Basic «Shell», которая запускает программу rundll32.exe в различной конфигурации и в зависимости от конфигурации на экране появляются необходимые диалоговые окна. 4.2. Руководство пользователя Основное окно программы разделено на четыре подокна (рамки), в каждом из которых объединены по одному назначению (выдача информации, тест, листинг системного файла, стандартные системные модули Windows) модули отдельных устройств или систем устройств персонального компьютера: - Информационные модули - выдают различную информацию (объем памяти, качество цвета и т. д.); - Тестовые модули - тестирование отдельных модулей (логических и съемных дисков); - Листинговые модули - показ листинга системного файла (boot.ini, autoexec.bat и др.); - Дополнительные модули - стандартные модули в составе операционной системы Windows (дата и время, свойства системы и др.). Объединены они для большего удобства и дабы не запутать пользователя, что он будет запускать. Рамка (в дальнейшем «фрейм») «Информационные модули» содержит следующий перечень модулей о которых при нажатии на кнопку модуля будет выдана информация: - Память - информация о физической памяти компьютера (полный объем, загруженность памяти и свободное пространство а так же процент используемой памяти) и сведения о файле подкачки (полный объем и др. характеристики); - Логические диски - показывает информацию о количестве и буквенном значении логических дисков установленных на персональном компьютере, отдельно для каждого (если логический диск на компьютере не один) тип устройства, тип файловой системы на диске, полный его объем, занятое и свободное пространство, процент занятого объема, а так же системная информация такая, как количество кластеров и секторов и др. - Съемные диски - показывает аналогичную информацию, что и модуль «Логические диски», но для съемных дисков установленных на компьютере, при этом диск должен находиться в дисководе, в противном случае программа попросит его установить. - CD и DVD - показывает аналогичную информацию, что и два предыдущих модуля, но для CD или DVD устройств, если таковые установлены на персональном компьютере пользователя. - Дисплей - выдает информацию о расширении экрана по горизонтали и вертикали в пикселях и миллиметрах, качество цветопередачи и количестве цветов, а так же частоту обновления экрана в Герцах и содержит список всех возможных режимов экрана доступных для дисплея. - Сеть - показывает различную информацию о конфигурации сети компьютера. Содержит информацию об IP-адресе в десятичной и двоичной форме записи, маску подсети и другие параметры. - Процессы - отображает список работающих программ, запущенных окон и служб работающих в фоновом режиме. Фрейм «Тестовые модули» содержит два теста, это тест логических дисков и съемных дисков. Данные тесты показывают скорость устройств при записи на них и чтении. Фрейм с листинговыми модулями содержит пять кнопок для отображения листинга системных файлов boot.ini, system.ini, win.ini, autoexec.nt и config.nt, в данных файлах содержится системная информация загрузки и настроек операционной системы. Фрейм с дополнительными модулями при нажатии на одну из кнопок (назначение кнопок по надписи на них) отображают стандартные диалоговые окна операционной системы Windows, такие как: - Свойства системы; - Установка и удаление программ; - Язык и региональные стандарты; - Свойства экрана; - Свойства Интернет-браузера; - Свойства даты и времени; - Свойства клавиатуры; - Свойства мыши; - Свойства модема (если есть модем и он подключен и установлен); - Свойства звука, речи и аудиоустройств (если на персональном компьютере установлена звуковая плата). При запуске программы отображается главное окно (см. Рис. 4.1) Рис. 4.1. Интерфейс главного окна программного продукта. с перечнем возможных модулей. При щелчке левой клавиши мыши на одной из кнопок запускается дочернее окно, которое в зависимости от того какой модуль вы запустили может либо отображать информацию о модуле, либо его тестировать, либо открывать и отображать один из системных файлов, либо открывать стандартные диалоговые окна операционной системы. Работу информационного модуля можно описать на примере модуля - «Память»: При отображении на экране главного окна программы, Вы щелкаете левой клавишей мыши на кнопку «Память» во фрейме информационных модулей, после нажатия на кнопку главное окно становится неактивным и загружается окно свойств памяти компьютера (Рис 4.2). Рис. 4.2. Пример работы программного продукта (отображение модуля «Память»). На этой форме находятся два фрейма: Frame1 и Frame2, в первом фрейме находятся текстовые поля, которые отображают информацию о физической памяти, во втором фрейме текстовые поля отображают состояние виртуальной памяти. Вся эта информация получается при помощи специальной API-функции - GlobalMemoryStatus. Вся информация о состоянии памяти отображается динамически, постоянно обновляясь, это достигается при помощи невидимого объекта таймера Тест дисков (будь то съемные или логические) отображает среднюю скорость записи данных на устройство и скорость чтения с него. Интерфейс окна теста локальных дисков показан на рисунке 4.3. Рис. 4.3. Интерфейс окна тестирования дисковых устройств. При щелчке на кнопку теста программа обрабатывает, на какую из кнопок нажали, если был вызван тест съемных дисков, то в дочернюю программу передается тип устройства «съемные диски». Далее главная форма становится неактивной и передает управление форме теста дисков, которая обрабатывает тип устройств и в зависимости от типа начинает тестирование. Для листинговых модулей тоже создана одна отдельная форма, поскольку и здесь отображается сходная информация и при этом нет необходимости для каждого файла создавать отдельное окно и нагружать при этом системные ресурсы. Окно листинга системных файлов выглядит так, как показано на рисунке 4.4. При щелчке левой клавишей мыши на одну из кнопок необходимого листингового модуля, главное окно лишь передает имя файла дочернему листинговому окну, которое обрабатывает имя файла и открывает его с диска для просмотра. В случае если необходимого файла нет на диске, программа выдаст сообщение об ошибке, поскольку данный файл не найден. Рис. 4.4. Интерфейс окна листинга системных файлов. Дополнительные модули - это стандартные диалоговые окна операционной системы Windows, такие как «свойства системы», «установка и удаление программ» и др. Пример того как с помощью дополнительного модуля «Свойства экрана», можно открыть окно «свойства: экран» и установить изображение на рабочий стол и произвести другие настройки показан на рисунке 4.5. Так же в программе было реализовано меню, которое позволяет выйти из программы, запустить один из модулей будь то информационный модуль, тестовый, листинговый или дополнительный, позволяет отображать только один из фреймов с необходимыми вам модулями или же отображает все фреймы со всеми модулями, а так позволяет получить справку о программе. Пример работы с меню программного продукта показан на рисунке 4.6. Рис. 4.5. Пример запуска окна «Свойства: Экран». Рис. 4.6. Работа меню программы. Заключение Анализируя данный программный продукт можно смело заявить, что с поставленной задачей я справился, однако это не значит, что программа полностью готова и ей уже не требуются доработки, скорее наоборот, данный программный продукт будет совершенствоваться и расширяться, в нем будут появляться все новые и новые возможности. На данном этапе программа в версии 1.0.1 практически полностью удовлетворяет поставленной задаче. Программа работает правильно и без сбоев. Как и рассчитывалось она не особо требовательна к системным ресурсам, будь то память или область жесткого диска. Однако на данном этапе есть ее некоторые недостатки, а именно данный программный продукт содержит не так много модулей для выдачи информации и особенно мало тестов. Однако я уверен что в дальнейшем этот недостаток будет исправен и будут появляться новые версии программы, которые будут содержать в себе больше информационных и тестовых модулей, будет проведена работа по усовершенствованию, нормализации и упрощению программного кода, который приведет к меньшему объему всей программы и к ее более быстрой работе. Для программы будет создан удобный установщик, который поможет легко и правильно установить программу обычным пользователем. Данный программный продукт смогут без труда применять простые пользователи персональных компьютеров, дабы расширить знания о своем персональном компьютере и о персональных компьютерах вообще. К тому же я не исключаю возможности применения данного программного продукта в сфере обучения, ведь он позволяет показывать различную информацию об отдельных модуля и системах персонального компьютера, а так же работать с системными файлами и стандартными диалоговыми окнами настройки операционной системы Windows. К тому же данный программный продукт на сегодняшний день является бесплатным программным обеспечением и это дает возможность работы с ней любому желающему пользователю персонального компьютера не затрачивая на это деньги. Сделано это еще для того чтобы программный продукт распространялся наиболее широко и завоевывал популярность среди программного обеспечения поскольку на данный момент программное обеспечение зачастую стоит не дешево и порой пользователи не могут позволить себе приобрести дорогостоящую программу, а мой программный продукт дает пользователю выбор - либо приобретать за определенную сумму программу, которая хоть и по объему информации и тестов немного больше, но работает медленно а иногда и вовсе некорректно, потребляет много системных ресурсов, либо взять бесплатно мой программный продукт, который работает быстро и нетребователен к ресурсам персонального компьютера. В ближайшее время я собираюсь распространять данный программный продукт через интернет на своем личном сайте, на котором уже находится не одна из моих разработок и надеюсь, что он займет достойное место среди программных продуктов подобного рода, тем более, что сейчас таких программ очень мало. Список используемой литературы1. Вендров А.М. Один из подходов к выбору средств проектирования баз данных и приложений. "СУБД", 2003, №3. 2. Зиндер Е.З. Бизнес-реинжиниринг и технологии системного проектирования. Учебное пособие. М., Центр Информационных Технологий, 20003. Калянов Г.Н. CASE. Структурный системный анализ (автоматизация и применение). М., "Лори", 1999. 4. Международные стандарты, поддерживающие жизненный цикл программных средств. М., МП "Экономика", 1998 5. Новоженов Ю.В. Объектно-ориентированные технологии разработки сложных программных систем. М., 1999. 6. Панащук С.А. Разработка информационных систем с использованием CASE-системы Silverrun. "СУБД", 1998, №3. 7. Горчинская О.Ю. Designer/2000 - новое поколение CASE-продуктов фирмы ORACLE. "СУБД", 2000, №3. 8. Горин С.В., Тандоев А.Ю. CASE-средство S-Designor 4.2 для разработки структуры базы данных. "СУБД", 2002, №1. 9. Петров Ю.К. JAM - инструментальное средство разработки приложений в информационных системах архитектуры "клиент/сервер", построенных на базе РСУБД. "СУБД", 2002, №3.10. Ахметов К.С. Курс молодого бойца. Изд. 5-е, перераб. и доп. - М.: Компьютер Пресс, 1998. - 365с.: ил.11. Олифер В.Г. Сетевые операционные системы. СПб.:Питер, 2002.-538с.ПриложенияПриложение 1 (Листинг модуля главного окна программы)Option ExplicitPrivate Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As LongPublic FileListName As String 'для передачи имени файла для листингаPublic NumDrive As Byte 'для передачи информации о типе дисковDim sDir As String, sTemp As String * 256, nSize As LongPrivate Sub AutoexecNtCommand_Click()nSize = GetWindowsDirectory(sTemp, 255)sDir = Left(sTemp, nSize)FileListName = Left(sDir, 3) + "Autoexec.nt"Load FormListIniFormListIni.ShowEnd SubPrivate Sub BootIniCommand_Click()nSize = GetWindowsDirectory(sTemp, 255)sDir = Left(sTemp, nSize)FileListName = Left(sDir, 3) + "boot.ini"Load FormListIniFormListIni.ShowEnd SubPrivate Sub Command1_Click()Load FormInfoMemoryFormInfoMemory.ShowEnd SubPrivate Sub Command10_Click()NumDrive = 2Load FormTestFormTest.ShowEnd SubPrivate Sub Command2_Click()NumDrive = 3Load FormDisksFormDisks.ShowEnd SubPrivate Sub Command3_Click()NumDrive = 2Load FormDisksFormDisks.ShowEnd SubPrivate Sub Command4_Click()NumDrive = 5Load FormDisksFormDisks.ShowEnd SubPrivate Sub Command5_Click()Load FormDisplayFormDisplay.ShowEnd SubPrivate Sub Command6_Click()Call Shell(App.Path + "\NetProject\InfoNet.exe", vbNormalFocus)End SubPrivate Sub Command7_Click()Load FormProcFormProc.ShowEnd SubPrivate Sub Command8_Click(Index As Integer)Select Case IndexCase 0: Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0", 5)Case 1: Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1", 5)Case 2: Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0", 5)Case 3: Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0", 5)Case 4: Call Shell("rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,0", 5)Case 5: Call Shell("rundll32.exe shell32.dll,Control_RunDLL timedate.cpl", 5)Case 6: Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @1", 5)Case 7: Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @0", 5)Case 8: Call Shell("rundll32.exe shell32.dll,Control_RunDLL modem.cpl", 5)Case 9: Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1", 5)End SelectEnd SubPrivate Sub Command9_Click()NumDrive = 3Load FormTestFormTest.ShowEnd SubPrivate Sub ConfigNtCommand_Click()nSize = GetWindowsDirectory(sTemp, 255)sDir = Left(sTemp, nSize)FileListName = Left(sDir, 3) + "config.nt"Load FormListIniFormListIni.ShowEnd SubPrivate Sub MnuExit_Click()EndEnd SubPrivate Sub MnuHelpAbout_Click()Load FormAboutFormAbout.ShowEnd SubPrivate Sub SistemIniCommand_Click()nSize = GetWindowsDirectory(sTemp, 255)sDir = Left(sTemp, nSize)FileListName = sDir + "\system.ini"Load FormListIniFormListIni.ShowEnd SubPrivate Sub WinIniCommand_Click()nSize = GetWindowsDirectory(sTemp, 255)sDir = Left(sTemp, nSize)FileListName = sDir + "\win.ini"Load FormListIniFormListIni.ShowEnd SubПриложение 2 (Листинг модуля окна свойств памяти)Private Type MEMORYSTATUSdwLength As LongdwMemoryLoad As LongdwTotalPhys As LongdwAvailPhys As LongdwTotalPageFile As LongdwAvailPageFile As LongdwTotalVirtual As LongdwAvailVirtual As LongEnd TypePrivate Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)Dim MS As MEMORYSTATUSPrivate Sub Command1_Click()Unload MeEnd SubPrivate Sub Timer1_Timer()MS.dwLength = Len(MS)Call GlobalMemoryStatus(MS)With MS Text1(0).Text = Format$(.dwTotalPhys / 1024, "#,###") & " Kb" Text1(1).Text = Format$(.dwTotalPhys / 1024 - .dwAvailPhys / 1024, "#,###") & " Kb" Text1(2).Text = Format$(.dwAvailPhys / 1024, "#,###") & " Kb" Text1(3).Text = .dwMemoryLoad Text1(4).Text = Format$(.dwTotalPageFile / 1024, "#,###") & " Kb" Text1(5).Text = Format$(.dwAvailPageFile / 1024, "#,###") & " Kb" Text1(6).Text = Format$(.dwTotalVirtual / 1024, "#,###") & " Kb" Text1(7).Text = Format$(.dwAvailVirtual / 1024, "#,###") & " Kb"End WithEnd SubПриложение 3 (листинг модуля окна информации о дисках)Option ExplicitPrivate Const vbDot = 46Private Const MAXDWORD = &HFFFFFFFFPrivate Const MAX_PATH = 260Private Const INVALID_HANDLE_VALUE = -1Private Const FILE_ATTRIBUTE_DIRECTORY = &H10Private Type FILETIME dwLowDateTime As Long dwHighDateTime As LongEnd TypePrivate Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14End TypePrivate Type FILE_PARAMS bRecurse As Boolean nFileCount As Long nFileSize As Currency nSearched As Long sFileNameExt As String sFileRoot As StringEnd TypePrivate Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As LongPrivate Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As LongPrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As LongPrivate Declare Function GetLogicalDrives Lib "kernel32" () As LongPrivate Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As LongPrivate Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongPrivate Declare Function GetDiskFreeSpace Lib "kernel32.dll" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As LongPrivate Sub Command1_Click()Unload MeEnd SubPrivate Sub Command2_Click()Dim Serial As Long, VName As String, FSName As StringDim SecPerClus As Long ' число секторов в кластереDim BytePerSec As Long ' число байт в сектореDim FreeClus As Long ' число свободных кластеровDim TotalClus As Long ' общее число кластеровDim Retval As Long ' возвращаемое значениеDim Free As DoubleDim FP As FILE_PARAMSVName = String$(255, Chr$(0))FSName = String$(255, Chr$(0))'получаем информацию о дискеWith FP .sFileRoot = QualifyPath(Combo1.Text + "\") 'начальный путь .sFileNameExt = "*.*" 'нужные файлы .bRecurse = 1 'True = рекурсиейEnd WithCall GetDirectorySize(FP.sFileRoot, FP)GetVolumeInformation Combo1.Text + "\", VName, 255, Serial, 0, 0, FSName, 255Retval = GetDiskFreeSpace(Combo1.Text + "\", SecPerClus, BytePerSec, FreeClus, TotalClus)VName = Left$(VName, InStr(1, VName, Chr$(0)) - 1)FSName = Left$(FSName, InStr(1, FSName, Chr$(0)) - 1)Free = (FreeClus / 1000 * SecPerClus * BytePerSec) * 1000If MainForm.NumDrive = 2 Then Label1(0).Caption = "Тип устройства: Съемный диск"If MainForm.NumDrive = 3 Then Label1(0).Caption = "Тип устройства: Жесткий диск"If MainForm.NumDrive = 5 Then Label1(0).Caption = "Тип устройства: CD или DVD диск"Label1(1).Caption = "Полный объем: " + Format$(FP.nFileSize + Free, "#,###") & " байт" + " (" + Format$((FP.nFileSize + Free) / 1073741824, "###.#") + " Гбайт)"Label1(2).Caption = "Свобоный объем: " + Format$(Free, "#,###") & " байт" + " (" + Format$(Free / 1073741824, "###.#") + " Гбайт)"Label1(3).Caption = "Используемый объем: " + Format$(FP.nFileSize, "###,###,###,###") + " байт" + " (" + Format$(FP.nFileSize / 1073741824, "###.#") + " Гбайт)"Label1(4).Caption = "Файловая система: " + FSNameLabel1(5).Caption = "Число свободных кластеров: " + CStr(FreeClus)Label1(6).Caption = "Число секторов в кластере: " + CStr(SecPerClus)Label1(7).Caption = "Число байт в секторе: " + CStr(BytePerSec)Label1(8).Caption = "Общее число кластеров: " + CStr(TotalClus)ProgressBar1.Value = ((FP.nFileSize / (FP.nFileSize + Free)) * 100): Label2.Caption = CStr(CInt(ProgressBar1.Value)) + "%"End SubPrivate Sub Form_Load()Dim i As Byte, drivetype As Long, k As ByteFillCombo Combo1, TrueFor i = 0 To Combo1.ListCount - 1 Combo1.ListIndex = i drivetype = GetDriveType(Combo1.Text + "\") If drivetype = MainForm.NumDrive Then Combo1.AddItem Combo1.Text: k = k + 1Next iFor i = 0 To Combo1.ListCount - k - 1 Combo1.RemoveItem 0Next iCombo1.ListIndex = 0Call Command2_ClickEnd SubPrivate Sub FillCombo(cbo As ComboBox, ByVal bUsed As Boolean)Dim DriveNum As Longcbo.ClearFor DriveNum = 0 To 25 If CBool(GetLogicalDrives And (2 ^ DriveNum)) = bUsed Then cbo.AddItem Chr$(Asc("A") + DriveNum) & ":" End IfNext DriveNumEnd SubPrivate Sub GetDirectorySize(sRoot As String, FP As FILE_PARAMS)Dim wfd As WIN32_FIND_DATADim hFile As LonghFile = FindFirstFile(sRoot & "*.*", wfd)If hFile <> INVALID_HANDLE_VALUE Then Do If Asc(wfd.cFileName) <> vbDot Then If (wfd.dwFileAttributes And vbDirectory) Then If FP.bRecurse Then GetDirectorySize sRoot & TrimNull(wfd.cFileName) & "\", FP End If 'If fp.bRecurse Else FP.nFileCount = FP.nFileCount + 1 FP.nFileSize = FP.nFileSize + ((wfd.nFileSizeHigh * (MAXDWORD + 1)) + wfd.nFileSizeLow) End If 'If WFD.dwFileAttributes End If 'If Asc(wfd.cFileName) FP.nSearched = FP.nSearched + 1 Loop While FindNextFile(hFile, wfd)End If 'If hFileEnd SubPrivate Function TrimNull(startstr As String) As StringTrimNull = Left$(startstr, lstrlen(StrPtr(startstr)))End FunctionPrivate Function QualifyPath(sPath As String) As StringIf Right$(sPath, 1) <> "\" Then QualifyPath = sPath & "\"Else QualifyPath = sPathEnd IfEnd FunctionПриложение 4 (листинг модуля окна свойств дисплея)Option ExplicitPrivate Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As LongPrivate Const DRIVERVERSION As Long = 0 'Версия драйвераPrivate Const TECHNOLOGY As Long = 2 'Классификация устройстваPrivate Const HORZSIZE As Long = 4 'Размер по горизонтали в мм.Private Const VERTSIZE As Long = 6 'Размер по вертикали в мм.Private Const HORZRES As Long = 8 'Размер по горизонтали в точкахPrivate Const VERTRES As Long = 10 'Размер по вертикали в точкахPrivate Const BITSPIXEL As Long = 12 'Кол-во бит на точкуPrivate Const PLANES As Long = 14 'Number of planesPrivate Const NUMBRUSHES As Long = 16 'Number of brushes the device hasPrivate Const NUMPENS As Long = 18 'Number of pens the device hasPrivate Const NUMMARKERS As Long = 20 'Number of markers the device hasPrivate Const NUMFONTS As Long = 22 'Number of fonts the device hasPrivate Const NUMCOLORS As Long = 24 'Макс. кол-во возможных цветовPrivate Const PDEVICESIZE As Long = 26 'Size required for device descriptoPrivate Const CURVECAPS As Long = 28 'Curve capabilitiesPrivate Const LINECAPS As Long = 30 'Line capabilitiesPrivate Const POLYGONALCAPS As Long = 32 'Polygonal capabilitiesPrivate Const TEXTCAPS As Long = 34 'Text capabilitiesPrivate Const CLIPCAPS As Long = 36 'Clipping capabilitiesPrivate Const RASTERCAPS As Long = 38 'Bitblt capabilitiesPrivate Const ASPECTX As Long = 40 'Length of the X legPrivate Const ASPECTY As Long = 42 'Length of the Y legPrivate Const ASPECTXY As Long = 44 'Length of the hypotenusePrivate Const SHADEBLENDCAPS As Long = 45 'Shading and blending caps (IE5)Private Const LOGPIXELSX As Long = 88 'Logical pixels/inch in XPrivate Const LOGPIXELSY As Long = 90 'Logical pixels/inch in YPrivate Const SIZEPALETTE As Long = 104 'Number of entries in physical palettePrivate Const NUMRESERVED As Long = 106 'Number of reserved entries in palettePrivate Const COLORRES As Long = 108 'Количество цветовPrivate Const VREFRESH As Long = 116 'Текущий рефрешь по вертикали в Гц '(только для монитора)Private Const DESKTOPVERTRES As Long = 117 'Размер десктопа по горизонталиPrivate Const DESKTOPHORZRES As Long = 118 'Размер десктопа по вертикалиPrivate Const BLTALIGNMENT As Long = 119 'Preferred blt alignment'Для списка режимовPrivate Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As BooleanPrivate Const CCDEVICENAME = 32Private Const CCFORMNAME = 32Private Type DEVMODE dmDeviceName As String * CCDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As LongEnd TypePrivate Sub Command1_Click()Unload MeEnd SubPrivate Sub Form_Load()Dim sBPPtype As StringDim sFreqtype As StringDim CurrBPP As LongDim CurrVFreq As Long'Подписываем глубину цвета для удобства чтенияCurrBPP = GetDeviceCaps(hdc, BITSPIXEL)Select Case CurrBPP Case 4: sBPPtype = "(16 цветов)" Case 8: sBPPtype = "(256 цветов)" Case 16: sBPPtype = "(High Color)" Case 24, 32: sBPPtype = "(True Color)"End SelectCurrVFreq = GetDeviceCaps(hdc, VREFRESH)Select Case CurrVFreq Case 0, 1: sFreqtype = "(Определяется адаптером)" Case Else: sFreqtype = "(Ручная настройка)"End Select Label1(0).Caption = "Разрешение по горизонтали: " & GetDeviceCaps(hdc, HORZRES) & " пикселей"Label1(1).Caption = "Разрешение по вертикали: " & GetDeviceCaps(hdc, VERTRES) & " пикселей"Label1(2).Caption = "Разрешение по горизонтали в миллиметрах: " & GetDeviceCaps(hdc, HORZSIZE) & " мм"Label1(3).Caption = "Разрешение по вертикали в миллиметрах: " & GetDeviceCaps(hdc, VERTSIZE) & " мм"Label1(4).Caption = "Качество цветопередачи: " & CurrBPP & " бит " & sBPPtypeLabel1(5).Caption = "Количество цветов: " & 2 ^ CurrBPPLabel1(6).Caption = "Частота обновления экрана: " & CurrVFreq & " Гц " & sFreqtype'Заполнение списка режимовEnumDisplay lstmodesEnd SubPrivate Sub EnumDisplay(displaylistbox As ListBox)Dim lTemp As Long, tDevMode As DEVMODE, lIndex As LonglIndex = 0Do lTemp = EnumDisplaySettings(0&, lIndex, tDevMode) If lTemp = 0 Then Exit Do With tDevMode displaylistbox.AddItem .dmPelsWidth & " x " & .dmPelsHeight & " , " & .dmBitsPerPel & " бит" End With lIndex = lIndex + 1LoopEnd SubПриложение 5 (листинг модуля окна тестирования дисков)Private Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As LongPrivate Declare Function GetLogicalDrives Lib "kernel32" () As LongPrivate Declare Function GetTickCount Lib "kernel32" () As LongDim TStart As Long 'переменная таймера только для этой процедурыDim TEnd As Long 'переменная таймера только для этой процедурыDim Zapis(9) As SingleDim Chten(9) As SingleDim AStart As SingleDim AEnd As SinglePrivate Sub Command1_Click()Dim i As Long, j As Byte, Tmp As Single, Str1 As StringIf MainForm.NumDrive = 3 Then AStart = GetTickCount() For j = 0 To 9 TStart = GetTickCount() Open Combo1.Text & "\proba.txt" For Output As 1 For i = 0 To 349524 Print #1, " " Next i Close 1 TEnd = GetTickCount() Zapis(j) = 1 / ((TEnd - TStart) / 2000) Next j For i = 0 To 9 Tmp = Tmp + Zapis(i) Next i Tmp = Tmp / 10 Label1.Caption = "Средняя скорость записи " & FormatNumber(Tmp, 3) & " Мб/сек" ProgressBar1.Value = Tmp For j = 0 To 9 TStart = GetTickCount() Open Combo1.Text & "\proba.txt" For Input As 1 Str1 = Len(Input(LOF(1), 1)) Close 1 TEnd = GetTickCount() Chten(j) = 1 / ((TEnd - TStart) / 1000) Next j For i = 0 To 9 Tmp = Tmp + Chten(i) Next i Tmp = Tmp / 10 Label2.Caption = "Средняя скорость чтения " & FormatNumber(Tmp, 3) & " Мб/сек" ProgressBar2.Value = Tmp AEnd = GetTickCount() Label3.Caption = "Общее время теста: " & FormatNumber(((AEnd - AStart) / 1000), 4) & " секунд" Label4.Caption = "Кол-во тестов: 10 на запись, 10 на чтение"End IfIf MainForm.NumDrive = 2 Then ProgressBar1.Max = 80 ProgressBar2.Max = 80 AStart = GetTickCount() TStart = GetTickCount() Open Combo1.Text & "\proba.txt" For Output As 1 For i = 0 To 349524 Print #1, " " Next i Close 1 TEnd = GetTickCount() Label1.Caption = "Cкорость записи " & FormatNumber(1 / ((TEnd - TStart) / 1000000), 3) & " Kb/sec" ProgressBar1.Value = 1 / ((TEnd - TStart) / 1000000)For j = 0 To 3 TStart = GetTickCount() Open Combo1.Text & "\proba.txt" For Input As 1 Str1 = Len(Input(LOF(1), 1)) Close 1 TEnd = GetTickCount() Chten(j) = 1 / ((TEnd - TStart) / 10000)Next jFor i = 0 To 3 Tmp = Tmp + Chten(i)Next iTmp = Tmp / 10AEnd = GetTickCount()Label2.Caption = "Средняя скорость чтения " & FormatNumber(Tmp, 3) & " Мб/сек"Label3.Caption = "Общее время теста: " & FormatNumber(((AEnd - AStart) / 1000), 4) & " секунд"ProgressBar2.Value = TmpLabel4.Caption = "Кол-во тестов: 1 на запись, 4 на чтение"End IfEnd SubPrivate Sub Command2_Click()Unload MeEnd SubPrivate Sub Form_Load()Dim i As Byte, drivetype As Long, k As ByteFillCombo Combo1, TrueFor i = 0 To Combo1.ListCount - 1 Combo1.ListIndex = i drivetype = GetDriveType(Combo1.Text + "\") If drivetype = MainForm.NumDrive Then Combo1.AddItem Combo1.Text: k = k + 1Next iFor i = 0 To Combo1.ListCount - k - 1 Combo1.RemoveItem 0Next iCombo1.ListIndex = 0Call Command1_ClickEnd SubPrivate Sub FillCombo(cbo As ComboBox, ByVal bUsed As Boolean)Dim DriveNum As Longcbo.ClearFor DriveNum = 0 To 25 If CBool(GetLogicalDrives And (2 ^ DriveNum)) = bUsed Then cbo.AddItem Chr$(Asc("A") + DriveNum) & ":" End IfNext DriveNumEnd Sub
Страницы: 1, 2
|
|