If b>c thenДоверь свою работу кандидату наук!
Begin x:=b; b:=c; c:=x; end; If a>b then Begin x:=a; a:=b; b:=x; end; // Проверка существования такого треугольника If (a<=0) or ((a+b)<=c) then Begin showmessage('Это не треугольник'); edit2.SetFocus; exit; end; fl:=false; iw:=image1.Width; ih:=image1.Height; k:=iw / ak; //коэффициент масштабирования if c<=ak then Begin fl:=true; showmessage('Пройдет'); End Else //сторона треугольника больше диагонали квадрата If c>ak*sqrt(2) then Begin showmessage('Не пройдет'); exit; End Else Begin y1:=sqrt(sqr(c)-sqr(ak)); ap:=4*sqr(ak)+4*sqr(y1); bp:=4*y1*(sqr(a)-sqr(b)-sqr(ak)-sqr(y1)); cp:=sqr(sqr(b))+sqr(sqr(a))+sqr(sqr(ak))+sqr(sqr(y1))+ 2*(-sqr(a)*sqr(b)+sqr(b)*sqr(ak)+sqr(b)*sqr(y1)-sqr(a)*sqr(ak)- sqr(a)*sqr(y1)+sqr(ak)*sqr(y1)-2*sqr(ak)*sqr(b)); d:=sqr(bp)-4*ap*cp; If d< 0 then Begin showmessage('Не пройдет'); exit; end; y:=(-bp+sqrt(d))/(2*ap); x:=sqr(b)-sqr(y); If (x<0) or (y>ak) then Begin showmessage('Не пройдет'); exit; end; x:=sqrt(x); If y>ak then Begin showmessage('Не пройдет'); exit; End Else Begin fl:=true; showmessage('Пройдет'); ; end; end; If not fl then exit; p[0].X:=0; p[0].Y:=0; // очистка Image и задание параметров изображения image1.Picture:=nil; image1.Canvas.Pen.Color:=clred; //image1.Canvas.Brush.Style:=bscross; image1.Canvas.Brush.Color:=clred; image1.Canvas.Rectangle(0,0,round(ak*k),round(ak*k)); image1.Canvas.Brush.Color:=clgreen; //Если большая сторона треугольника меньше // стороны квадрата if c<=ak then Begin p[1].X:=round(c*k); p[1].Y:=0; x:=(sqr(b)-sqr(a)+sqr(c))/(2*c); y:=sqrt((sqr(b)-sqr(x))); p[2].x:=round(x*k); p[2].y:=round(y*k); image1.Canvas.Polygon(p); exit; end; //Если большая сторона треугольника больше // стороны квадрата y1:=sqrt(sqr(c)-sqr(ak)); p[1].X:=round(ak*k); p[1].Y:=round(y1*k); // x:=(sqr(b)-sqr(a)+sqr(y1)-2*y*y1+sqr(ak))/(2*ak); // y:=sqrt((sqr(b)-sqr(x))); p[2].x:=round(x*k); p[2].y:=round(y*k); image1.Canvas.Polygon(p);
end; // Обработка вводимых символов в поля Edit procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); Var edit:tedit; Begin edit:=sender as tedit; Case key of '0'..'9',#8:; '-':begin if (edit.Text='') then key:=#0 Else if (edit.Text<>'') and ((copy(edit.Text,length(edit.Text),1)='E') or (copy(edit.Text,length(edit.Text),1)='e'))then key:='-' Else key:=#0; end; '+':begin if (edit.Text='') then key:='+' Else if (edit.Text<>'') and ((copy(edit.Text,length(edit.Text),1)='E') or (copy(edit.Text,length(edit.Text),1)='e'))then key:='+' Else key:=#0; end; ',','.':begin key:=decimalseparator; If pos(decimalseparator,edit.Text)<>0 then key:=#0 end; 'E','e':begin key:='E'; if ((pos('E',edit.Text)<>0) or (pos('e',edit.Text)<>0)) or ((length(edit.Text)=1) and ((copy(edit.Text,1,1)='-') or (copy(edit.Text,1,1)='+'))) or ((length(edit.Text)=0) And ((pos('E',edit.Text)=0) or (pos('e',edit.Text)=0))) then key:=#0; end; #13: case edit.Tag of//обработка нажатия клавиши Enter // предварительно вручную устанавливаем свойства tag // для каждого edit-а 0:edit2.SetFocus; 1:edit3.SetFocus; 2:edit4.SetFocus; 3:button1.SetFocus; End else key:=#0; end;
end;
end.
Обработка нажатия клавиш при вводе достаточно сложная процедура и не идеальная. Но все-таки она требует пояснений. С одной стороны для всех Edit-ов обработка одинакова, за исключением обработки нажатия кпавиши Enter. Поэтому объявлена переменная edit:tedit, которой в начале процедуры присваивается значение параметра sender: edit:=sender as tedit. Для выполнения различных действий при нажатии Enter для каждого Edit-а установлено свое, отличное от других, свойство Tag. Для предоставления пользователю возможности ввода чисел в нормальной форме обрабатывается нажатие клавиш латинских ‘E’ и ‘e’ для ввода порядка числа. Вместо обработки каждой нажатой клавиши можно было обработать ошибки конвертирования при преобразовании из строки в число.
|