Язык программирования Delphi Работа с графикой, вывод текста под углом:
Ты уже получил начальные знания о Delphi, и наверно уже смог написать свою первую прогу с помощью статьи "Язык программирования Delphi. Нестандартные окна". Сейчас мы продолжим уроки с обучения работы с графикой.
Рис 1. Пример выполнения программы
Во всех книгах по Delphi обучение начинается с программы "Hello world", а графика рассматривается в конце книги как сложный материал. Наша цель научиться программировать, а не поздороваться с миром. Сейчас ты убедишься, что ничего сложного в графике нет.
На рисунке 1 ты можешь увидеть пример работы программы. Вот именно это и будет делать наша прога.
Если ты ещё не вышел из прошлого проекта, то создай новый. Для этого выбери меню File и нажми пункт New Application . Теперь создай обработчик события OnCreate . В этой процедуре напиши следующее:
procedure TForm1.FormCreate(Sender: TObject);
begin
index:=0;
end;
Index - это у нас будет счётчик, но его ещё надо объявить, поэтому иди в объявления private и напиши следующее:
Теперь мы познакомимся с типами данных Delphi. Мы объявили с тобой две переменные: index и cl . Первая из них - это целое, знаковое число. Вторая - это буленовское, и может принимать значения TRUE или FALSE .
Основные приготовление закончены, и мы можем переходить непосредственно к программированию. Создай обработчик события для главной формы OnMouseDown . Для этого в Object Inspector нужно перейти в закладку Events и дважды щёлкнуть по этому событию.
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var // Ключевое слово, после которого идут объявления
A: Integer; // Объявление переменной А - целое число.
begin
A := Random(3600);
CanvasSetAngle(Canvas, A / 10);
Canvas.TextOut(X, Y, FormatFloat('##0.0', A/10)+'°');
end;
Рассмотрим, что у нас получилось. Обрати внимание, что после имени процедуры я написал слово VAR . После этого слова идут объявления переменных, которые будут видны только в этой процедуре и создаются при входе, а уничтожаются после выхода из процедуры. Все объявления, которые мы делали после слов private и public видны во всех процедурах типа Имя_Класса.Имя_Процедуры . Тут есть свои нюансы, которые мы рассмотрим по мере надобности.
Теперь рассмотрим текст процедуры. В первой строчке мы используем функцию Random , она возвращает случайное значение, но не больше чем число указанное в скобках. В нашем случае - это 3600.
Вторую строчку я опущу, а рассмотрим сразу третью. Canvas.TextOut - выводит текст на форме. Canvas - это свойство формы, которое отвечает за всё, что рисуется на ней. TextOut - выводит текст в Canvas.
procedure TextOut(
X, Y: Integer; // X, Y позиция текста.
const Text: string //Текст, который будет нарисован
);
В качестве текста я опять использовал процедуру: FormatFloat. Эта процедура переводит число с запятой (вещественное, или так сказать дробное) с учётом формата.
function FormatFloat(
const Format: string; // Строка формата
Value: Extended // Число
): string;
В нашем случае эта функция возвращает строку и прибавляет к этой строке значок градуса.
Теперь возвращаемся ко второй строке. CanvasSetAngle - этой процедуры ещё нет, мы её должны написать. Я сейчас приведу весь текст программы, а потом мы рассмотрим эту процедуру отдельно.
unit Textrot1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
index:Integer;
cl:Boolean;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure CanvasSetAngle(C: TCanvas; A: Single);
var
LogRec: TLOGFONT; // Объявляем переменную логического шрифта
begin
GetObject(C.Font.Handle,SizeOf(LogRec),Addr(LogRec));
LogRec.lfEscapement := Trunc(A*10);
LogRec.lfOrientation := Trunc((A+10) * 100);
C.Font.Handle := CreateFontIndirect(LogRec);
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var A: Integer;
begin
A := Random(3600);
CanvasSetAngle(Canvas, A / 10);
Canvas.TextOut(x, Y, FormatFloat('##0.0', A/10)+'°');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
index:=0;
Canvas.Brush.Style:=bsClear;
end;
end.
В качестве параметров мы передаём процедуре Canvas и угол разворота текста. Угол разворота - имеет значение Single - что означает вещественное (дробное). До этого имя процедур вместо нас писал Delphi. Эту процедуру тебе придётся вписывать своими руками, поэтому познакомимся с ней поближе.
procedure - зарезервированное слово, процедура.
CanvasSetAngle - имя процедуры
Дальше в скобках идут параметры, передаваемые в процедуру. Это означает, что у нас есть какое-то значение, мы его отдаём процедуре, которая может с ним работать. Обрати внимание, что это единственная процедура не выглядящая как Имя_Класса.Имя_Процедуры . Это означает, что наша процедура не относиться к классу TForm1 .
Я очень часто использую слово функция. Функция - это процедура, которая возвращает какое-то значение. Её объявление будет выглядеть как:
function HHH (Передаваемые параметры):Тип;
function - зарезервированное слово, функция.
HHH - имя процедуры
Тип - Тип возвращаемого значение. Например "integer".
Теперь перейдём к содержимому процедуры. Рассмотрим по частям первую строчку.
GetObject //Это функция возвращает информацию о графическом объекте
C.Font.Handle // Объект на который нужно получить значение.
SizeOf(LogRec)// Передаем размер возвращаемого значения
Addr(LogRec)// Передаём адрес возвращаемого значения
С помощью этой функции, мы получаем информацию о шрифте, используемом нами для рисования. Вторая и третья строчки этой процедуры изменяют значения полученной информации. Четвёртая функция записывает изменённую информацию.
Запусти получившееся приложение, и пощёлкай по форме мышкой. Когда наиграешься, закрой программу и я продолжу.
Теперь поставь на форме Timer , который находиться в закладке System . Создай для таймера обработчик события OnTimer и напиши в нём следующее:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
CanvasSetAngle(Canvas, index);
Canvas.TextOut(100, 100, 'CyD Soft');
index:=index+45;
if index>=360 then
begin
index:=0;
if cl then
Canvas.Font.Color:=clBlack
else
Canvas.Font.Color:=clRed;
cl:=not cl;
end;
end;
Вот уже и закончился очередной урок программирования. На прощанье я напомню, что если ты что-то не понял, не огорчайся. Со временем всё станет ясно. В этой статье я тебе рассказал многое из того, что не говорил в прошлой. Я даю тебе информацию постепенно. Если я дам тебе сразу всё, то ты всё равно не запомнишь.