Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Gluck
Статус: 3-й класс
Рейтинг: 263
∙ повысить рейтинг »
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 0
∙ повысить рейтинг »

∙ Pascal / Delphi / Lazarus

Номер выпуска:1853
Дата выхода:18.09.2020, 00:45
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:39 / 39
Вопросов / ответов:1 / 1

Консультация # 199167: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В общем есть программа, выполнял по методичке, все работает, но остались два нерешенных вопроса: 1) Как добавить в программу код запрещающий вводить в компонент EditRad любую нечисловую информацию и организовать проверку, которая будет позволять вводить только такие...

Консультация # 199167:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

В общем есть программа, выполнял по методичке, все работает, но остались два нерешенных вопроса:
1) Как добавить в программу код запрещающий вводить в компонент EditRad любую нечисловую информацию и организовать проверку, которая будет позволять вводить только такие значения радиуса вращения, при которых точка не будет выходить за границы области отображения;
2) Дополнить имеющуюся программу возможностью регулирования ''плавности'' вращения, то есть изменения значения переменной StepPoint по аналогу с регулированием скорости вращения. Добавить компонент TrackBar, со значениями от 1 до 20. При перемещении ползунка необходимо изменять значение переменной StepPoint и пересчитывать скорость вращения.

Код программы, которая у меня есть:

Код (Pascal) :: выделить код
implementation
var
RadCircle:integer;
CenterX, CenterY:integer;
PointX, PointY:integer;
Angle:real;
RadPoint:integer;
StepPoint:real;
PointColor:TColor;

{$R *.dfm}

procedure TForm1.ButtonMoveClick(Sender: TObject);
begin
if Timer1.Enabled then
begin
ButtonMove.Caption:=' Запустить';
LEditRad.Enabled:= true;
end
else
begin
RadCircle:= StrToInt(LEditRad.Text);
LEditRad.Enabled:= false;
ButtonMove.Caption:=' Остановить';
end;
Timer1.Enabled:= not Timer1.Enabled;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Angle := 0;
RadCircle := 100;
RadPoint := 5;
StepPoint := 1;
CenterX := Form1.Width div 2;
CenterY := (Form1.Height - Panel1.Height) div 2;
PointX := CenterX + RadCircle;
PointY := CenterY;
PointColor := clRed;
Canvas.Pen.Color := PointColor;
Canvas.Brush.Color := PointColor;
Canvas.Ellipse(PointX - radPoint,PointY - RadPoint,
PointX + RadPoint, PointY + RadPoint);
end;

procedure TForm1.LEditRadChange(Sender: TObject);

begin
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
PointX := Trunc(RadCircle * cos(DegToRad(Angle)) + CenterX);
PointY := Trunc(RadCircle * sin(DegToRad(Angle)) + CenterY);
Canvas.Pen.Color := clred;//Form1.Color;
Canvas.Brush.Color :=clred;// Form1.Color;
Canvas.Ellipse(PointX - RadPoint, PointY - RadPoint,
PointX + RadPoint, PointY + RadPoint);
Angle := Angle + StepPoint;
if Angle >= 360 then Angle := 0;

end;

procedure TForm1.TrackBarSpeedChange(Sender: TObject);
begin
Timer1.Interval := Trunc(1000 * StepPoint / TrackBarSpeed.Position);
LabelSpeed.Caption:= IntToStr(TrackBarSpeed.Position);
CenterX := Form1.Width div 2;
CenterY := (Form1.Height - Panel1.Height) div 2;
end;
end

Дата отправки: 13.09.2020, 00:23
Вопрос задал: Nedix (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Старший модератор):

Здравствуйте, Nedix!

Смотрите код Delphi 6, Ваш ХЕ - за Вами:

