ボタンを押すたびに時計の秒針のようにある点を中心に線が動いていくようなものをつくりたいのですが、どのように考えればよろしいのでしょうか?
教えてください。よろしくお願いいたします。
http://laboratory.sub.jp/phy/m13.html
高校数学2
https://www.petitmonte.com/bbs/answers?question_id=3906
も参考になると思う。
それのFStartPoint.XとYを中心にして、あとは長さ(DistX,DistY)一定で
まわせばいい。
FormにImageとButtonを貼り付けています。
このButtonを押すたびに時計の秒針ように線を動かしたいのですが
Buttonを押すたびにというところがよくわかりません。
unit tokei;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with Image1 do begin
Canvas.Ellipse(0, 0, Image1.Width, Image1.Height);
Canvas.MoveTo(112,120);
Canvas.LineTo(112,0);
end;
end;
end.
押すたびにくるくる回ります。
procedure TForm1.Button1Click(Sender: TObject);
var
w2, h2: Word;
const
ib: Byte = 45;
begin
w2 := Image1.Width div 2;
h2 := Image1.Height div 2;
with Image1 do begin
Canvas.Ellipse(0, 0, Image1.Width, Image1.Height);
Canvas.MoveTo(w2, h2);
Canvas.LineTo(w2 + Trunc(w2 * Cos(PI * ib * 6 / 180)),
h2 + Trunc(h2 * Sin(PI * ib * 6 / 180)));
end;
inc(ib);
end;
Form1 に PaintBox1 を 200X200 で置いて、あと Button1 を置いて
以下のようにします。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
byousin: integer;
cx, cy, r: integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Math;
procedure TForm1.FormCreate(Sender: TObject);
begin
byousin := 0;
cx := PaintBox1.Width div 2;
cy := PaintBox1.Height div 2;
r := Min(cx, cy) - 10;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
x, y: integer;
begin
with PaintBox1.Canvas do
begin
MoveTo(cx, cy);
x := Trunc(r * sin(PI*byousin/180)+cx);
y := Trunc(-r * cos(PI*byousin/180)+cy);
LineTo(x, y);
TextOut(2, 2, IntToStr(byousin));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(byousin);
if byousin > 359 then byousin := 0;
PaintBox1.Refresh;
end;
end.
60回で一回りするには
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
x, y: integer;
begin
with PaintBox1.Canvas do
begin
MoveTo(cx, cy);
x := Trunc(r * sin(PI*byousin/180)+cx);
y := Trunc(-r * cos(PI*byousin/180)+cy);
LineTo(x, y);
TextOut(2, 2, IntToStr(byousin div 6));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(byousin, 6);
if byousin > 359 then byousin := 0;
PaintBox1.Refresh;
end;
本家deldelさんへ
実行するとinc(ib);の行に代入できない左辺値です
というエラーメッセージが出るのですがどうしてでしょうか?
なぜByteにするのかワケわかめ...
{$J+} ib: Byte = 45; {$J-}
{$J}とか分からない気がするので。補足させていただきます。
>Buttonを押すたびにというところがよくわかりません。
グローバル変数を使うか
クラスメンバーに変数を1つ追加して利用したほうがよいです。
この場合、TForm1のクラスメンバーに変数を追加するのが一般的です。
interface
type
TForm1 =class( TForm)
省略
private
Fib: byte;
public
constructor Create( AOwner: TComponent); override;
end;
implementation
constructor.TForm1.Create(AOwner:TComponent);
begin
inherited;
Fib:= 45;
end;
(Delphiでは、メンバー変数の頭に F をつける慣わしがあります)
constは固定値に使うべきもので、初歩を学習している
段階では、固定値を変更するような書き方は避けたほうが
よいでしょう。
(こういったものは、投稿者が、
できる限りコードを短くして投稿しようとした
ためだと思うので、こういう意図を読み取って、一般的な
コードに復元するものだと思ったほうが良いです。)
>実行するとinc(ib);の行に代入できない左辺値です
>というエラーメッセージが出るのですがどうしてでしょうか?
D5ですが、メニューの「プロジェクト」の「オプション」を開いて、
「コンパイラ」タブを開くと、「型付き定数への代入」という項目が
ありますので、これにチェックを付けると、このエラーが出なくなります。
「おぷしょん」さんの{$J+}と同じですが・・・。
「ん〜」さんの言われるとおり、あんまりお勧めではないかも知れませんね。
ただ、コードが簡潔になるのと、この変数「ib: Byte」はButton1Clickの
中だけでしか有効でないのにグローバル変数みたいな扱いが出来るので、
便利でバグが出にくいということで、私は多用しています。
たくさんの方からのアドバイスで思うように動いてくれました。
ありがとうございました。
解決だよね
結局どうしたかのレポートがあれば皆のためにもなると思います。
ツイート | ![]() |