![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 24.01.2009
Сообщений: 36
|
![]()
Здравствуйте! У меня есть массив 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. Заранее спасибо ![]() |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 06.03.2009
Сообщений: 583
|
![]() Код:
То есть если прописать следующий код: for I := 1 to 3 do // Iterate begin shape[i]:=TShape.Create(self); end; // for То ошибка Access Violation исчезнет. Потом в конце работы программы желательно освободить: Код:
FindShape: TComponent и с ней работаешь. Незнаю правильно ли понял, но например код: Код:
Код:
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 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 не было). Можешь поподробнее сказать (если не затруднит) как это делается ну или дать ссылку (а то я смотрел кажется такого не видел). |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 24.01.2009
Сообщений: 36
|
![]()
и кстати я не хотел создавать,я хотел присваивать типа массив[элемент]:=шейп. Не подскажешь как так сделать?
![]() |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 06.03.2009
Сообщений: 583
|
![]()
В принципе все очень просто (сам алгоритм движения намного сложнее соствлять).
В этом случае создается массив shape: array [1..2,1..3] of integer; {по j left, Top ; i количество Shape } В котором по первому индексу это свойства left и Top, а по второму Номер компонента. В данном случае если компонентов Shape на форме 3. Привожу примерный код. Там только в правильном месте надо вставить присваивание свойствам компонента Shape значений из массива. Код:
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 06.03.2009
Сообщений: 583
|
![]()
Кстати, вот хороший исходник по броуновскому движению
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 24.01.2009
Сообщений: 36
|
![]()
Большое спасибо!
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перемещение 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 |