PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic WEB разработка *NIX CouchDB Hack Python
Главная Статьи Delphi Килограмм пиктограмм
Главная
 Главная  Контакты
 
Программинг
Статьи Книги ЧаВО
 
xBOOKi
Fresh Books Операционки Сети
 
Поиск
-------
 
Counters
Яндекс цитирования
Rambler's Top100
-------
 
CryptDisk.4h
Программа которая позволяет создать виртуальный шифрованный логический диск.

cryptdisk.4hack.com

-------
 
 

Килограмм пиктограмм

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

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

В самом деле, ну не бывает же так, чтобы вся программа состояла из тех нескольких строк текста, которые вводятся при создании какого-нибудь обработчика события (например, обработчика события о нажатой кнопке). Действительно - не может программа, предназначенная для выполнения в среде Windows, состоять из нескольких строк текста (хотя бы даже и на Object Pascal). В связи с этим очевидным фактом, думается, имеет смысл несколько слов сказать о том, как же все-таки устроен проект в Delphi.

Почти каждая программа, запущенная в среде Windows (да, собственно, в любой многозадачной ОС, поддерживающей стандарт графического пользовательского интерфейса), выполняется в главном окне программы - прямоугольной области экрана, имеющей заголовок и рамку (полагаю, для читателей журнала Upgrade ничего нового в этой волнующей концепции нет).

При программировании в Delphi шаблон для главного окна программы создается автоматически при начале любого нового проекта. Этот шаблон называется формой. Более того, формы создаются автоматически для любого дополнительного окна программы - будь то диалоговые панели или дочерние окна в программах, поддерживающих многооконный интерфейс. В среде Delphi форма имеет вид прямоугольной панели серого цвета в крапинку (сетка выравнивания). На форме, собственно, демиург (в смысле - творец приложения) и размещает компоненты, выбираемые им из библиотеки визуальных компонентов (Visual Components Library - VCL).

Проектом в терминах Delphi называется совокупность всех модулей и файлов ресурсов, используемых в процессе разработки приложения. Проект имеет единственный главный файл c расширением dpr (Delphi PRoject) и набор файлов со стандартным расширением pas, в которых хранятся модули - по одному для каждой формы (в простейшем случае в проекте имеется всего одна форма - для главного окна).

В состав проекта входит также файл ресурсов (res-файл), имеющий тоже имя, что и dpr-файл, а также по файлу формы (расширение dfm - Delphi ForM) для каждого модуля (pas) - и с теми же именами. В dfm-файлах хранится описание интерфейсных элементов (кнопок, списков, меню, панелей инструментов...), размещенных на данной форме (нажав Alt-F12, можно увидеть текст текущего dfm-файла).

При компиляции каждый модуль порождает объектный файл с расширением dcu (Delphi Compiling Unit, надо полагать), а главный dpr-файл - исполняемый файл Windows (с раширением exe). Таким образом, "дельфийский" "экзешник" - не стандартный выполняемый файл, который полностью загружается в оперативную память в момент запуска программы, а набор сегментов, которые подгружаются по мере необходимости, так что не стоит очень волноваться по поводу размеров порождаемых Delphi exe-файлов.

И последнее. Настройки среды разработки Delphi применительно к текущему проекту хранятся в файле с расширением dof (что обозначает это расширение, неизвестно; может быть Delphi of Ours - Forever?) и тем же именем, что и dpr-файл. Взаимосвязь файлов проекта проиллюстрирована на рисунке.

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

Давайте посмотрим. Выберите пункт Project > Options, чтобы открыть окно Project Options (Параметры проекта). Щелкните закладку Application (Приложение). На вкладке вы обнаружите кнопку Load Icon, с помощью которой можно присвоить очередному разрабатываемому приложению уникальную пиктограмму, если только на вашем диске имеются специальные файлы пиктограмм (файлы с расширением ico).

А если их там нет? На этот случай разработчики Delphi включили в состав пакета специальный графический редактор - не такой, конечно, мощный, как Adobe Photoshop, но для создания пиктограмм вполне сносный. Однако чего они не предусмотрели, так это того, что далеко не каждый человек, собирающийся создавать прикладные программы (впрочем, как и системные), обладает художественными талантами, позволяющими ему нарисовать пиктограмму (вы сами попробуйте-ка на поле форматом 32 x 32 пикселя изобразить хоть что-то осмысленное).

