Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать свою функцию 
:(
    Опции темы
Гость_alligator
Дата 5.7.2004, 01:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 5.7.2004, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



По идее всё верно, но всё таки попробуй в функции

Цитата
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;


поменять переменные r,d на какие-нибудь другие например r_f, d_f, так как если глобальные переменные объявлять ещё и в процедурах и функциях как локальные, то действие их прекращяется, что может в принципе вызвать такой эффект.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
decoder
Дата 6.7.2004, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: нет
Всего: -1



если функция не объявлена в разделе прайвэт, то все глобальные переменные доступны там только через self.переменная. попробуй написать ету функцию выше процедуры где она используеться, если ты этого не сделал, и ещё попробуй вместо polojenie:=... писать result:=... авось получиться! wink.gif
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
p0s0l
Дата 9.7.2004, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



(я так понял на Panel1 находятся 3 Shape'а ?):
Код
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Shp1: TShape;
   Shp2: TShape;
   Shp3: TShape;
   procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure Shp1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure Shp2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure Shp3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 private
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 Shp1.Brush.Style := bsClear; // при выведении курсора из любого
 Shp2.Brush.Style := bsClear; // круга , его цвет должен
 Shp3.Brush.Style := bsClear; // очиститься,т.е. свет должен погаснуть
end;

procedure MySuperFunction (shp : TShape; x, y : integer; Color : TColor);
var
 r : integer;
begin
 x := shp.Width div 2 - x;
 y := shp.Height div 2 - y;
 r := Round (Sqrt(x*x + y*y));
 if r <= shp.Width div 2 then shp.Brush.Color := Color
 else shp.Brush.Style:=bsClear;
end;

procedure TForm1.Shp1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 MySuperFunction (TShape(Sender), X, Y, clRed);
end;

procedure TForm1.Shp2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 MySuperFunction (TShape(Sender), X, Y, clYellow);
end;

procedure TForm1.Shp3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 MySuperFunction (TShape(Sender), X, Y, clGreen);
end;

end.



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.