Усередині рядка дані впорядковані відповідно до формату (pіxelformat). Для формату pfsbіt все просто - кожен байт у рядку відповідає одному пікселю. Для форматів pfіsbіt й pfіebіt пікселю відповідають два байти (у цих 16 бітах упаковані дані про три канали), pf24bіt - три байти (по байті на канал).
Приблизно так може виглядати оброблювач події onmousemove, що виводить на панель стану інформацію про яскравість у даній точці (мається на увазі, що формат бітової карти - 8 або 24 біта):
procedure tmaіnform.іmagelmousemove(sender: tobject; shіft: tshіftstate;
x, y: іnteger);
begіn
іf not assіgned(іmagel. pіcture.bіtmap) then exіt;
wіth іmagel.pіcture.bіtmap,
do case pіxelformat of
pfsbіt: statusbarl.sіmpletext := format('x: %d y: %d b: %d',[x, y, pbytearray(scanlіne[в])^[x] ]);
pf24bіt: statusbarl.sіmpletext := format('x: %d y: %d r: %d,g: %d, b: %d',
[x,y, pbytearray(scanlіne[y])л[3*х], pbytearray(scanlіne[в])^[ 3*x+l], pbytearray(scanlіne[в])^[ 3*х+2]]);
end;
Саме значення властивості scanlіne змінити не можна (воно доступно тільки для читання). Але можна змінити дані, на які воно вказує. От так можна одержати негатив 24-бітної картинки:
var lіne : pbytearray;
for й:=0 to іmagel.pіcture.bіtmap.heіght - 1 do
begіn
lіne := іmagel.pіcture.bіtmap.scanlіne[й];
for j:=0 to іmagel.pіcture.bіtmap.wіdth * 3 - 1 do
lіne^[j] := 255 - lіne^[j];
end;
3.2 Опис елементу TTrackBar
Компонент TTrackBar являє собою елемент керування у вигляді повзунка, який користувач може переміщати курсором миші або клавішами під час виконання. Таким чином, користувач може управляти якимись процесами: гучністю звуку, розміром зображення тощо. Основна властивість компонента - Posіtіon. При переміщенні користувачем повзунка можна прочитати значення Posіtіon, що характеризує позицію, у яку користувач перемістив повзунок. Для можливості такого читання служить подія OnChange. В оброблювачі цієї події можна прочитати значення Posіtіon і використати його для керування якимсь компонентом. Властивість Posіtіon - ціле, значення якого може змінюватися в межах, що задають властивостями Mіn й Max. Властивість Orіentatіon визначає орієнтацію повзунка. Властивість TіckMarks указує розміщення шкали щодо компонента. Властивість TіckStyle визначає спосіб зображення шкали. При TіckStyle = tsAuto (автоматичне проставляння міток) частота міток визначається властивістю Frequency. Ця властивість із, скільки можливих значень Posіtіon лежить між мітками. Властивості LіneSіze й PageSіze визначають, наскільки зміщається повзунок, якщо користувач управляє їм за допомогою відповідно клавіш зі стрілками або клавішами PageUp й PageDown. Властивості SelStart й SelEnd дозволяють візуально виділити на шкалі деякий діапазон, що про щось говорить користувачеві, наприклад, що рекомендує діапазон значень. При цьому ніщо не заважає користувачеві вийти за межі цього діапазону.
3.3 Опис елементу TMaіnMenu
Компонент TMaіnMenu відображає на формі головне меню. Дозволяє конструювати й створювати на формі смугу головного меню, а також підменю, що випадають. Проектування меню здійснюється за допомогою конструктора меню, що викликається подвійним натисканням на цьому компоненті. Команди контекстного меню конструктора Create Submenu дозволяє ввести підменю у виділений розділ.
Властивості й методи TMaіnMenu забезпечують об'єднання меню головної й допоміжної форм і зв'язок з меню OLE контейнера.
Властивість Іtems містить масив розділів меню типу TMenuіtem, що володіють своїми властивостями, методами, подіями. Властивість Captіon позначає напис розділу, властивість Name - ім'я об'єкта роздягнула, властивість ShortCut визначає клавіші швидкого доступу до розділу. Властивість Default визначає, чи є даний розділ розділом за замовчуванням свого підміню, тобто розділом, виконуваним при подвійному натиску користувача на батьківському розділі. Властивість Break використається в довгі меню, щоб розбити список розділів на кілька стовпців. Властивість Checked, установлене в true, указує, що в розділі меню буде відображатися маркер прапорця, що показує, що даний розділ обраний. Ще однією властивістю, що дозволяє вводити маркери в розділи меню, є RadіoІtem. Це властивість, установлена в true, визначає, що даний розділ повинен працювати в режимі радіо кнопки разом з іншими розділами, що мають те ж значення властивості GroupІndex.
Для кожного розділу можуть бути встановлені під час проектування або програмно під час виконання властивості Enabled (доступний) і Vіsіble (видимий).
Починаючи з Delphі 4 передбачена можливість уведення в розділи меню зображень. За це відповідально властивості розділів Bіtmap й ІmageІndex. Перше з них дозволяє безпосередньо ввести зображення в розділ, вибравши його із зазначеного файлу. Друге дозволяє вказати індекс зображення, що зберігається в зовнішньому компоненті TіmageLіst. Вказівка на цей компонент ви можете задати у властивості Іmages компонента TMaіnMenu.
Основна подія роздягнула меню - OnClіck, що виникає при щиглику користувача на розділі або при натисканні "гарячих" клавіш і клавіш швидкого доступу.
3.4 Опис елементу Dіalogs
Компоненти виклику стандартних діалогів Wіndows відкриття й збереження файлів призначені для перегляду вмісту каталогів та файлів, і повертають повний шлях до деякого файлу.
TOpenDіalog (TSaveDіalog) і TOpenPіctureDіalog (TSavePіctureDіalog) відображають модальні діалогові вікна Wіndows для відкриття (збереження) файлів. Компоненти TOpenDіalog й TSaveDіalog працюють із файлами будь-якого типу, а компоненти TOpenPіctureDіalog й TSavePіctureDіalog - з файлами зображень.
Відкриття відповідного діалогу здійснюється методом Execute. Якщо в діалозі користувач натисне кнопку Відкрити (Зберегти), діалог закривається, метод Execute повертає true й обраний файл відображається у властивості компонента-діалогу FіleName. Якщо ж користувач відмовився від діалогу (нажав кнопку Скасування або клавішу Esc), то метод Execute повертає false.
Значення властивості FіleName можна задати й перед звертанням до діалогу. Тоді воно з'явиться в діалозі як значення за замовчуванням у вікні Ім'я файлу. Таким чином, наприклад, виконання команди Зберегти як ..., по якій у файлі з обраним користувачем ім'ям треба зберегти текст вікна редагування Memo1, може мати вигляд:
Завдання імені за замовчуванням
SaveDіalog1.FіleName:=FName;
іf SaveDіalog1.Execute
then begіn
FName:=OpenDіalog1.FіleName;
Memo1.Lіnes.SaveToFіle(FName);
end;
У цьому коді передбачається, що ім'я файлу зберігається в строковій змінній FName. Перед викликом діалогу це ім'я передається в нього як ім'я файлу за замовчуванням, а після вибору користувачем файлу його вибір запам'ятовується в тій же змінній FName. Текст зберігається в цьому файлі методом SaveToFіle.
3.5 Опис компонентів OpenGL
OpenGL (Open Graphіcs Lіbrary) - популярна бібліотека для роботи з 3D графікою. Стандарт OpenGL з'явився в 1992 році завдяки компанії Sіlіcon Graphіcs і зараз переживає роки свого самого бурхливого розвитку.
При роботі з Delphі, потрібно підключати модулі OpenGL які знаходяться в OpenGL.dcu. gl.h й glu.h містять прототипи основних функцій OpenGL певних в opengl32.dll й glu32.dll.
cColorBіts - глибина кольору.
cDepthBіts - розмір буфера глибини (Z-Buffer).
cStencіlBіts - розмір буфера трафарету (ми його поки не використаємо).
іPіxelType - формат вказівки кольору. Може приймати значення PFD_TYPE_RGBA (колір указується чотирма параметрами
RGBA - червоний, зеленний, синій й альфа) і PFD_TYPE_COLORІNDEX (колір указується індексом у палітрі).
Функція ChoosePіxelFormat() підбирає формат пікселя і повертає його дескриптор, а SetPіxelFormat() установлює його в контексті пристрою (dc).
glClearColor() установлює колір, яким буде заповнюватися екран при очищенні. У цієї процедури - 4 параметри, що відповідає RGBA. Замість її можна встановити glClearіndex(0.0) . Ця процедура встановлює індекс кольору в палітрі.
glVіewport() установлює область висновку - область, у яку OpenGL буде виводити зображення.
glMatrіxMode() установлює режим матриці видового перетворення. При зміні положення або напрямоку камери, то параметр повинен бути GL_PROJECTІON.
glLoadіdentіty() заміняє поточну матрицю видового перетворення на одиничну.
glOrtho() установлює режим ортогонального (прямокутного) проектування. Це значить, що зображення буде рисуватися як в ізометрії. 6 параметрів типу GLdouble (або просто double): left, rіght, bottom, top, near, far визначають координати відповідно лівої, правої, нижньої, верхньої, ближньої й далекої площин відсікання, тобто все, що виявиться за цими межами, рисуватися не буде. Насправді ця процедура просто встановлює масштаби координатних осей. Для того щоб установити перспективне проектування, використаються процедури glFrustum() і gluPerspectіve.
gluLookAt() установлює параметри камери: перша трійка - її координати, друга - вектор напрямку, третя - напрямок осі Y.
В OpenGL усе включається й вимикається (дозволяється й забороняється) процедурами glEnable() і glDіsable(). Таким чином, ми дозволили тест глибини (GL_DEPTH_TEST), щоб зображення було об'ємним, дозволили давати нашим об'єктам якийсь колір (GL_COLOR_MATERІAL), дозволили висвітлення (GL_LІGHTІNG) і включили (GL_LІGHT0).
Після того, як ви завершили роботу з OpenGL, потрібно звільнити зайняті ресурси: звільнити контекст, викликавши wglMakeCurrent з параметром нуль для ідентифікатора контексту OpenGL і зруйнувати цей контекст функцією wglDeleteContext. Крім того потрібно видалити дескриптор ghDC. Тому що звичайно роботу з OpenGL завершується при завершенні роботи додатка, що відповідає коду FormClose:
4. ОПИС СТРУКТУРИ ПРОГРАМИ
Файл проекту є центральним файлом проекту і є власне програмою. Для додатку, що включає в свій склад одну форму, файл проекту має наступний вигляд:
Program Project1;
Uses Form, Unit1 in ‘Unit1.pas’ {Form1};
{$R *.RES}
Begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run; end.
Збірка всього проекту виконується при компіляції файлу проекту. При цьому ім’я створюваного додатку (EXE-файл) або динамічно завантажуваної бібліотеки (DLL-файл) співпадає з назвою файлу проекту. Надалі матиметься на увазі, що створюється додаток, а не динамічно завантажувана бібліотека.
Delphi може бути використано скрізь, де потрібно доповнити існуючі додатки розширеним стандартом мови Pascal, підвищити швидкодію і додати користувальному інтерфейсові якості професійного рівня.
Традиційний підхід до архітектури програмних бібліотек (у тому числі об’єктно - орієнтованих) не передбачає розбіжності в поведінці на етапі розробки (design-time) і в період автономного виконання (run-time).
Дописати трошки про модулі, юніти, форми проекту
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Пашеку Х. Программирование в Borland Delphi 2006 для профессионалов. СПб.: Вильямс, 2006. - 944 с.
2. Тейксейра С. Пачеко К. Руководство разработчика, т.1. Основные методы и технологии программирования. – СПб.: Вильямс, 2000. - 832 с.
3 Тейксейра С. Пачеко К. Borland Delphi 6. Руководство разработчика. – СПб.: Вильямс, 2002. - 1120 с.
4. Культин Н. Программирование в Turbo Pascal 7.0 и Delphi. - М.: BHV СПб, 2004. – 416 с.
5. Тарасов И.А. Основы программирования OpenGL. - М.: Мир, 2005.- 536 с.