Мд-а-а... Тупичок... А ведь на диске любого компьютера хранятся целые килотонны этих самых пиктограмм в виде так называемых ресурсов. Вопрос только в том, как их намыть побольше.

Решено: сегодня мы будем разрабатывать маленькую программу, предназначенную для того, чтобы "одалживать" (как говаривал в таких случаях папаша Гекльбери Финна) готовые пиктограммы у программ, созданных профессиональными разработчиками. А уж затем, создав коллекцию пиктограмм, будем использовать их в своем проекте "как есть" или с внесенными при помощи "дельфийского" графического редактора небольшими изменениями.

Установка начального каталога

procedure TForm1.FormCreate(Sender: TObject);
var
WinDir: array [ 0..255 ] of char;
begin
GetWindowsDirectory ( WinDir, 255 );
OpenDialog1.InitialDir := StrPas ( WinDir );
end

 

Основной код

procedure TForm1.Open1Click(Sender: TObject);
const
CurItem: longint = 0;
var
pName: array [ 0..255 ] of char;
fName: string [ 13 ];
N: word;
IcoH: hIcon;
begin
if OpenDialog1.Execute then
begin
fName := ExtractFileName (OpenDialog1.Filename );
StrPCopy ( pName, OpenDialog1.Filename );
N := 0;
with Icons do
repeat
IcoH := ExtractIcon ( hInstance, pName, N );
if IcoH > 1 then
begin
Col := CurItem MOD ColCount;
if ( CurItem DIV ColCount ) >= RowCount then
RowCount := RowCount + 1;
Row := CurItem DIV ColCount;
Cells [Col,Row] := Format('#%d(%s)',[CurItem+1,fName]);
Objects [ Col, Row ] := TIcon.Create;
with Objects [ Col, Row ] AS TIcon do
Handle := IcoH;
CurItem := CurItem + 1;
Inc ( N );
end;
until IcoH <= 1;
end;
end;

Сезонный сбор пиктограмм

1. Начните новый проект (меню File > New Application).

2. Сохраните проект (кнопка Save All) в отдельном каталоге. Файлу с расширением pas в момент сохранения присвойте имя MainForm.pas (я советую всегда давать это имя для главного модуля проекта, поскольку в более обширных проектах модулей может быть очень много), а для файла проекта имя PictoCollect.dpr.

3. Заголовок формы (свойство Caption) придумайте, исходя из своего литературного вкуса. Я, например, назвал форму "Коллекция пиктограмм".

4. Разместите на форме компонент MainMenu (закладка Standard палитры компонентов). Delphi автоматически присвоит этому компоненту имя MainMenu1.

5. Щелкните дважды по компоненту MainMenu1 и введите следующие пункты:
File
Open
Save
-
Exit

Если вам не нравятся эти названия, можете после ввода, не закрывая окна редактора меню, изменить свойство Caption каждого пункта.

6. В окне редактора меню сделайте активным пункт Exit (если вы потеряли окно редактора меню, нажмите Alt+0 и в появившемся окне Window List дважды щелкните по строке Form1.MainMenu1, чтобы вывести на передний план редактор меню).

О типах переменных

Строковый тип String, который используется корпорацией Borland с незапамятных времен компиляторов Turbo Pascal первых версий, представляет из себя последовательность байт, в которой нулевой байт хранит общую длину строки.

Этот строковый тип - особенность Паскаля от корпорации Borland, но в системном программировании для обработки строк используется стандартный тип, представляющий из себя последовательность символов, оканчивающуюся символом ASCII = #0. Это так называемые ASCIIZ-строки, длина которых может достигать 64 кб. В силу этого, работая с функциями Windows API (такими, как GetWindowsDirectory), постоянно приходится преобразовывать строку из одного типа в другой. Это не очень удобно, но другого выхода нет.

В компиляторе Turbo Pascal 7.0 корпорация Borland ввела тип PChar - указатель на ASCIIZ-строку (строку типа array of char), но программисты, привыкшие к старому доброму типу string, с прохладцей встретили нововведение, поэтому в Delphi Borland снова сделала тип string основным, сохранив при этом и возможность работы с типом PChar.

