Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Как сделать свою функцию   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
3-1087900494
calm
2004-06-22 14:34
2004.07.18
ConnectionString к gdb-базе, без указания источника ODBC


3-1088164125
Ven
2004-06-25 15:48
2004.07.18
Выборка из Базы Данных


1-1089048335
Arm79
2004-07-05 21:25
2004.07.18
Преобразование типов


6-1085385125
Vik_Sennikov
2004-05-24 11:52
2004.07.18
Сохранение картинки средствами IE


3-1087988695
nik7777
2004-06-23 15:04
2004.07.18
Вопрос по репликации