時計のように動かすには?

解決


deldel  2006-05-22 23:37:18  No: 21730  IP: 192.*.*.*

ボタンを押すたびに時計の秒針のようにある点を中心に線が動いていくようなものをつくりたいのですが、どのように考えればよろしいのでしょうか?
教えてください。よろしくお願いいたします。

編集 削除
このへん?  2006-05-22 23:55:08  No: 21731  IP: 192.*.*.*

http://laboratory.sub.jp/phy/m13.html
高校数学2

編集 削除
三角関数  2006-05-23 01:57:09  No: 21732  IP: 192.*.*.*

https://www.petitmonte.com/bbs/answers?question_id=3906
も参考になると思う。

それのFStartPoint.XとYを中心にして、あとは長さ(DistX,DistY)一定で
まわせばいい。

編集 削除
deldel  2006-05-25 16:01:14  No: 21733  IP: 192.*.*.*

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.

編集 削除
deldel(本家です)  2006-05-25 16:40:19  No: 21734  IP: 192.*.*.*

押すたびにくるくる回ります。

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;

編集 削除
えーと  2006-05-25 16:55:24  No: 21735  IP: 192.*.*.*

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.

編集 削除
えーと  2006-05-25 16:59:34  No: 21736  IP: 192.*.*.*

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(2号)  2006-05-28 15:50:41  No: 21737  IP: 192.*.*.*

本家deldelさんへ
実行するとinc(ib);の行に代入できない左辺値です
というエラーメッセージが出るのですがどうしてでしょうか?

編集 削除
おぷしょん  2006-05-28 23:52:19  No: 21738  IP: 192.*.*.*

なぜByteにするのかワケわかめ...
{$J+} ib: Byte = 45; {$J-}

編集 削除
んー  2006-05-29 08:02:03  No: 21739  IP: 192.*.*.*

{$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は固定値に使うべきもので、初歩を学習している
段階では、固定値を変更するような書き方は避けたほうが
よいでしょう。
(こういったものは、投稿者が、
できる限りコードを短くして投稿しようとした
ためだと思うので、こういう意図を読み取って、一般的な
コードに復元するものだと思ったほうが良いです。)

編集 削除
本家deldel  2006-05-29 09:15:56  No: 21740  IP: 192.*.*.*

>実行するとinc(ib);の行に代入できない左辺値です
>というエラーメッセージが出るのですがどうしてでしょうか?

D5ですが、メニューの「プロジェクト」の「オプション」を開いて、
「コンパイラ」タブを開くと、「型付き定数への代入」という項目が
ありますので、これにチェックを付けると、このエラーが出なくなります。
「おぷしょん」さんの{$J+}と同じですが・・・。

「ん〜」さんの言われるとおり、あんまりお勧めではないかも知れませんね。
ただ、コードが簡潔になるのと、この変数「ib: Byte」はButton1Clickの
中だけでしか有効でないのにグローバル変数みたいな扱いが出来るので、
便利でバグが出にくいということで、私は多用しています。

編集 削除
deldel(2号)  2006-05-30 23:14:12  No: 21741  IP: 192.*.*.*

たくさんの方からのアドバイスで思うように動いてくれました。
ありがとうございました。

編集 削除
 2006-05-31 12:26:21  No: 21742  IP: 192.*.*.*

解決だよね

編集 削除
本家deldel  2006-05-31 12:51:50  No: 21743  IP: 192.*.*.*

結局どうしたかのレポートがあれば皆のためにもなると思います。

編集 削除