Графичен часовник (източници, документация) - Програмни продукти

delphi ви позволява да рисувате почти навсякъде. Можете да рисувате върху формуляр, можете да рисувате върху етикет, можете дори да рисувате директно върху екрана! Но е по-добре да използвате специалния компонент timage, макар и само защото самият този компонент ще се увери, че когато преначертаете прозореца на вашата програма, вашите драсканици също ще бъдат преначертани. Ако нарисувате нещо, например на формуляр, тогава, когато минимизирате прозореца на програмата, вашият чертеж ще бъде изтрит.

Ако във вашата форма няма място за такива часовници, предлагам да включите още една форма в нашата програма.

0. С помощта на бутона " нов формуляр" или елемента от менюто " файл / нов формуляр "Създайте нов формуляр. Щраквате върху бутона "запази". Въведете някакво име за този нов модул (разбира се, можете да оставите и unit2, но е по-добре да използвате смислени имена).

1. Поставете компонента изображение върху новия формуляр (допълнителна палитра, 6-ти бутон под формата на картина) на формуляра. Задавате свойството align на alclient, в резултат изображението ще се разпространи върху целия формуляр.

2. Поставете таймер на формата. Създайте манипулатор на събития за онлимер за него.

3. Декларираш нови променливи:

var xc,yc : цяло число; u : двойно;

Обърни внимание. Декларацията на променливи може да отнеме няколко реда, но вие пишете думата var само веднъж, т.е. var маркира целия блок от променливи, а не неговия отделен ред. Типът променлива double е реален тип, той може да съхранява дробни числа. Променливите xc, yc се използват за съхраняване на координатите на центъра на часовника, а ъгълът на въртене на стрелките ще запишем в променливата u.

4. Вие декларирате въведени константи:

const lh : цяло число = 60; lm : цяло число = 100; ls : цяло число = 80;

Въпреки че се наричат ​​константи, те всъщност сапроменливи, само те имат стойности, зададени от самото начало. Стойностите на тези елементи са дължината на часовата, минутната и секундната стрелка в пиксели. Е, синтаксисът според мен е доста ясен.

5. В тялото на процедурата пишем:

xc := image1.width div 2; yc := image1.height div 2; u := pi/2 - време*2*2*pi; image1.canvas.moveto(xc,yc); image1.canvas.lineto(xc+round(lh*cos(u)),yc-round(lh*sin(u)));

В първите два реда изчисляваме координатите на центъра на изображението, това ще бъде центърът на нашия часовник.

В третия ред разглеждаме ъгъла за часовата стрелка. Символът "/" означава деление, символът "*" умножение, "-" знак минус. Процедурата е стандартна за математически изрази, тоест първо разделяме/умножаваме, след това събираме/изваждаме. Функцията pi връща числото pi. Обяснете защо ъгълът се разглежда по този начин, необходимо ли е? Или познанията ви по геометрия са достатъчни? О, да, първо Големият Ероид, след това тежкото наследство на либералното образование… И така, в математиката (и в делфи) е обичайно да се брои ъгълът от хоризонталата и обратно на часовниковата стрелка. И на часовника - от вертикалата и по часовниковата стрелка. Знакът „-“ пред времето променя посоката на обратното броене, а „пи наполовина“ измества началото на обратното броене с четвърт оборот обратно на часовниковата стрелка (т.е. с числото 12 на часовника). През деня времето променя стойността си от 0 на 1, а часовата стрелка трябва да направи 2 завъртания през това време, тоест „2 * 2 * pi“ радиана. Така получаваме ъгъла u в радиани. Именно в радиани този ъгъл трябва да бъде заменен във функциите синус и косинус.

Четвърти ред: поставете показалеца в центъра.

Пети ред: начертайте линия от текущата позиция на показалеца до точката с координати xc+round(lh*cos(u)),yc-round(lh*sin(u)). Координатата x се получава чрез добавяне на xc и дължината на стрелката, умножена по косинуса на ъгъла. Тъй като косинусът на ъгъл естойността е реална, а координатите трябва да са цяло число, трябва да използвате кръглата функция - закръгляване. Бърз въпрос: защо не можете да напишете lh*round(cos(u))? Минусът при изчисляване на координатата y се дължи на факта, че оста y не е насочена нагоре (както обикновено се приема в математиката), а надолу, добре, за вас, като специалист по BASIC, това не трябва да е изненадващо.

6. Копирайте последните три реда два пъти и ги променете, за да показват минутната и секундната стрелка. Можеш ли да го направиш?

7. Сега трябва да свържем тази нова форма с нашата програма. Отидете на unit1.pas и намерете блока, който започва с uses. Този списък съдържа всички модули, свързани с вашата програма. Поставете името на вашия нов модул в края на този списък, разделено със запетаи. Когато стартирате програмата, първата ви форма ще се отвори, за да отворите втората, трябва да дадете командата

Стартирайте програмата. Часовникът работи. Само стрелките не са изтрити. Трябва да изчистите изображението преди всяко ново изобразяване. Най-лесният начин да изчистите изображение е да го боядисате изцяло с цвета на фона.

1. Декларирайте нова променлива rect от тип trect. Този тип съдържа 4 полета вътре в себе си - ляво, горно, дясно, долно от целочислен тип, и е предназначен за определяне на координатите на правоъгълника.

2. В самото начало на тялото на процедурата трябва да зададете на правоъгълните полета координатите на правоъгълника, който искаме да рисуваме и да извикаме метода за рисуване:

rect.left := 0; rect.top := 0; rect.right := image1.width-1; rect.bottom := image1.height-1; image1.canvas.fillrect(rect);

Въпроси и отговори

Q. Изглежда, че часовник със стрелки работи за мен =) Но тук е въпросът: възможно ли е стрелката за минути да се движи веднъж на минута, а не бавно да се движи в кръг? (подобно на почасово)

Б. За сметка на второтоформа, можете просто да зададете свойството му visible на true, тогава то ще бъде видимо при стартиране, но ще бъде някак вторично.

А. Можете. Просто исках да демонстрирам възможността да покажа формуляра по всяко време (методът show), а в останалите уроци по-долу да го скрия (методът hide). За тези цели можете да присвоите стойностите true и false на видимото свойство - и двата метода са почти еквивалентни (всъщност методите show и hide се извикват във втория метод, а видимите стойности се променят в първия), но се препоръчва използването на методите като по-правилен подход от гледна точка на обектно-ориентираното програмиране.

Q. Сега за сметка на рисуването с цвета на фона и цвета на фона като цяло =) Как да го настроя (цвят на фона)? и цвета на линията =) В Pascal по този въпрос има функции setcolor - за рисуване и setbkcolor - за фон. Не намерих нищо подобно в Delphi.

А. Платното има свойства четка (четка) и писалка (молив), така че четката е отговорна за зоните за рисуване, а моливът е отговорен за рисуването. Те имат куп свойства, включително цвят. Натиснете f1 с избрания компонент на изображението, щракнете върху връзката за свойства, намерете платно, отново свойства и т.н. - прочетете сами какво имат четка и писалка. Със сигурност ще направим и това, но малко по-късно.

Q. И също за сметка на Pascal, там анимацията може да се направи по два начина или чрез страници или преначертаване, така че при преначертаване нещо първо се рисува с цвят, след това се рисува с цвета на фона, след това се преначертава и т.н. Не знам дали е възможно да се направи нещо подобно с нашите стрелки =)

В. И още един въпрос относно часовника, нормално ли е графичният таймер да е малко зад текстовия?