Лекція 11. Робота з графікою в Delphi
Засоби малювання
В Delphi існують такі класи для використання графічних засобів Windows: TCanvas (для полотна), TFont (для шрифту), TPen (для пера), TBrush (для пензля).
Пов’язані з цими класами об’єкти при необхідності створюються автоматично для усіх візуальних компонент (в тому числі і для форми). Тому в них є властивості Canvas, Font, Pen, Brush.
Властивість Canvas є доступною лише при виконанні програми, тому отримані з її допомогою малюнки є динамічними і існують лише у процесі роботи програми. При необхідності можна зберегти малюнок у графічному файлі або вивести на друк.
Зображення можна малювати, наприклад, на поверхні форми різними інструментами. У цьому випадку зображення являє собою комбінацію графічних примітивів (найпростіших фігур), таких, як крапка, лінія, круг, прямокутник і т.п. Також можна вводити текст у графічному режимі.
Об’єкт Canvas класу TCanvas являє собою поверхню для об’єктів, які вимальовують своє власне зображення. Цей об’єкт об’єднує в собі об’єкти пера (Pen) і пензля (Brush) для малювання і заповнення геометричних фігур, а також об’єкт шрифту (Font), який дозволяє керувати атрибутами тексту, що виводиться на поверхню.
Зауважимо, що компонента, яка має властивість Canvas, в свою чергу сама може містити об’єкти пера, пензля та шрифту, і відповідно мати властивості Pen, Brush і Font.
При виконанні графічних операцій використовується властивість PenPos, яка визначає поточну позицію пера. Поточна позиція визначається горизонтальною та вертикальною координатами. За замовчуванням початок системи координат знаходиться у лівому верхньому куті поверхні малювання, а відлік координат виконується у пікселях. Для переміщення поточного вказівника використовується метод MoveTo(X,Y:Integer).
Властивість Pixels[X,Y:Integer] є двовимірним масивом елементів зображення (пікселів), за допомогою якої можна отримати доступ до окремої точки зображення і визначити її колір.
Для надання лініям, тексту та заливці кольору використовують установки властивості Color об’єктів пера, пензля та шрифту відповідно в Інспекторі об’єктів.
Існує ще багато властивостей та методів для малювання, з якими можна ознайомитись в літературі.
При будь-якій зміні вмістимого поверхні малювання виникають події OnChanging та OnChange. Подія OnChanging виникає безпосередньо перед модифікацією полотна, а подія OnChange – після модифікації. Обробники цих подій програмуються, оскільки об’єкт Canvas не доступний на етапі проектування.
Графічні компоненти
В стандартну бібліотеку візуальних компонент Delphi входять декілька елементів, за допомогою яких можна створювати відносно прості візуальні ефекти, такі як відображення рамок, фасок або елементарних геометричних фігур. Найчастіше використовуються такі графічні компоненти, як Image (графічне зображення), Shape (геометрична фігура), Bevel (фаска). Графічні компоненти є невіконними візуальними компонентами і походять від класу TGraphicControl.
Компонента Image дозволяє розмістити графічне зображення у будь-яке місце на формі. Для включення цієї компоненти у склад програми необхідно вибрати її на сторінці Additional Палітри компонент і розмістити на потрібному місці форми.
Основна властивість компоненти Image – це властивість Picture типу TPicture. Зображення можна завантажити під час проектування в редакторі властивості Picture в Інспекторі об’єктів. Файл зображення може мати формат BMP (bitmap), WMF (Windows Meta File), EMF (Windows Enhanced Meta File) або ICO (icon). Крім цього можна відображати графічні файли у форматі JPEG або JPG. Однак, при відображенні зображення в такому форматі виключається можливість застосування методів малювання різних графічних примітивів на поверхні компоненти Image.
Графічне зображення, завантажене в об’єкт типу TPicture, визначається властивістю Graphic типу TGraphic. Дану властивість можна використовувати для доступу до зображень будь-якого формату (крім JPEG), якщо формат не відомий. Якщо відомо формат зображення, то для операцій з ним можна використовувати властивості Bitmap типу TBitmap, MetaFile типу TMetaFile і Icon типу TIcon. Для роботи з зображенням у форматі JPEG застосовується спеціальний клас TJPEGImage. Щоб використати цей клас, необхідно в розділі uses підключити модуль JPEG.
При проектуванні необхідно пам’ятати, що зображення, яке розміщене на формі під час дизайну, включається у файл проекту (.dpr) і потім приєднується до виконавчого файлу. Тому такий exe-файл може вийти дуже великим. У якості альтернативи можна розглянути завантаження картинки під час виконання програми.
Зображення в об’єкт типу TPicture може завантажуватись з таких джерел:
з графічного файлу;
з іншої компоненти, яка місить зображення;
з файла ресурсів.
Для завантаження зображення з файлу застосовується метод LoadFromFile(const FileName:String)де ім’я файлу задається параметром FileName. Наприклад,
Image1.Picture.LoadFromFile(‘C:\MyPhoto\phot1.bmp’);
Завантаження зображення з іншої компоненти виконується з застосуванням властивості класу TPicture, яка вказує тип графіки в об’єкті-джерелі: чи Bitmap, чи MetaFile, чи Icon. Після цього викликається метод Assign(Source: TPersistent). Наприклад, наступною інструкцією копіюємо зображення типу TIcon з графічного образу з іменем Im1 в інший образ з іменем Im2:
Im2.Picture.Icon.Assign(Im1.Picture.Icon);
Завантажити зображення з файлу ресурсів можна за допомогою методу
LoadFromResourceName(Instance:THandle; const:ResName:String).
Даний метод викликається лише для класу TBitmap. Файл ресурсів готовиться за допомогою будь-якого редактора ресурсів і перед використанням підключається до програмного модуля директивою компілятора {$R Ім’я файлу ресурсів}. Наприклад,
{$R resource1.res}

