Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Нажатие мышкой на форму и нахождение её координаты


Автор: ihtiandr 8.2.2011, 17:08
Уважаемые форумчане доброго всем время суток
Вот тут я написал простую программу для движения круга в форме: 

Код


var
  Form1: TForm1;
  x,y:integer;
  dx:integer;
implementation

{$R *.dfm}
procedure Ris;
begin
Form1.Canvas.Pen.Color:=Form1.Color;
Form1.Canvas.Ellipse(x,y,x+20,y+20);
x:=x+dx;
Form1.Canvas.Pen.Color:=ClBlack;
Form1.Canvas.Ellipse(x,y,x+20,y+20);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Ris;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x:=0;
y:=200;
dx:=3;
timer1.interval:=50;
Form1.Canvas.Brush.Color:=Form1.Color;
end;

end.


У меня возникла трудность.
Помогите  разобраться пожалуйста.
Что надо написать, что бы  при нажатии на форму  круг начинал движение именно с  того места где где кликнули мышкой?


Автор: Snowy 8.2.2011, 17:26
Координаты места нажатия можешь узнать в событии OnMouseDown

Автор: ihtiandr 8.2.2011, 18:48
Snowy я написал
Код

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
timer1.interval:=50;
end;


ничего не изменилось.

Автор: chip_and_dayl 8.2.2011, 19:34
ihtiandr
И поняли что написали?

В MouseDown вы получаете координаты мышки, и эти координаты должны передать в свою процедуру рисования

Автор: Snowy 8.2.2011, 20:44
Цитата(ihtiandr @  8.2.2011,  17:08 Найти цитируемый пост)
Вот тут я написал простую программу для движения круга в форме
Это не программа движения круга по форме.
Как минимум, нет самого главного - алгоритма движения.
Есть только отрисовка круга.
А как он должен двигаться - линейно, по кругу, синусоиде, или еще как?

Автор: ihtiandr 8.2.2011, 20:53
Snowy он должен начать двигаться линейно из тех координат на форме на которых кликнули мышкой.

Автор: Snowy 8.2.2011, 21:14
и куда он должен двигаться?

Автор: ihtiandr 8.2.2011, 21:14
Вот я изменил тут:

Код

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ris;
end;

 
Но тут и ошибок не вышло и изменений не произошло, круг как двигался по нажатию кнопки с определённых координат так и двигается а при клике на форму не каких изменений.

Добавлено через 3 минуты и 35 секунд
Snowy 
Цитата

и куда он должен двигаться?


при полученных координатах от клика мышкой y не будет изменяться а x должно приращиваться до конца формы 

Автор: Snowy 8.2.2011, 21:42
Скучно...
Код
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
  private
    cx, cy: integer;
    dx, dy: integer;
    img: TImage;
    procedure Draw;
    procedure StartDraw(X, Y: integer);
    procedure Ouch(Sender: TObject);
  public

  end;

const r = 40;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Draw;
begin
  if img = nil then Exit;
  inc(cx,dx); inc(cy,dy);
  if (cx+r+dy > ClientWidth) then dx := -dx
  else if (cx+dx<0) then dx := -dx;
  if (cy+r+dy > ClientHeight) then dy := -dy
  else if (cy+dy < 0) then dy := -dy;
  img.Left := cx;
  img.Top := cy;
end;

procedure TForm1.StartDraw(X, Y: Integer);
begin
  cx := x - r div 2; cy := y - r div 2;
  if img = nil then
  begin
    DoubleBuffered := true;
    img := TImage.Create(self);
    img.SetBounds(cx, cy, r, r);
    img.Picture.Bitmap.Width := r;
    img.Picture.Bitmap.Height := r;
    img.Transparent := true;
    img.OnClick := Ouch;
    with img.Picture.Bitmap.Canvas do begin
      Pen.Color := clNavy;
      Pen.Width := 2;
      Brush.Color := clYellow;
      Ellipse(0, 0, r, r);
    end;
    img.Parent := self;
  end;
  dx := Random(9)-4; dy := Random(9)-4;
  Timer1.Interval := 50;
  Timer1.Enabled := true;
end;

procedure TForm1.Ouch(Sender: TObject); // не трогай шарик
begin
  Timer1.Enabled := False;
  ShowMessage('Ай! Больно же!');
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  StartDraw(X, Y);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Draw;
end;

Автор: ihtiandr 8.2.2011, 21:50
Snowy Огромное спасибо.  smile smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)