Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Вниз
Как сделать свою функцию Найти похожие ветки
← →
jktu (2004-07-05 02:16) [0]Здравствуйте!
У меня сделана элементарная прога "Светофор"
Вот код :
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(r) 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(r) 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(r) 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(r) 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??!!!
← →
TUser © (2004-07-05 02:34) [1]Такое не скомпилиться. В ф-ции Polojenie не объявлена куча переменных. А отвечающий тоже не знает, чему там X и Y равно.
← →
@BraIN © (2004-07-05 02:35) [2]Не стал всматриваться, поэтому первое что вижу.
if d<sqr(r) then
Polojenie :=bsSolid
else
Polojenie :=bsClear;
>>
if d<sqr(r) then
Result :=bsSolid
else
Result :=bsClear;
← →
@BraIN © (2004-07-05 02:46) [3]Вообще код можно целиком выбросить. Половина строк вообще не нужна, как уже сказал TUser "не объявлена куча переменных".
← →
GuAV © (2004-07-05 03:28) [4]
> Не стал всматриваться, поэтому первое что вижу.
Это как раз не ошибка, это кому как нравится.
в целом,
> Такое не скомпилиться.
, поэтому ждем кода, который бы компилировался.
если не понятно, как этого достичь, то так и нужно спрашивать...
← →
@BraIN © (2004-07-05 03:45) [5]GuAV © (05.07.04 03:28) [4]
Прав.
← →
@BraIN © (2004-07-05 03:48) [6]GuAV © (05.07.04 03:28) [4]
Прав. А вообще, "и я того же мнения" -> [3]
← →
GrayFace © (2004-07-05 07:04) [7]>Polojenie :=bsSolid
Лучше юзай Result:=bsSold.
function Polojenie(x,y:integer):TBrushStyle;
var r:real; d,cX,cY:integer;
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(r) then Result:=bsSolid
else Result:=bsClear;
end;
procedure TForm1.Shp1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Shp1.Brush.Style:=Polojenie(x,y);
Shp1.Brush.Color:=clRed;
end;
Сколько дней назад ты начал программировать?
← →
KADAN © (2004-07-05 09:10) [8]
> GrayFace © (05.07.04 07:04) [7]
хотел тебя упрекнуть, что пишешьcX:=Panel1.Left+Panel2.Left+r;
вместоcX:=Form1.Panel1.Left+Form1.Panel2.Left+r;
Но потом заметил что и правда, панели, как и шейпы, не являются детьми формы, однако почему же все-таки обработчики событий являются функциями класса TForm1?
И еще одно: не проще ли для всех шейпов сделать один обработчик и менять цвет Sender"а?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c