Код (Pascal) :: выделить код
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, math, ComCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    TrackBar1: TTrackBar;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormOnPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1Change(Sender: TObject);
  private{Private declarations}
  public{Public declarations}
    PenColor:TColor;
    Angle,Step:real;
    CenterX,CenterY,
    HalfSize,Radius,
    PointX,PointY,Point:integer;
    MaxRadius:integer;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
  procedure TForm1.FormCreate(Sender: TObject);
    begin
      Form1.CenterX:=Form1.Width div 2;
      Form1.CenterY:=(Form1.Height-Form1.Panel1.Height) div 2;
      Form1.MaxRadius:=Min(Form1.CenterX,Form1.CenterY);
      Form1.Angle:=45;
      Form1.Step:=1;
      Form1.Radius:=StrToInt(Form1.Edit1.Text);
      Form1.HalfSize:=Trunc(Form1.Radius*cos(DegToRad(Form1.Angle)));
      Form1.Point:=4;
      Form1.Timer1.Interval:=Trunc(1000*Form1.Step/Form1.TrackBar1.Position);
      Form1.Edit1.Enabled:=False;
      Form1.Label1.Caption:='Radius:='+Form1.Edit1.Text;
      Form1.Label2.Caption:='Speed:='+IntToStr(Form1.TrackBar1.Position);
      Form1.TrackBar1.Enabled:=False;
    end;
  procedure TForm1.FormOnPaint(Sender: TObject);
    begin
      Form1.Canvas.Pen.Color:=Form1.PenColor;
      Form1.Canvas.Brush.Color:=Form1.PenColor;
      Form1.Canvas.Ellipse(Form1.PointX-Form1.Point,Form1.PointY-Form1.Point,
                           Form1.PointX+Form1.Point,Form1.PointY+Form1.Point);
    end;
  procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Form1.PenColor:=Form1.Color;
      Form1.FormOnPaint(Sender);
      Form1.PenColor:=clBlack;
      Form1.PointX:=Form1.CenterX;
      Form1.PointY:=Form1.CenterY;
      Form1.OnPaint(Sender);
      Form1.Angle:=Form1.Angle+Form1.Step;
      Form1.PointX:=Form1.CenterX+trunc(Form1.Radius*cos(DegToRad(Form1.Angle)));
      Form1.PointY:=Form1.CenterY+trunc(Form1.Radius*sin(DegToRad(Form1.Angle)));
      if Form1.PointX>(Form1.CenterX+Form1.HalfSize)then
         Form1.PointX:=Form1.CenterX+Form1.HalfSize;
      if Form1.PointX<(Form1.CenterX-Form1.HalfSize)then
         Form1.PointX:=Form1.CenterX-Form1.HalfSize;
      if Form1.PointY>(Form1.CenterY+Form1.HalfSize)then
         Form1.PointY:=Form1.CenterY+Form1.HalfSize;
      if Form1.PointY<(Form1.CenterY-Form1.HalfSize)then
         Form1.PointY:=Form1.CenterY-Form1.HalfSize;
      Form1.PenColor:=clRed;
      Form1.FormOnPaint(Sender);
    end;
  procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Form1.Timer1.Enabled then
        begin
          Form1.Timer1.Enabled:=False;
          Form1.Button1.Caption:='Start';
          Form1.Edit1.Enabled:=True;
          Form1.TrackBar1.Enabled:=True;
        end
        else
        begin
          Form1.Timer1.Enabled:=True;
          Form1.Button1.Caption:='Stop';
          Form1.Edit1.Enabled:=False;
          Form1.TrackBar1.Enabled:=False;
          Form1.Label2.Caption:='Speed:='+IntToStr(Form1.TrackBar1.Position);
        end;
    end;
  procedure TForm1.TrackBar1Change(Sender: TObject);
    begin
      Form1.Label2.Caption:='Speed:='+IntToStr(Form1.TrackBar1.Position);
      Form1.Timer1.Interval:=Trunc(1000*Form1.Step/Form1.TrackBar1.Position);
    end;
  procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      if not (Key in ['0'..'9',#8])then Key:=#0;
    end;
  procedure TForm1.Edit1Change(Sender: TObject);
    begin
     if length(Form1.Edit1.Text)>0then
       begin
         Form1.Radius:=StrToInt(Form1.Edit1.Text);
         if Form1.Radius>Form1.MaxRadius then
           begin
             Form1.Radius:=Form1.MaxRadius;
             Form1.Edit1.Text:=IntToStr(Form1.MaxRadius);
           end;
         Form1.Label1.Caption:='Radius:='+Form1.Edit1.Text;
         Form1.HalfSize:=Trunc(Form1.Radius*Cos(DegToRad(45)));
       end;
    end;
end.


Создаете форму:


Система координат программы:


Работа программы:


Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 17.09.2020, 13:20
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное