|
#1
|
|||
|
|||
помогите с TTimer
мне надо, чтобы рисование линей было постепенным. помогите это сделать, плиз
|
#2
|
|||
|
|||
Если я вас правильно понимаю, вы желаете, чтобы линия рисовалась по отрезкам через определенные интервалы времени, установленные для Timer?
Вот примерный вариант исполнения... На форме компонент Image1 (TImage), кнопка Button1, и Timer. Линия рисуется после нажатия на кнопку. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Image1: TImage; Button1: TButton; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Step: Integer; // px StartPt, EndPt: TPoint; TimeToDraw: Integer; // ms LineLength: Real; cosAlpha, sinAlpha: Real; currX, currY: Real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin { вот эти переменные вам нужно задавать самостоятельно } StartPt.X := 10; StartPt.Y := 10; // точка, из которой начинается линия EndPt.X := 250; EndPt.Y := 100; // точка, где линия заканчивается Step := 5; // длина единичных отрезков из которых складывается линия (в пикселях) TimeToDraw := 3000; // время, в течение которого будет расти линия (в миллисекундах) { здесь уже без вашего участия рассчитываются вспомогательные переменные } LineLength := Sqrt(Sqr(EndPt.X - StartPt.X) + Sqr(EndPt.Y - StartPt.Y)); cosAlpha := (EndPt.X - StartPt.X) / LineLength; sinAlpha := (EndPt.Y - StartPt.Y) / LineLength; Timer1.Interval := Round(TimeToDraw * Step / LineLength); Image1.Canvas.PenPos := StartPt; currX := StartPt.X; currY := StartPt.Y; Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin with Image1.Canvas do begin currX := currX + Step * cosAlpha; currY := currY + Step * sinAlpha; LineTo(Round(currX), Round(currY)); if (PenPos.X > EndPt.X) or (PenPos.Y > EndPt.Y) then Timer1.Enabled := False; end; end; end. P.S. Слишком мелкий шаг и малое время для роста линии могут повергнуть таймер в глубокую печаль... =) Последний раз редактировалось Nyctos Kasignete, 11.04.2009 в 20:58. |
#3
|
|||
|
|||
спасибо большое, я разобралась, но мне надо немного другое
я попробую это сделать по вашему примеру *kissing* |