Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Примеры и задачи.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3.66 Mб
Скачать

Implementation

{$R *.dfm}

uses

DateUtils; // для доступа к SecondOf, //MinuteOf и HourOf

const

R = 75;

// радиус циферблата часов

var

xO,yO: integer; //центр циферблата ahr,amin,asec: integer; // положение стрелок (угол)

// инициализация формы

procedure TForml.FormCreate(Sender: TObject);

var

t: TDateTime; begin

// зададим размер формы

// в соответствии с размером циферблата

ClientHeight := (R+10)*2;

ClientWidth := (R+10)*2;

xO := R+10; yO := R+10;

t := Now();

// положение стрелок

ahr :- 90 - HourOf(t)*30-(MinuteOf(Today)div 12)*6;

amin := 90 - MinuteOf(t)*6;

asec := 90 - SecondOf(Today)*6;

Timerl.Interval := 1000; // период сигнале от таймера 1 сек Timerl.Enabled := True; // пуск таймера

end;

// вычерчивает вектор заданной длины из точки (х0,у0) procedure TForml.Vector(x0,y0: integer; a, 1: integer);

// х0,у0 - начало вектора

//а — угол между осью х и вектором

// 1 — длина вектора const

GRAD = 0.0174532; // коэффициент пересчета угла из градусов

// в радианы var

х,у: integer; // координаты конца вектора begin

Canvas.MoveTo(x0,y0);

х := Round(xO + l*cos(a*GRAD));

У := Round(y0 - l*sin(a*GRAD));

Canvas.LineTo(x, y) ; end;

// рисует стрелки

Procedure TForml.DrawClock; var

t: TDateTime; begin

//шаг секундной и минутной стрелок 6 градусов, // часовой - 30.

// стереть изображение стрелок

Canvas.Pen.Color := clBtnFace;

Canvas.Pen.Width :=3;

// часовую

Vector(x0,y0, ahr, R-20);

88

Примеры и задачи

89

// минутную

Vector(xO,yO, amin, R-15);

// секундную

Vector(xO,yO, asec, R-7);

t := Now();

// новое положение стрелок

ahr := 90 - HourOf(t)+30-(MinuteOf(t)div 12)*6;

amin := 90 - MinuteOf(t)*6;

asec := 90 - SecondOf(t)*6;

// нарисовать стрелки часовая //стрелка

Canvas.Pen.Width := 3; Canvas.Pen.Color := clBlack; Vector(x0,y0, ahr, R-20);

// минутная стрелка Canvas.Pen.Width := 2; Canvas.Pen.Color := clBlack; Vector(x0,y0, amin, R-15);

// секундная стрелка Canvas.Pen.Width := 1; Canvas.Pen.Color := clYellow; Vector(x0,y0, asec, R-7);

end;

// прорисовка циферблата и начальных стрелок procedure TForml.FormPaint(Sender: TObject) ;

// циферблат

while a < 360 do begin

x:=x0+Round( R * cos(a*2*pi/360));

y:=x0-Round( R * sin(a*2*pi/360)) ;

Forml.Canvas.MoveTo(x, y) ;

if (a mod 30) = 0

then Canvas.Ellipse(x-2,y-2,x+3,y+3) else Canvas.Ellipse(x-l,y-l,x+l,y+l);

a:=a+ 6; // 1 минута — 6 градусов end;

// восстановить карандаш-кисть Canvas.Pen.Width := pw; Canvas.Pen.Color := pc;

DrawClock; end;

// прорисовка текущих положений стрелок часов procedure TForml.TimerlTimer(Sender: TObject); begin

DrawClock; end;

end.

35. Напишите программу, которая в диалоговом окне выводит изображение идущих часов с часовой, минутной и секундной стрелками (рис. 1.33).

x,yf integer; // координаты маркера на циферблате

a: integer; // угол между ОХ и прямой (х0,у0) (х,у)

// цвет карандаша // ширина карандаша

рс: TColor;

pw: integer; begin

рс := Canvas.Pen.Color; pw := Canvas.Pen.Width;

Canvas.Pen.Width := 1; Canvas.Pen.Color := clBlack;

a:=0; // метки ставим от 3-х часов, против часовой стрелки

Рис. 1.33. Окно программы Часы

90

Часть Г

Примеры и задачи

91

unit clock2_; interface

uses

Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, Dialogs, ExtCtrls;

type

TForml = class(TForm) Tirnerl: TTimer;

procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure TimerlTimer(Sender: TObject);

// эти объявления вставлены вручную procedure Vector(xO,yO,a,1: integer); procedure DrawClock;

private

I Private declarations ) public

{ Public declarations j end;

var

Forml: TForml;

implementation

{$R *.dfm}

uses

DateUtils; // для доступа к SecondOf, // MinuteOf и HourOf

const

R = 75;

// радиус циферблата часов

var

xO,yO: integer; // центр циферблата ahr,amin,asec: integer; // положение стрелок (угол)

// инициализация формы

procedure TForml.FormCreate(Sender: TObject);

var

t: TDateTime;

begin

// зададим размер формы

// в соответствии с размером циферблата

ClientHeight := (R+30)*2;

ClientWidth := (R+30)*2;

xO := R+30;

yO := R+30;

t := Now();

// положение стрелок

ahr := 90 - HourOf(t)*30-(MinuteOf(Today)div 12)*6;

amin := 90 - MinuteOf(t)*6;

asec := 90 - SecondOf(Today)*6;

Timerl.Interval := 1000; // период сигналов от таймера 1 сек TimerI.Enabled := True; // пуск таймера

end;

// вычерчивает вектор заданной длины из точки (х0,у0) procedure TForml.Vector(x0,y0: integer; a, 1: integer);

// х0,у0 — начало вектора

//а — угол между осью х и вектором

// 1 — длина вектора const

GRAD = 0.0174532; // коэффициент пересчета угла из градусов

// в радианы var

х,у: integer; // координаты конца вектора

begin

Canvas.MoveTo(x0,y0);

х := Round(xO + l*cos(a*GRAD));

у := Round(yO - l*sin(a*GRAD));

Canvas.LineTo(x, у); end;

// рисует стрелки

procedure TForml.DrawClock; var

t: TDateTime; begin

// шаг секундной и минутной стрелок 6 градусов //часовой — 30.

92

Примеры и задачи

93

// стереть изображение стрелок

Canvas.Pen.Color := clBtnFace;

Canvas.Pen.Width :=3;

// часовую

Vector(xO,yO, ahr, R-20);

// минутную

Vector(xO,yO, amin, R-15);

// секундную

Vector (xO,yO, asec, R-7);

t := Now() ;

// новое положение стрелок

ahr := 90 - HourOf(t)*30-(MinuteOf(t)div 12)*6;

amin := 90 - MinuteOf(t)*6;

asec := 90 - SecondOf(t)*6;

// нарисовать стрелки

//часовая стрелка Canvas.Pen.Width := 3; Canvas.Pen.Color := clBlack; Vector (x0,y0, ahr, R-20);

// минутная стрелка Canvas.Pen.Width := 2; Canvas.Pen.Color := clBlack; Vector(x0,y0, amin, R-15);

// секундная стрелка Canvas.Pen.Width := 1; Canvas.Pen.Color : = clYellow; Vector(x0,y0, asec, R-7);

end;

// прорисовка циферблата и начальных стрелок

procedure TForml.FormPaint(Sender: TObject);

var

x,y: integer; // координаты маркера на циферблате

a: integer; // угол между ОХ и прямой (х0,у0) (х,у)

h: integer; // метка часовой риски

bs: TBrushStyle; // стиль кисти рс: TColor; // цвет карандаша pw: integer; // ширина карандаша

begin

bs := Canvas.Brush.Style; pc := Canvas.Pen.Color;

pw := Canvas.Pen.Width;

Canvas.Brush.Style := bsClear; Canvas.Pen.Width := 1; Canvas.Pen.Color := clBlack;

a:=0; // метки ставим от 3-х часов, против

// часовой стрелки

h:=3; // угол 0 градусов — это 3 часа

// циферблат while a < 360 do begin

x:=xO+Round( R * cos(a*2*pi/360)); y:=xO-Round( R * sin(a*2*pi/360)); Forml.Canvas.MoveTo(x,y); if (a mod 30) = 0 then begin

Canvas.Ellipse(x-2,y-2,x+3,y+3) ; //цифры по большему радиусу x:=x0+Round( (R+15) * cos(a*2*pi/360)); y:=x0-Round( (R+15) * sin(a*2*pi/360)); Canvas.TextOut(x-5,y-7,intToStr(h)); dec(h);

if h = 0 then h:=12; end

else Canvas.Ellipse(x-l,y-l,x+l,y+l); a:=a+6; // 1 минута — 6 градусов

end;

// восстановить карандаш-кисть Canvas.Brush.Style := bs; Canvas.Pen.Width := pw; Canvas.Pen.Color := pc;

DrawClock; end;

// прорисовка текущих положений стрелок часов Procedure TForml.TimerlTimer(Sender: TObject);

94

Часть

и задачи

95

begin

DrawClock; end;

end.

unit aplane_;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons;

Рис. 1.34. Летящий над городом самолет

Рис. 1.35. Объект и фоновый рисунок

36. Напишите программу, по поверхности формы которой дви* жется изображение (рис. 1.34). Изображение перемещающегоИ объекта и фоновый рисунок (рис. 1.35) должны загружаться! файла.

type

TForml = class(TForm)

Timerl: TTimer;

Imagel: TImage;

procedure TimerITimer(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormCreate(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var

Forml: TForml;

implementation

($R *.DFM} var

Back, Picture: TBitMap; // фон и картинка

BackRct : TRect; // положение и размер области фона,

// которая должна быть восстановлена

х,у:integer; // текущее положение картинки W, H: integer; // размеры картинки

Procedure TForml.FormCreate(Sender: TObject); begin

{ Свойству AutoSize обязательно надо присвоить значение False. Это можно сделать во время создания формы. } Imagel.AutoSize := False;

96

Примеры и задачи

97

// создать два объекта битовых образа Back := TBitmap.Create; // фон Picture := TBitmap.Create; // картинка

// загрузить и вывести фон Back.LoadFromFile('factory.bmp1); Image1.Width := Back.Width; Imagel.Height := Back.Height; Imagel.Canvas.Draw(0, 0,Back);

// загрузить картинку, которая будет двигаться Picture.LoadFromFile('aplane.bmp');

W := Picture.Width;

H : = Picture.Height;

// определим "прозрачный" цвет

Picture.Transparent : = True;

// прозрачный цвет картинки определяет

// левый верхний пиксел картинки

Picture.TransParentColor := Picture.Canvas.Pixels[1,1];

// начальное положение картинки

x:=-W;

у := 20;

// определим сохраняемую область фона BackRct:=Bounds(x,y,W,H);

end;

// обработка сигнала таймера

procedure TForml.TimerITimer(Sender: TObject);

begin

// восстановлением фона удалим рисунок

Imagel.Canvas.CopyRect(BackRct,Back.Canvas,BackRct)

x:=x+2;

if x > Imagel.Width then x:=-W;

// определим сохраняемую область фона BackRct:=Bounds(х,у,W,H);

// выведем рисунок Imagel.Canvas.Draw(х,у,Picture) ,

end;

// завершение работы программы

procedure TForml. ForrnClose (Sender: TOb j ect ;

var Action: TCloseAction) begin

// освободим память, выделенную

// для хранения битовых образов

Back.Free;

picture.Free; end; end.


Рис. 1.36. Форма программы Мультипликация


37. Напишите программу, в окне которой отображается "муль-тик", зафуженный из ВМР-файла. Вид формы приложения при­веден на рис. 1.36, пример мультика (картинка, которая нахо­дится в BMP-файле) — на рис. 1.37.

Р ис. 1.37. Пример "мультика" — содержимое ВМР-файла