Image1.Picture.Bitmap.LoadFromResourceName(Instance,’picture1’);
Тут в компоненту Image1 завантажується зображення з іменем picture1, яке міститься у файлі ресурсів resource1.res. Ім’я зображення, в даному випадку picture1, задається в редакторі ресурсів при створенні зображення.
Для збереження зображення, яке міститься в компоненті, використовується метод класу TPicture: SaveToFile(const FileName:String).
В компоненти Image є властивість Canvas, тому на її поверхні можна малювати навіть поверх вже завантаженого зображення. Так можна, наприклад, оформити рамку навколо малюнка або додати до нього текст.
Як правило, розміри компоненти Image і вмістимого в ньому зображення (яке завантажене за допомогою властивості Picture) не співпадають. Для виправлення таких ситуацій використовують властивості Center, AutoSize або Strech компоненти Image.
Властивість Center типу Boolean, яка встановлена в True, забезпечує суміщення центру зображення з центром компоненти Image.
Властивість AutoSize типу Boolean, яка встановлена в True, забезпечує автоматичне збільшення чи зменшення розмірів компоненти Image до розмірі, які має вмістиме в ній зображення.
Властивість Strech типу Boolean, яка встановлена в True, забезпечує автоматичне розтягнення або стиснення зображення до розмірів компоненти Image. Дана властивість не діє на піктограми, які завантажуються зі своїми вихідними розмірами.
Якщо обидві останні властивості встановлені у False (за замовчуванням), а зображення є більшим від компоненти Image, то частина зображення, що не попала в компоненту буде відсікатись. Щоб цього уникнути, необхідно або встановити одній з названих властивостей значення True, або організувати прокрутку зображення.
Компонента Shape призначена для відображення простіших графічних об’єктів (круг, квадрат і т.п.) на формі.
Властивість Shape задає вид об’єкта (круг, еліпс чи ін.). Властивість Pen визначає колір і вид границі об’єкта. Властивість Brush задає колір і вид заповнення об’єкта.
Компонента Bevel являє собою об’єкт фаски для оформлення програми з метою кращого візуального сприйняття. Даний об’єкт може приймати вигляд рамки або лінії. У порівнянні з компонентою Panel даний об’єкт має скромніші можливості, але займає менше ресурсів. Зовнішній вигляд задається властивістю Shape, яка може приймати значення прямокутника, рамки, ліній зверху, знизу, зліва чи справа, а також невидимої прямокутної області. Властивість Style визначає стиль оформлення фаски: вдавлена чи випукла.
Компонента PaintBox використовується для побудови програм типу графічного редактора або, наприклад в якості місці побудови графіків. Даний об’єкт являється просто областю для малювання. У дану компоненту не можна завантажувати готові зображення. Зауважимо, що координати вказівника миші, які передаються в обробники відповідних подій (OnMouseMove та ін.), є відносними, тобто визначають зміщення вказівника миші відносно лівого верхнього кута об’єкта , на відносно лівого верхнього кута форми.
Основною властивістю даної компоненти є властивість Canvas. Параметри шрифту, ліній і заливки задаються, відповідно, властивостями Font, Pen і Brush.
Діаграми та графіки
Діаграми та графіки дозволяють більш наглядно представити числову інформацію у графічній формі.
Компонента Chart призначена для роботи зі складними діаграмами та графіками різних видів, в тому числі й об’ємними. Дана компонента має велику кількість властивостей, деякі з них є об’єктами і мають власні властивості.
Робота з даною компонентою виконується за допомогою редактора Editing Chart, який викликається подвійним кліком на компоненті Chart або через поле значення властивості SeriesList в Інспекторі об’єктів.
Найважливішою властивістю компоненти Chart є властивість Series [Index:Longint] (тип TChartSeries), яка являє собою масив діаграм, що виводяться в області компоненти Chart. Дана властивість є також об’єктом і володіє набором власних властивостей та методів. Для кожної діаграми встановлюються наступні основні параметри: тип, назва, осі, легенда, джерело даних. Крім наведених, користувач може задати інші параметри, наприклад: об’ємність, масштаб, зміщення по горизонталі та вертикалі, кольори і способи оформлення різних елементів діаграми, підписи до цих елементів та ін.
Обов’язково вказується тип діаграми та джерело даних. Тип діаграми встановлюється на сторінці Chart – Series редактора і визначає вид діаграми. Всього можна задавати 11 видів діаграми: лінійний графік, вертикальна або горизонтальна стовпцева діаграма, кругова діаграма та ін. Вибір типу автоматично викликається кожен раз при додаванні нового елементу у список діаграм.
На сторінці Series – DataSource редактора вибирається джерело даних. При цьому вибирається один з таких варіантів:
No Data – значення, які вводяться програмно;
Random Values (за замовчуванням) – випадкові значення;
Function – значення, що обчислюються за допомогою вибраної функції.
До основних модів об’єкта Series можна віднести наступні процедури та функції.
Функція Add (const AValue:Double; const ALabel:String; AColor:TColor):Longint додає до діаграми значення, вказане параметром AValue. Параметри ALabel та AColor містять відповідно назву значення та колір, який використовується при виводі. В якості результату функція повертає номер значення у масиві значень діаграми.
Процедура Delete(ValueIndex:Longint) видаляє значення діаграми, яке має номер, що визначається параметром ValueIndex.
Процедура Clear видаляє усі значення діаграми.