7. Щелкните свойство ShortCut этого пункта и вместо (None) введите Alt+X и нажмите Enter. Ого-го! В названии пункта добавилась запись Alt+X! Это Delphi подтвердила, что поняла ваше желание установить клавиатурный эквивалент для данного пункта меню. В принципе, свойство ShortCut можно установить, выбрав нужный клавиатурный эквивалент из длинного раскрывающегося списка, но, поскольку комбинация Alt+X в нем отсутствует, приходится ее вводить вручную.

8. Теперь дважды щелкните по самому пункту Exit и в шаблоне обработчика этого пункта введите: Close.

9. Установите для пунктов "Открыть" и "Закрыть" клавиатурные эквиваленты - соответственно Ctrl+O и Ctrl+S (сами пункты мы пока трогать не будем).

10. Теперь самое ответственное - размещение сетки строк (компонент StringGrid вкладки Additional). Дважды щелкните по этому компоненту в палитре компонентов, и он - компонент - тут же появится в центре формы. Установите его свойства следующим образом.

Свойство 

Значение

Align

alClient

ColCount

4

DefaultColWidth

144

DefaultRowHeight 

64

FixedRows 

0

FixedCols 

0

Name 

Icons

Options.goRangeSelect

False

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

11. Теперь для свойства GridLineWidth введите значение 0. Сетка пропала! То есть пропали линии, отмечающие границы ячеек (их ширина стала равной 0 пикселей), но сами ячейки сохранились.

О стандартизации интерфейса

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

Например, если первый пункт меню (вернее, второй, так как первым пунктом обычно бывает ненужный нам сегодня пункт - "Создать" (New)) большинства программ называется "Открыть...", а его клавиатурный эквивалент - Ctrl+O, то и вы поступите очень хорошо, если будете придерживаться этого стандарта, а свое оригинальное мышление продемонстрируете каким-нибудь другим способом (например, напишете вирус, который будет поражать только компьютеры людей, любящих присылать по почте вирусы, черт бы их побрал).

12. Откройте закладку Dialogs палитры компонентов и разместите на форме компоненты OpenDialog и SaveDialog. Кстати, если вам не очень хочется постоянно щелкать по разным вкладкам палитры компонентов и искать на них нужные компоненты, откройте окно Components (меню View > Component List), где все компоненты упорядочены по алфавиту и выберите нужный (правда, почему-то в списке указывается не имя компонента, а его тип, но в конечном итоге это не столь важно, поскольку имя от типа отличается только наличием впереди стоящей латинской литеры "T").

13. Установите свойства диалогов.

Свойство 

Значение

OpenDialog1

DefaultExt 

ICO

Options.ofHideReadOnly 

True

Options.ofFileMustExist

True

Title 

Открыть файл с пиктограммами

SaveDialog1

DefaultExt 

ICO

Options.ofOverwritePrompt

True

Options.ofHideReadOnly

True

Options.ofPathMustExist

True

True

Сохранить пиктограмму


Как видите, свойства компонента SaveDialog1 отличаются от свойств OpenDialog1. Подсвойство ofPathMustExist (доступное через коллективное свойство Options) отвечает за то, чтобы программа проверяла правильность указанного каталога, который укажет пользователь как место хранения пиктограммы. Соответственно, подсвойство ofFileMustExist побуждает программу проверять правильность указанного имени файла.

Подсвойство ofHideReadOnly (оно устанавливается в True для обоих диалогов) убирает ненужный флажок "Только для чтения" в диалоговой панели открытия и сохранения файла. Подсвойство ofOverwritePrompt (компонент SaveDialog1) страхует от случайного затирания уже существующего файла (при сохранении файла с именем, которое уже есть в указанном каталоге, будет выдаваться предупреждение и просьба подтвердить необходимость сохранения).

14. Дважды щелкнув по свойству Filter компонентов OpenDialog1 и SaveDialog1, введите следующие маски.

Filter Name

Filter

OpenDialog1

Файлы, содержащие пиктограммы

*.ico;*.exe;*.dll

Все файлы

*.*

SaveDialog1

Пиктограмма 

*.ico


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

Сделать форму активной можно путем выбора в раскрывающемся списке компонентов инспектора объектов строки Form1: TForm1.

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

Операторы языка Object Pascal

AS
Оператор приведения типов, позволяющий обойти некоторые ограничения синтаксиса.
<объект> AS <класс>

В результате выполнения этого оператора компилятор рассматривает объект <объект> как имеющий тип <класс>. Первоначальный тип объекта <объект> должен быть наследником или потомком типа <класс> - или полным его эквивалентом.

Этот оператор часто используется совместно с оператором with (см.ниже).

Например, одним из свойств Сетки строк (StringGrid) является массив Objects, каждый элемент которого может содержать объект произвольного типа. Чтобы дать понять компилятору, что в конкретном случае речь идет, скажем об объекте типа TIcon (пиктограмма), используется следующая конструкция - Objects [ Col, Row ] as TIcon

IS
Оператор проверки типа. Используется в логических выражениях:
if <объект> IS <класс> then ...

Данную конструкцию компилятор интерпретирует следующим образом: "Выполнить действие, если <объект> имеет тип <класс>.

MOD
Возвращает остаток от деления одного целого числа на другое целое число. Например: 30 mod 7 = 2.

DIV
Возвращает целую часть при делении одного целого числа на другое целое число, например: 30 div 7 = 4

repeat ... until
Оператор цикла.
repeat
<операторы>
until <условие>;
Группа <операторы> повторяется до тех пор, пока <условие> ложно.

with
Оператор with используется для доступа к свойствам и методам объектов или к полям записи. Поскольку любой компонент Delphi является объектом, то стандартное использование метода или свойства возможно через так называемое составное имя следующего вида:
<имя объекта>.<имя свойства или метода>
Использование оператора with позволяет сократить эту запись следующим образом:

with <имя объекта> do
<имя свойства или метода>

Такое сокращение делает код более понятным, особенно в случаях использования нескольких свойств или методов одного объекта.

Например, если имеется объект Icons (компонент Сетка строк) класса TStringGrid, то для доступа к его свойствам Col и Row можно использовать следующую конструкцию:
with Icons do
begin
Col := 5;
Row := 3;
end;

16. Выберите закладку Events инспектора объектов и дважды щелкните по событию OnCreate. Шаблон обработчика этого события, которое происходит всякий раз в момент создания формы, замените кодом, данным во врезке "Установка начального каталога". Что, собственно, мы сделали? А сделали мы так, что свойство InitialDir компонента OpenDialog1, которое отвечает за каталог, устанавливаемый при самом первом обращении к диалогу открытия файлов, будет хранить имя того каталога, в который инсталлирована Windows.

Проще говоря, после старта программы и выбора пункта "Открыть", пользователь сразу же попадет в каталог Windows - настоящий "клондайк" файлов, хранящих пиктограммы.

Спрашивается: а почему бы сразу в инспекторе объектов не установить значение InitialDir компонента OpenDialog1 равным C:\Windows? Сделать это, конечно же, проще пареной репы, но вся штука в том, что операционная система необязательно находится в этом каталоге. Поскольку сам пользователь выбирает имя каталога в момент инсталляции, то на каком-нибудь конкретном компьютере Windows вполне может оказаться в каталоге C:\Mustdie, так что имеет смысл прибегнуть к услугам специальной функции GetWindowsDirectory, которая всегда безошибочно вернет имя реального каталога Windows.

Поскольку функция GetWindowsDirectory входит в семейство Windows API (сотен функций с самыми головоломными названиями и скудной документацией, которые корпорация Microsoft любезно предоставляет в распоряжение разработчиков - см. врезку "Процедуры и функции Windows API"), а разрабатывалось это семейство на языке Си (а то и на ассемблере), который не знает паскалевского типа string и всегда работает только со строками ASCIIZ, то в обработчике события OnCreate пришлось объявлять специальную переменную WinDir, представляющую из себя массив символов (array of char) и передавать ее в качестве параметра функции GetWindowsDirectory, указывая вторым параметром ее длину.

Но так как свойство InitialDir имеет тип string, то во второй строке обработчика в операторе присваивания была использована специальная функция Delphi StrPas, которая приводит строку ASCIIZ к типу string. В противном случае на стадии трансляции компилятор выдал бы сообщение о несовместимости типов и прекратил дальнейшую компиляцию программы.

17. В редакторе кода переместите курсор в самое начало модуля MainForm.pas (в секцию uses) и после модуля Grids добавьте модуль ShellApi, в котором хранятся функции этой подгруппы, в том числе и ExtractIcon (не забудьте поставить запятую после имени модуля Grids):

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, Grids, ShellApi

18. Нажмите F12, чтобы вернуться к шаблону формы. Щелкните меню "Файл", чтобы открыть подменю (оно откроется так, как будто это уже готовая программа) и выберите пункт "Открыть". Услужливая Delphi тотчас отправит вас прямиком к шаблону обработчика этого пункта меню. Вместо пары begin-end введите "Основной код".

Это самый гигантский фрагмент кода в нашей маленькой программе, но без него никак не обойтись. Не обойтись нам и без небольшого разъяснения.

Загрузка пиктограмм из файла (его имя хранится в свойстве Filename компонента OpenDialog1) начинается в том случае, если пользователь нажмет кнопку OK в диалоге открытия файла. Тогда метод Execute вернет True. При помощи функции ExtractFileName переменной fName присваивается имя открываемого файла без полного имени каталога, в котором он размещен. В переменной pName, представляющей из себя ASCIIZ-строку, сохраняется полное имя файла (при помощи функции StrPCopy).

Свойства Col и Row сетки строк хранят информацию о строке и столбце текущей ячейки, в которой должна быть размещена считываемая из файла пиктограмма.

Свойства ColCount и RowCount служат для определения общего количества столбцов и строк в сетке соответственно. Так называемая типизованная константа CurItem хранит информацию об общем количестве всех пиктограмм, запутавшихся в расставленной сетке и увеличивается на единицу после загрузки очередной пиктограммы.

Прорисовка пиктограмм

begin
if Icons.Objects [ ACol, ARow ] IS TIcon then
Icons.Canvas.Draw ( Rect.Left + 56, Rect.Top + 24,
TIcon ( Icons.Objects [ Col, Row ] ) )
end

Сами пиктограммы загружаются с помощью API-функции ExtractIcon, возвращающей дескриптор пиктограммы. Загруженная пиктограмма сохраняется в очередном элементе массива Objects. Этот массив является неотъемлемой частью сетки строк и может хранить любой объект, являющийся наследником класса TObject.

Сохранение пиктограмм

begin
if SaveDialog1.Execute then
with Icons do
with Objects [ Col, Row ] AS TIcon do
SaveToFile ( SaveDialog1.Filename );
end

Другой массив сетки строк - Cells используется для хранения текста, который будет выводиться вместе с пиктограммой. Для того, чтобы вставить в строку текста числовое значение (CurItem) и другую строку (fName), использована функция Format.

Загрузка пиктограмм из файла происходит до тех пор, пока очередной дескриптор, полученный от функции ExtractIcon, не станет равным 1 или 0.
Дополнительную информацию об использованных функциях и конструкциях языка Object Pascal, вы найдете во врезках "Операторы языка Object Pascal", "Процедуры и функции языка Object Pascal".

19. Но наша сетка пока еще не в состоянии отображать загружаемые пиктограммы. Чтобы компонент TStringGrid отобразил что-либо кроме текста, нужно прописать обработчик его события OnDrawCell, отвечающего за отрисовку каждой ячейки сетки.

Сделайте активным компонент TStringGrid, выберите закладку Events Инспектора объектов и дважды щелкните по событию OnDrawCell. В шаблоне TForm1.IconsDrawCell введите вместо пары begin-end текст, приведенный во врезке "Прорисовка пиктограмм".
Метод Draw позволяет выводить в указанной позиции какой-либо графический объект, в нашем случае - пиктограмму, хранящуюся в конкретном элементе массива Objects.

Если вы недоумеваете, откуда взялись переменные Rect, Col и Row, то посмотрите внимательнее на параметры обработчика события.

Большинство обработчиков событий в Delphi имеют только параметр Sender, но обработчик события OnDrawCell получает в дополнение информацию о колонке (Col) и строке (Row) сетки, размере ячейки (класс TRect, к которому принадлежит передаваемый в качестве параметра объект Rect, является составным типом, указывающим координаты левого верхнего и правого нижнего углов некоего прямоугольника), а также статусе (State) ячейки: ячейка может быть выбранной, то есть по ней щелкнули мышкой (gdSelected), находиться в фокусе (gdFocused) или в фиксированном состоянии (gdFixed).

Обработчик события OnDrawCell вызывается для каждой видимой ячейки, так что можете не беспокоиться - все загруженные пиктограммы отобразятся как надо. Статус ячейки при этом нас не интересует.

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

Процедуры и функции языка Object Pascal

function ExtractFileName(const FileName: string): string;
Функция ExtractFileName из полного имени файла FileName удаляет подстроку, содержащую полный путь к этому файлу на диске.

function Format(const StrFormat: string; const Args: array of const): string;

Возвращает отформатированную строку.
В Паскале иногда бывает довольно сложно при составлении единой строки объединить переменные различных типов (особенно числовых). Функция Format позволяет упростить эти действия. Строка StrFormat представляет из себя строку в том виде, как она должна быть использована (например, при выводе сообщений). В тех позициях этой строки, где должны быть расположены значения других переменных, стоят спецификаторы формата.

Спецификатор формата представляет из себя последовательность, состоящую из знака процента (%) и следующей за ним специальной литеры. Например, спецификатор %d заменяется целочисленным значением; спецификатор %s - строкой символов.

В результате выполнения функции Format формируется строка, в которой все спецификаторы формата заменяются значениями переменных, взятых из массива Args. В массиве Args указываются переменные в том порядке, в котором встречаются спецификаторы формата в строке StrFormat. Их количество и тип также должны совпадать с количеством и типом спецификаторов.

Например, если значение переменной D = 100, а X = 500, то вызов
Format ( 'Значение D = %d, Значение X = %d', [ D, X ] )
вернет строку:
Значение D = 100, Значение X = 500
Полный перечень спецификаторов формата можно получить из контекстной справки Delphi.
procedure Inc ( var X [; N: longint ] );
Процедура Inc добавляет к аргументу X единицу или N (если указан второй параметр).
function StrPas(Str: PChar): string;
Преобразует Str (ASCIIZ-строку) в стандартную строку Object Pascal.
function StrPCopy(Dest: PChar; const Source: string): PChar;
Строку Source преобразовывает в формат ASCIIZ-строк.

20. Итак, теперь у нас все готово. Остается только создать обработчик пункта меню "Сохранить" с тем, чтобы иметь возможность сохранять на диске позаимствованные у других программ пиктограммы.
Нажмите F12 и выберите в шаблоне формы пункт меню "Сохранить". Тут же будет создан шаблон обработчика этого пункта. Введите вместо пары begin-end, ограничивающей тело обработчика, код из врезки "Сохранение пиктограмм".

21. Вот и все. Сохраните проект на диске.

Сортировка урожая

Итак, наступило время разобраться с результатами наших усилий. Приступим. Запустите программу. Выберите пункт меню "Открыть" (или нажмите Ctrl+O, если вы указали этот клавиатурный эквивалент для данного пункта). Вы сразу же оказываетесь в каталоге Windows. Войдите в подкаталог System и в строке ввода "Имя файла" введите: pifmgr.dll (этот файл вы можете и не увидеть в окне диалога - он скрыт от нескромных глаз, но на диске он есть, поверьте мне). Нажмите Enter.

Ну как? Файл pifmgr.dll (это библиотека менеджера PIF-файлов) одержит одну из самых богатых коллекций пиктограмм Windows. Вы можете также полазать по каталогам (не забудьте заглянуть в Program Files и его подкаталоги), загружая все новые и новые россыпи пиктограмм. Затем, придирчиво рассматривая запутавшиеся в вашей сетке пиктограммы и выбирая самые жирные экземпляры, вы можете, щелкнув по понравившейся, тут же сохранить ее на диске (пункт меню "Сохранить" или комбинация Ctrl+S).

Глоссарий

ASCII (American Standard Code for Information Interchange) - Американский стандартный код для обмена информацией. Все символы,

Свежее
Резервное копирование rsync-ом
DNS Amplification (DNS усиление)
Алгоритм Шинглов — поиск нечетких дубликатов текста
Metasploit Framework. Обзор
Использование CouchDB
-------



 
Copyright © 2003-2009   Frikazoid.
Rambler's Top100