![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Гость_alligator |
|
|||
|
Unregistered |
Здравствуйте!
У меня сделана элементарная прога "Светофор" Вот код : var Form1: TForm1; Shp1,Shp2,Shp3:TShape; Panel1,Panel2,Panel3,Panel4:TPanel; d:real; bs:TBrushStyle; implementation {$R *.dfm} procedure TForm1.Shp1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var bs:TBrushStyle; r,cX,cY:real; begin r:=Shp1.Width/2; // вычисляем радиус cX:=Panel1.Left+Panel2.Left+r; // вычисляем центры круга cY:=Panel1.Top+Panel2.Top+r; d:=sqr(cX-X)+sqr(cY-Y); {вычисляем расстояние от центра круга до произвольной точки наведения курсора} if d<sqr® then { если до произвольной точки наведения курсора меньше радиуса , то круг заполняется цветом} bs:=bsSolid else bs:=bsClear; //иначе очищается Shp1.Brush.Style:=bs; Shp1.Brush.Color:=clRed ; end; procedure TForm1.Shp2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var bs:TBrushStyle; r,cX,cY:real; A, B: Real; begin r:=Shp1.Width/2; // вычисляем радиус cX:=Panel1.Left+Panel2.Left+r; // вычисляем центры круга cY:=Panel1.Top+Panel3.Top+r; d:=sqr(abs(cX-X))+sqr(abs(cY-Y));{вычисляем расстояние от центра круга до произвольной точки наведения курсора} if d<sqr® then { если до произвольной точки наведения курсора меньше радиуса , то круг заполняется цветом} bs:=bsSolid else bs:=bsClear;//иначе очищается Shp2.Brush.Style:=bs; Shp2.Brush.Color:=clYellow ; end; procedure TForm1.Shp3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var r,cX,cY:real; begin r:=Shp1.Width/2; // вычисляем радиус cX:=Panel1.Left+Panel2.Left+r; // вычисляем центры круга cY:=Panel1.Top+Panel2.Top+r; d:=sqr(cX-X)+sqr(cY-Y); {вычисляем расстояние от центра круга до произвольной точки наведения курсора} if d<sqr® then { если до произвольной точки наведения курсора меньше радиуса , то круг заполняется цветом} bs:=bsSolid else bs:=bsClear; //иначе очищается Shp3.Brush.Style:=bs; Shp3.Brush.Color:=clGreen ; end; procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Shp1.Brush.Style:=bsClear; // при выведении курсора из любого Shp2.Brush.Style:=bsClear; //круга , его цвет должен Shp3.Brush.Style:=bsClear; //очиститься,т.е. свет должен погаснуть end; end. Мне, чтобы сократить код проги, там где вычисляются радиус, центры кругов и прочее, нужно вставить свою функцию. Делаю на примере одного круга, но ни черта не выходит : function Polojenie (var r,d:real ):TBrushStyle; begin r:=Shp1.Width/2; cX:=Panel1.Left+Panel2.Left+r; cY:=Panel1.Top+Panel2.Top+r; d:=sqr(cX-X)+sqr(cY-Y); if d<sqr® then Polojenie :=bsSolid else Polojenie :=bsClear; end; procedure TForm1.Shp1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var bs:TBrushStyle; r:real; v:TBrushStyle; begin v:=Polojenie(r,d); Shp1.Brush.Style:=v; Shp1.Brush.Color:=clRed ; end; При наведении на круг (который должен загореться красным светом) - ошибка и завершении через Program Reset Подскажите где моя ошибочка и как правильно сделать function??!!! |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
По идее всё верно, но всё таки попробуй в функции
поменять переменные r,d на какие-нибудь другие например r_f, d_f, так как если глобальные переменные объявлять ещё и в процедурах и функциях как локальные, то действие их прекращяется, что может в принципе вызвать такой эффект. -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| decoder |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 18.5.2004 Где: Харьков(хохол, к сожалению) Репутация: нет Всего: -1 |
если функция не объявлена в разделе прайвэт, то все глобальные переменные доступны там только через self.переменная. попробуй написать ету функцию выше процедуры где она используеться, если ты этого не сделал, и ещё попробуй вместо polojenie:=... писать result:=... авось получиться!
--------------------
Молчать, я вас спрашиваю! |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
(я так понял на Panel1 находятся 3 Shape'а ?):
-------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |