Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
Время: 1.505 c
14-1088102829
Knight
2004-06-24 22:47
2004.07.18
Моторола C350... что, правда, брать не стоит?


1-1088661794
AndrewK
2004-07-01 10:03
2004.07.18
Как можно сделать подключаемые модули к программе


1-1088538970
Delphinist
2004-06-29 23:56
2004.07.18
Проблема с проигрыванием MIDI файлов!


6-1085035555
snake1977
2004-05-20 10:45
2004.07.18
Стандартные средсва передачи сообщений


14-1088628178
KilkennyCat
2004-07-01 00:42
2004.07.18
Что может оказать влияние на вид деятельности программиста?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский