IZONE- http://www.izcity.com/- бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

Дельфийский оракул

Дмитрий Румянцев

Как показывает практика, есть люди, для которых компьютер представляет собой нечто вроде лабораторного стенда для испытания различных новых железных штучек. Но если отбросить различные легенды (я, например, недавно узнал, что если положить мобильный телефон возле монитора, направив его антенной на экран, то мобильник будет подзаряжаться в процессе работы компьютера), так вот, если отбросить разные суеверия и верования, которыми обросли компьютеры, то речь идет всего лишь об электронном устройстве, предназначенном для обработки информации.

Другое дело, что если компьютеры середины прошлого века обрабатывали в основном только научную информацию (вы бы только видели эти длиннейшие и скучнейшие колонки цифр!), то нынешним "пням" по плечу создать настоящее средневековое государство и втянуть в благородное дело по захвату вражеских территорий своих счастливых обладателей. Но даже и в этом случае владелец компьютера имеет дело с обработкой информации.

К чему это я? Да к тому, что любой апгрейд (хоть железа, хоть софта) в конечном итоге имеет целью ускорить обработку этой самой пресловутой информации, сделать ее как можно более комфортной для человека. С другой стороны, потребности среднестатистического юзера таковы, что подчас он вынужден довольствоваться только теми возможностями, о которых позаботился дядюшка БГ (это который из Сиэтла, а не из Питера) и, соответственно, обходиться без тех, о которых дядюшка БГ не позаботился...

Что делать? Тех, кто имеет доступ в интернет, до известной степени спасают разного рода download.ru, freeware.ru и прочие сетевые свалки, на которых хранятся программы, программки и программулечки, призванные залатать информационные дыры, оставленные повсюду пресловутым БГ.

Но даже и в этом случае, чтобы найти нужную вещь, приходится перелопатить мегабайты всякого мусора (хорошо тому, кто пользуется выделенкой на работе, а каково тому, кто платит свои кровные и коннектится на 24 кбит/сек., а то и меньше). Но даже и найдя что-то, очень часто искатель обнаруживает, что это не совсем то, что нужно, а того же самого, но "с перламутровыми пуговицами" нет. И приходится либо довольствоваться тем, что есть, либо, вздохнув, сказать самому себе: "Ну что же, будем искать дальше".

Вы, наверное, поняли, что я веду к тому, что в полной мере считать себя хозяином собственного компьютера может лишь тот, кто способен оперативно сам создать какую-нибудь "маленькую программу" (а может и не очень маленькую) для собственных нужд.

Дельфийские мифы

Мне не раз приходилось видеть в различных учебниках по программированию (или слышать в приватных беседах) о языке программирования Delphi. Это настолько устойчивый миф, что бороться с ним, кажется, уже просто невозможно... Я и не буду, замечу лишь, что Delphi - это не язык программирования. Во-первых, так называется продукт компании Borland Software Corporation (как она стала называться с 2001 года), предназначенного для профессиональной разработки программного обеспечения. Во-вторых, это среда визуального программирования. А языком программирования в этой среде является Object Pascal - родной брат старого доброго Turbo Pascal, похожий на него, как... как... ну, словом, как родной брат на своего брата.

Как бы там ни было, но с помощью Delphi можно создавать точно такие же приложения, как и с использованием C++. При этом сам процесс создания программы в среде Delphi происходит гораздо быстрее (раз в десять, а то и в сто...) и, если можно так выразиться, комфортнее. Самое приятное, что даже совершенно неподготовленный юзер может с минимальным расходом серого вещества практически сразу приступить к созданию чего-то работающего и более полезного, чем пресловутая программа "Hello, World!", кочующая, словно бедуин по пустыне, из одного учебника программирования в другой. К тому же, от школьного курса информатики, где хотя и бегло, но изучается язык Turbo Pascal, хоть что-то да должно остаться в голове у человека, пытающегося извлечь максимум пользы из подведомственного компьютера.

Галопом по Европам

Изучать подробно всю среду Delphi в рамках журнальных статей - занятие неблагодарное: вряд ли у кого-нибудь хватит терпения прочитать хотя бы две-три. Поэтому мы поступим мудрее: будем разбирать различные особенности Delphi небольшими порциями, лишь в той мере, в которой требуется для разработки очередной "маленькой программы" (и, глядишь, когда-нибудь дорастем до "средних программ", а там и до "больших программных систем" рукой подать).

Как уже было сказано, Delphi - это среда разработки программ. Вся ее мощь (и немалая, доложу я вам), держится на так называемой библиотеке визуальных компонентов (Visual Components Library - VCL). Что это такое? Компонентом в терминах Delphi называется интерфейсный элемент, например, кнопка, или список, или меню, или...

Ну, словом, все, что только используется в программе для управления ее работой.
На верхней изображен внешний вид Рабочего стола после загрузки Delphi версии 6 (некоторые окна закрыты, чтобы не было большой разницы с более ранними версиями). Собственно, сама Delphi подразделяется на следующие блоки: традиционное меню, не менее традиционная панель инструментов и совершенно нетрадиционная палитра компонентов.

Палитра компонентов представляет собой кучу закладок, на которых различные компоненты сгруппированы в соответствии с их назначением.
Кроме того, на экране видна серая плитка в крапинку (крапинки - это сетка выравнивания). В терминах Delphi эта плитка называется "формой" (Form) и все манипуляции производятся именно над ней. Как? Очень просто: выбираете закладку, щелкаете по нужному компоненту, а затем в любую точку формы, и выбранный компонент тут же помещается на форму (можно дважды щелкнуть по компоненту на закладке, тогда он сразу появится в центре формы). 

Одновременно Delphi генерит соответствующий текст на Object Pascal. Как просмотреть этот текст? Под формой расположен Редактор кода (Code Editor). Чтобы он стал доступным, нажмите клавишу F12 или просто щелкните по окну Редактора (видите, он слегка выглядывает из под формы?). Можете понажимать F12 и полюбоваться, как форма то оказывается поверх Редактора кода, то Редактор подминает под себя форму. Ну ладно, дайте отдых пальцам и продолжайте чтение.

Слева от формы расположено окно Инспектора объектов (Object Inspector) и можно без преувеличения сказать, что если с Редактором кода вам придется иметь дело лишь изредка, то с Инспектором объектов вы обречены работать постоянно. Но не падайте духом. Это только на первый взгляд Инспектор объектов такой непонятный. На самом деле все просто. Любой компонент (и форма в том числе) представляет собой объект, который имеет ряд свойств (Properties) и реагирует на ряд событий (Events). Если вы приглядитесь, то увидите, что Инспектор содержит две закладки, которые имеют именно эти названия (Properties и Events). И уж поверьте, что на закладке Properties вы обнаружите все свойства выбранного компонента (размещенного на форме), а закладка Events... Впрочем, сегодня мы ее трогать не будем.

Любой компонент имеет целую кучу свойств. Но при разработке конкретной программы большая часть из них остается "как есть" (то есть сохраняет значение, устанавливаемое по умолчанию). Как изменять свойства, мы увидим чуть ниже. Кстати, на рисунке активным является свойство формы Caption. Значение этого свойства - текст в заголовке формы. Вы можете ввести все, что вашей душе угодно, и увидите, как сразу же изменился заголовок формы.

Кроме двух закладок в верхней части окна Инспектора объектов (сразу под его заголовком) расположен раскрывающийся список. Этот список очень облегчает жизнь, когда на форме размещено так много компонентов, что найти нужный визуально уже просто невозможно. В более простом случае для того, чтобы сделать какой-то компонент активным, нужно просто щелкнуть по нему мышью.

Ну ладно, заканчиваем вводную часть и переходим к активным действиям.

Что там у нас инициализировано?

Какой пользователь, совершая мистическое таинство апгрейда, не просматривал хоть раз содержимое системных файлов ini. Иной раз, чтобы добраться до какой-нибудь секции [Devices] в win.ini, приходится перелопатить гору непонятных строк, просматривая файл при помощи Блокнота (Notepad). Так что, я думаю, небольшая утилита для более удобного исследования внутренностей файлов ini займет достойное место в коллекции любого продвинутого пользователя.
Итак, запустите Delphi, если она еще не запущена (сегодня версия Delphi нас не сильно интересует, приведенный пример можно выполнить даже в Delphi 2.0). Затем выберите пункт меню File > New Application. Таким простым способом мы начинаем новый проект.

Теперь выполните следующую последовательность действий.
1. Щелкните вкладку Win 3.1 в палитре компонентов.
2. Щелкните компонент Outline (Схема) на этой вкладке.
3. Щелкните в любом месте формы (сразу же появится пустой белый прямоугольник: Delphi поняла ваш намек и разместила компонент на форме).
4. В Инспекторе объектов (Object Inspector) найдите свойство OutlineStyle (компонент Outline должен быть активным) и щелкните в правой колонке, чтобы открыть список стилей (все свойства упорядочены по алфавиту).
5. Выберите из списка свойство osPlusMinusText.
6. Найдите свойство Align и установите его значение в alClient. Ого, белый прямоугольник (Outline) растянулся, заполнив все пространство формы!
7. Найдите в палитре компонентов и щелкните вкладку Standard (если ее не видно, используйте кнопки с изображением стрелок, расположенные в правом верхнем углу палитры).
8. На закладке Standard щелкните компонент MainMenu (меню). (В Delphi 6 - это второй компонент на закладке.)
9. Щелкните в любом месте формы, чтобы разместить там компонент MainMenu.
10. Дважды щелкните по этому компоненту, чтобы открыть окно редактирования главного меню программы (оно имеет заголовок Form1.MainMenu и пока пусто).
11. Введите "&File" и нажмите Enter. Обратите внимание, что ввод вы совершали в свойство Caption, а после того, как нажали Enter, появилось меню File и шаблон преобразовался для ввода пунктов этого меню.
12. Последовательно введите:
&File Enter
- Enter
E&xit Enter.Только что вы создали простейшее меню из двух пунктов. Заметьте, что знак амперсанд (&) Delphi поняла как требование подчеркнуть символ, который стоит после него, а минус (-) в качестве заголовка - как требование ввести разделительную черту в меню. Если вас не устраивают англоязычные пункты меню, вы можете, выделив соответствующий пункт простым щелчком по нему, изменить его свойство Caption. Например, для пункта File вы можете для этого свойства ввести: &Файл или &Папка - или даже &Мамка. :)
13. А теперь - внимание! В предыдущих 12 пунктах мы занимались так называемым визуальным программированием: размещали на форме компоненты и настраивали под собственные потребности. В этом пункте мы наконец-то приступим к настоящему программированию! Дважды щелкните Exit в окне редактирования системы меню. О чудо! Вы попали в святая святых - окно Редактора кода (Code Editor). Более того, услужливая Delphi создала для вас шаблон обработчика пункта меню Exit.
14. Введите Close.
15. Сохраните проект (пункт меню File > Save All или соответствующая кнопка на панели инструментов). Лучше пока не меняйте названия модулей, которые Delphi присваивает по умолчанию. Сохраните проект в отдельном, специально созданном каталоге.
Итак, вы сохранили файлы: unit1.pas и project1.dpr (если, конечно, вы не изменили их имена). А теперь переведите дух и запустите проект, выбрав пункт Run из меню Run, нажав клавишу F9 или щелкнув кнопку на Панели инструментов. В результате несложных (в общем-то) манипуляций вы создали полноценное окно системы Windows, которое имеет заголовок (пока что оно называется Form1), системные кнопки, его можно таскать по экрану и менять его размер. И - о чудо! - окно имеет свое меню, правда, работает пока только пункт Exit. Теперь закройте окно (любыми доступными способами, включая пункт созданного меню) и продолжите работу над проектом.
16. Нажмите клавишу F12, чтобы сделать окно шаблона формы активным.
17. В палитре компонентов щелкните вкладку Dialogs.
18. Щелкните компонент OpenDialog (диалог для открытия файлов) и разместите его на форме.
19. Для компонента OpenDialog установите следующие свойства:
Свойство Значение
DefaultExt ini
InitialDir C:\Windows
Options.ofHideReadOnly True
Options.ofFileMustExist True
Title Открыть ini-файл

Значение свойства InitialDir позволяет установить каталог по умолчанию. Поскольку создается программа для просмотра ini-файлов, то имеет смысл по умолчанию задать каталог, где можно натолкнуться на залежи этих файлов, то есть в каталоге самой Windows. Если на вашем компьютере Windows установлена в другом каталоге, то измените значение свойства InitialDir на нужное. Если это свойство не устанавливать, то каталогом по умолчанию будет каталог, из которого запускается программа.

Свойство Options является хранилищем целой россыпи подсвойств (о чем свидетельствует знак + перед его именем). Чтобы раскрыть весь список, необходимо дважды щелкнуть по свойству перед которым стоит + (в данном случае по имени Options).
Значение True или False также можно переключать двойным щелчком.
20. Дважды щелкните на кнопке, расположенной в правой части поля значения свойства Filter, чтобы открыть окно Filter Editor и введите INI-файлы в первой строке колонки Filter Name и групповой шаблон *.ini в колонке Filter и нажмите OK.
21. А теперь настоящее программирование. В окне шаблона формы выберите пункт File из меню File (или как там они у вас называются) так, как если бы вы выбирали пункт меню работающей программы. Но в данном случае выбор этого пункта приведет к тому, что Delphi снова (как и в пункте 13) отправит вас в окно Редактора кода к созданному шаблону обработчика этого пункта.

