Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2009, 12:57   #1
Тёма(C@$pEr)
Пользователь
 
Регистрация: 24.01.2009
Сообщений: 36
Радость Массив TShape??

Здравствуйте! У меня есть массив Tshape (из 30 шариков) мне нужно сделать так что бы они при столкновении со стенками сосуда и друг с другом отталкивались (v_x:=-V_x,v_у:=-V_у).Проблема в том что:
1.Чтобы код был не таким большим можно использовать FindComponent,ток пользуюсь я им первый раз и не умею еще это делать хоть код типа:
for i:=1 to 3 do begin
if shape[i].Left<( Form1.FindComponent(Format('Shape%d ',[i])) as TShape).Left
then v_x:=-V_x;
if shape[i].top<( Form1.FindComponent(Format('Shape%d ',[i])) as TShape).top
then v_y:=-V_y;
он "прожевывает".
2.В то же время все время при запуске выдает ошибку "Project Project1.exe raised exception class EAccessViolation with message 'Access' violation at address 0042CF78 in module 'Project1.exe'. Read address 00000049'. Process stopped. Use Step or to continue." Знаю уже что за ошибка,но исправить не смог(
Вся прога должна выглядеть примерно так:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
var shape:array[1..3] of TShape;
n:real;
a,V,V_x,V_y,l:integer;
x,y:real;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
for i:=1 to 3 do begin
shape[i].Top:=round(y);
shape[i].Left:=round(x);
end;
for i:=1 to 3 do begin
if shape[i].Left<( Form1.FindComponent(Format('Shape%d ',[i])) as TShape).Left
then v_x:=-V_x;
if shape[i].top<( Form1.FindComponent(Format('Shape%d ',[i])) as TShape).top
then v_y:=-V_y;
.........и т.д
x:=shape1.Left+V_x;
y:=shape1.Top+V_y;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
timer1.Enabled:=true;
for i:=1 to 3 do begin
shape[i].Visible:=true;
randomize;
v:=random(5)+1;
a:=random(360);
V_x:=round(v*cos(a));
v_y:=round(v*sin(a));
shape[i].Top:=350+V_y;
shape[i].Left:=350+V_x;
x:=shape[i].Left+V_x;
y:=shape[i].Top+V_y;
end;
end;

end.
где a-угол
V-скорость
V_x,V_y-скорость перемещения по горизонтали и вертикали
x,y-новые координаты
Везде искал,но не чего путного не нашел. Помогите пожалуйста и если можно объясните, как и в чем у меня была ошибка и как работать с FindComponent. Заранее спасибо
Тёма(C@$pEr) вне форума Ответить с цитированием
Старый 18.04.2009, 14:39   #2
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Код:
var
Form1: TForm1;
var shape:array[1..3] of TShape;
Зачем еще раз var писать. Объявляется массив типа TShape. Может ошибка в том, что в коде начинается сразу присваивание значений Left, Top. А как компоненты, а они в массиве еще не созданы.
То есть если прописать следующий код:
for I := 1 to 3 do // Iterate
begin
shape[i]:=TShape.Create(self);
end; // for

То ошибка Access Violation исчезнет.
Потом в конце работы программы желательно освободить:
Код:
  for I := 1 to 3 do    // Iterate
  begin
      shape[i].Free;
  end;    // for
Насчет работы FindComponent все просто, например создаешь переменную
FindShape: TComponent и с ней работаешь. Незнаю правильно ли понял, но например код:
Код:
for i:=1 to 3 do begin
if shape[i].Left<( Form1.FindComponent(Format('Shape%d',[i])) as TShape).Left
then v_x:=-V_x;
if shape[i].top<( Form1.FindComponent(Format('Shape%d',[i])) as TShape).top
then v_y:=-V_y;
.........и т.д
x:=shape1.Left+V_x;
y:=shape1.Top+V_y;
Я бы написал :
Код:
for i:=1 to 3 do
begin
 
  FindShape:=FindComponent('Shape'+inttostr(i));

  if shape[i].Left<(FindShape as TShape).Left then v_x:=-V_x;
  if shape[i].top<(FindShape as TShape).top then v_y:=-V_y;
 
  x:=(FindShape as TShape).Left+V_x;
  y:=(FindShape as TShape).top+V_y;
 
 end;
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 18.04.2009, 18:23   #3
Тёма(C@$pEr)
Пользователь
 
Регистрация: 24.01.2009
Сообщений: 36
По умолчанию

На счет FindComponent понял спасибо, а вот как сделать так что бы не было ошибки,не получается мож я не там это все ставлю?
в начале таймера я ставил
for I := 1 to 3 do
begin
shape[i]:=TShape.Create(self);
end;
а в конце таймера
for I:=1 to 3 do
begin
shape[i].Free;
end;
т.е то что вы и сказали. И вот когда я делал одну "молекулу" сначала с прорисовкой а потом и с TShape,там я компоненты не создавал (хотя там и массива TShape не было). Можешь поподробнее сказать (если не затруднит) как это делается ну или дать ссылку (а то я смотрел кажется такого не видел).
Тёма(C@$pEr) вне форума Ответить с цитированием
Старый 19.04.2009, 19:11   #4
Тёма(C@$pEr)
Пользователь
 
Регистрация: 24.01.2009
Сообщений: 36
Вопрос

и кстати я не хотел создавать,я хотел присваивать типа массив[элемент]:=шейп. Не подскажешь как так сделать?
Тёма(C@$pEr) вне форума Ответить с цитированием
Старый 19.04.2009, 23:45   #5
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

В принципе все очень просто (сам алгоритм движения намного сложнее соствлять).
В этом случае создается массив shape: array [1..2,1..3] of integer; {по j left, Top ; i количество Shape } В котором по первому индексу это свойства left и Top, а по второму Номер компонента. В данном случае если компонентов Shape на форме 3.
Привожу примерный код. Там только в правильном месте надо вставить присваивание свойствам компонента Shape значений из массива.
Код:
var
  Form1: TForm1;
//  shape:array[1..3] of TShape;
  shape: array [1..2,1..3] of integer; {по j left, Top ; i количество Shape }
  n:real;
  a,V,V_x,V_y,l:integer;
  x,y:real;
  FindShape: TComponent;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i,j:integer;
begin
  for i:=1 to 3 do
  begin
    shape[1,i]:=round(y); //Top
    shape[2,i]:=round(x); //Left
  end;//i

for i:=1 to 3 do
begin

  FindShape:=FindComponent('Shape'+inttostr(i));

  if shape[2,i]<(FindShape as TShape).Left then
  begin
    v_x:=-V_x; //left
  end;
  if shape[1,i]<(FindShape as TShape).top then
  begin
    v_y:=-V_y;  //Top
  end;

  x:=shape1.Left+V_x;
  y:=shape1.Top+V_y;
  {
  (FindShape as TShape).Left:=trunc(x);
  (FindShape as TShape).Top:=trunc(y);
  }
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  timer1.Enabled:=true;
for i:=1 to 3 do
begin
  randomize;
  v:=random(5)+1;
  a:=random(360);
  V_x:=round(v*cos(a));
  v_y:=round(v*sin(a));
  shape[1,i]:=350+V_y;//top
  shape[2,i]:=350+V_x;  //left
  x:=shape[2,i]+V_x; //left
  y:=shape[1,i]+V_y;  //top
end;//for

for I := 1 to 3 do    // Iterate
begin
  Memo1.Lines.Add(inttostr(shape[1,i]));
  Memo1.Lines.Add(inttostr(shape[2,i]));
end;

end;
На мемо1 можно внимания не обращать это я для себя для проверки значений в массиве.
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 20.04.2009, 01:08   #6
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Кстати, вот хороший исходник по броуновскому движению
Вложения
Тип файла: zip broun.zip (12.8 Кб, 26 просмотров)
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 20.04.2009, 10:42   #7
Тёма(C@$pEr)
Пользователь
 
Регистрация: 24.01.2009
Сообщений: 36
По умолчанию

Большое спасибо!
Тёма(C@$pEr) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение TShape Furious_Angel Помощь студентам 2 07.12.2008 16:34
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06
Вопрос о TShape Rusl92 Общие вопросы Delphi 3 21.08.2008 12:53
Массив vitalik007 Помощь студентам 15 17.10.2007 19:56
Как перемещать TShape с помощью мыши? SaCREDO Помощь студентам 1 29.03.2007 00:37