![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Как определить координаты клика по TImage ? 
		
	
		
		
		
		
		
		
			Последний раз редактировалось RayOfLight, 30.09.2009 в 22:52.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Без события MouseMove никакой клик не обойдется. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код: 
	procedure TForm1.Image1Click(Sender: TObject);
var
  pt: TPoint;
begin
  GetCursorPos(pt);
  pt := ScreenToClient(pt);
  ShowMessage('Coordinates: X=' + IntToStr(pt.X - Image1.Left) +
              ' Y=' + IntToStr(pt.Y - Image1.Top));
end;Ой! Код: 
	procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage('Coordinates: X=' + IntToStr(X) +
              ' Y=' + IntToStr(Y));
end;Последний раз редактировалось Nyctos Kasignete, 27.09.2009 в 23:11.  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код: 
	pt := Image1.ScreenToClient(pt);  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Спасибо  
		
	
		
		
		
		
		
	
		
		
	
	
	  Дело в том, что мне надо написать игру "Жизнь" Джона Конвея. Программа работает правильно только первый ход, а дальше идут какие-то ошибки (клетки расставляются не так, элементарный glider не получается). Может, подскажете мне, что у меня не так? Алгоритм сыроват, правда ![]() Привожу код всей программы: Код: 
	unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Buttons, StdCtrls, Menus;
type
  TForm1 = class(TForm)
    Field: TImage;
    Panel1: TPanel;
    StartButton: TButton;
    StopButton: TButton;
    ClearButton: TButton;
    ExitButton: TButton;
    MainTimer: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FieldClick(Sender: TObject);
    procedure ExitButtonClick(Sender: TObject);
    procedure StartButtonClick(Sender: TObject);
    procedure MainTimerTimer(Sender: TObject);
    procedure StopButtonClick(Sender: TObject);
    procedure ClearButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    fa:array[0..11,0..11] of byte;
    fanew:array[0..11,0..11] of byte;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
  var i,j:integer;
begin
  {Рисование клеток}
  for i:=0 to 11 do begin
  for j:=0 to 11 do begin
    fa[i,j]:=0;
    fanew[i,j]:=0;
    Field.Canvas.Rectangle(i*20, j*20, i*20+20, j*20+20);
  end;
  end;
end;
procedure TForm1.FieldClick(Sender: TObject);
  var x, y, z1, z2:integer;
begin
{Определяем координаты курсора над изображением}
x:=Mouse.CursorPos.X;
y:=Mouse.CursorPos.Y;
z1 := trunc((x - Form1.Left - Field.Left) / 20);
z2 := trunc((y - Form1.Top - Field.Top) / 20);
{Закрашиваем клетки}
case fa[z1,z2] of
  1:begin
    fa[z1,z2]:= 0;
    Field.Canvas.Brush.Color := clWhite;
    Field.Canvas.FloodFill(z1*20+1, z2*20+1, clRed, fsSurface);
    Field.Refresh;
  end;
  0: begin
    fa[z1,z2] := 1;
    Field.Canvas.Brush.Color := clRed;
    Field.Canvas.FloodFill(z1*20+1,z2*20+1,clWhite,fsSurface);
    Field.Refresh;
  end;
end;
end;
{Выход}
procedure TForm1.ExitButtonClick(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.StartButtonClick(Sender: TObject);
  var i,j,k:integer;
begin
{Считаем количество поставленных фишек на поле}
{Если на поле нет фишек, выводим сообщение}
{Если фишки расставлены, запускаем таймер}
  k:=0;
  for i:=0 to 11 do for j:=0 to 11 do k := k + fa[i,j];
  if k = 0 then begin
    MessageBox(0,'На поле нет ни одной фишки.','Ошибка!',MB_OK);
  end
  else begin
    MainTimer.Enabled := true;
    StopButton.Enabled := true;
    ClearButton.Enabled := false;
  end;
end;
procedure TForm1.MainTimerTimer(Sender: TObject);
  var i,j,n:integer;
begin
{Проверяем кол-во соседей вокруг каждой клетки и заполняем второй массив}
for i:=1 to 10 do begin
for j:=1 to 10 do begin
  if (fa[i,j]=2) then fa[i,j]:=1;
  n:= fa[i-1,j-1] + fa[i-1,j] + fa[i-1,j+1] + fa[i,j-1] + fa[i,j+1] + fa[i+1,j-1] + fa[i+1,j] + fa[i+1,j+1];
  if (fa[i,j]=1) and ((n<>2) and (n<>3)) then fanew[i,j]:=0;
  if (fa[i,j]=1) and ((n=2) or (n=3)) then fanew[i,j]:=2;
  if (fa[i,j]=0) and (n=3) then fanew[i,j]:=1;
end;
end;
for i:=1 to 10 do begin
for j:=1 to 10 do begin
  fa[i,j] := 0;
end;
end;
Field.Canvas.Brush.Color := clWhite;
for i:= 0 to 11 do begin
for j:= 0 to 11 do begin
  Field.Canvas.FloodFill(i*20+1, j*20+1, clRed, fsSurface);
end;
end;
for i:=1 to 10 do begin
for j:=1 to 10 do begin
  fa[i,j] := fanew[i,j];
  fanew[i,j]:=0;
  case fa[i,j] of
    0: begin
      Field.Refresh;
      end;
    1: begin
      Field.Canvas.Brush.Color := clRed;
      Field.Canvas.FloodFill(i*20+1,j*20+1,clWhite,fsSurface);
      Field.Refresh;
      end;
    2: begin
      Field.Canvas.Brush.Color := clRed;
      Field.Canvas.FloodFill(i*20+1,j*20+1,clWhite,fsSurface);
      Field.Refresh;
      end;
  end;
  
end;
end;
end;
procedure TForm1.StopButtonClick(Sender: TObject);
begin
  MainTimer.Enabled := false;
  StartButton.Enabled := true;
  ClearButton.Enabled := true;
end;
procedure TForm1.ClearButtonClick(Sender: TObject);
  var i,j:byte;
begin
  Field.Canvas.Brush.Color := clWhite;
  for i:= 0 to 11 do begin
  for j:= 0 to 11 do begin
    Field.Canvas.FloodFill(i*20+1, j*20+1, clRed, fsSurface);
    fa[i,j] := 0;
    fanew[i,j] := 0;
  end;
  end;
  Field.Refresh;
end;
end. | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 тот-же  
		
	
		
		
		
		
			
		
		
		
		
		
			y:=Mouse.CursorPos.Y; //определяет общее положение курсора попробуй проще люди тебе выше комманды написали ----------------------------------------------(непра-) procedure TForm1.FieldClick(Sender: TObject); var x, y, z1, z2:integer; begin ----------------------------------------------(вильно) ты заносишь координаты в переменную y напрямую коммандой y:=Mouse.CursorPos.Y;//а она узнает общее положение курсора а нам надо кд.курсора у image из-за этого тебе приходится убавлять делить и т.д. z2 := trunc((y - Form1.Top - Field.Top) / 20);//   а узнавать координаты image нужно в событии mousedown, mouseup, mousemove. Допустим, в общем var создаем переменные X1 И Y1 var Form1: TForm1; x1,y1:integer; в событии mousedown у image пишем x1:=x; y1:=y; и все, при клике на image в переменных x1 и y1 появятся точные координаты. (и ненадо никаких z2 := trunc((y - Form1.Top - Field.Top) / 20) ![]() Последний раз редактировалось -sanya-, 01.10.2009 в 19:03.  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 x= Mouse.CursorPos.X-Form1.Left 
		
	
		
		
		
		
		
	
		
		
	
	
	y=Mouse.CursorPos.Y-Form1.Top  |