Вместо шаблона введите код, приведенный во врезке "Код программы" (строки, начинающиеся с символов //, вводить не обязательно - это комментарии, которые предназначены для пояснения текста программы).
Обработчик пункта меню представляет собой процедуру (см. глоссарий). В самом начале Delphi автоматически генерит ее заголовок и пустое тело - пару begin - end. В обработчике File2Click осуществляется вызов диалога открытия файлов (функция Execute).
Если пользователь выбрал файл (функция вернула значение True), все строки файла загружаются в массив строк TS, где в цикле подвергаются предварительной обработке: в них удаляются стоящие впереди и сзади пробелы и знаки табуляции, после чего перед строкой, ограниченной квадратными скобками (типа [Drivers]) добавляется один символ табуляции (#9), а перед обычными строками - два символа табуляции (#9#9). Это нужно для правильного отображения ini-файла в схеме Outline1. Затем список строк передается схеме.

В обработчике использована специальная конструкция try ... finally ... end. Поскольку Windows - весьма коварная система и выполняющаяся программа может свалиться в самый неподходящий момент, нужно как-то подстраховаться и заставить программу выполнить какую-то последовательность операторов, если система рухнет. Конструкция языка Object Pascal try ... finally ... end как раз и предназначена для этого. Операторы, стоящие после служебного слова finally, будут выполнены в любом случае, даже если программа героически погибнет. При нормальной работе операторы выполняются так, как будто никакой дополнительной конструкции нет.

Запустите программу и загрузите какой-нибудь ini-файл. В начале в окне будет высвечено только имя файла с впереди стоящим плюсом. Дважды щелкните по имени и откройте список секций, содержащихся в этом файле. Любую секцию можно просмотреть также двойным щелчком.

Вот, собственно и все на сегодня. Согласитесь, не так уж и сложно. С этой программой, правда, пока еще рановато участвовать в конкурсе "Одобрено Upgrade" (тем более что он уже завершен - прим. ред.), но, как говорится, лиха беда начало. Во всяком случае, мы создали нечто более осмысленное, чем "Hello, World!", уж с этим никто спорить не станет.

От главного редактора. Лично я сильно порадовался, когда самостоятельно удалось сваять пусть маленькую, но вполне осмысленную программу. И вам того же желаю!

Код программы

procedure TForm1.File2Click(Sender: TObject);
var
S: string;
I, First, Last: word;
TS: TStringList;
begin
with OpenDialog1 do
// Если работа с диалогом закончилась нажатием на OK
if Execute then
begin
// Очистить схему
Outline1.Clear;
// Создать список строк
TS := TStringList.Create;
try
// Загрузить в список строк выбранный файл
TS.LoadFromFile ( Filename );
// Вставить в качестве первой строки имя файла
TS.Insert ( 0, ExtractFileName ( Filename ) );
// Исследовать каждую строку полученного списка
for I := TS.Count - 1 downto 1 do
begin
// Очередная строка
S := TS [ I ];
First := 1;
// Изменить индекс First так, чтобы он указывал на первый символ
// строки, отличный от пробела или символа табуляции
while ( First < Length ( S ) ) AND ( ( S [First] = " " ) OR
( S [First] = #9 ) ) do
// Увеличить на единицу значение First
Inc ( First );
// Последний символ строки
Last := Length ( S );
while ( Last >= First ) AND ( ( S [Last] = " " ) OR 
( S [Last] = #9 ) ) do
// Уменьшить на единицу значение Last
Dec ( Last );
if Last >= First then
begin
// Вычленить строку без впереди стоящих и конечных пробелов
S:= Copy ( S, First, Last - First + 1 );
// Строка заключена в квадратные скобки?
if ( S [1] = "[" ) AND ( S [ Length (S) ] = "]" ) then
S:= #9 + S
else
S:= #9#9 + S;
TS [ I ]:= S;
end
else
TS.Delete ( I );
end;
// Присвоить обработанный список строк схеме
Outline1.Lines:= TS;
finally
TS.Free;
end;
end;
end;

Источник: http://www.computery.ru/upgrade/

 


Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com