Страница 1 из 1

Кнопка стоп в PascalABC.net, помогите.

СообщениеДобавлено: 13.06.2022 20:06:10
mikekilogolf
Есть программа, которая должна запускаться при нажатии на кнопку старт(2 кнопки запуска с правой стороны и с левой) и останавливаться при нажатии на кнопку стоп.
Я задал такую логику работы, что при нажатии на стартовую кнопку переменная n принимает значение true и выполняется цикл программы. А при нажатии кнопки стоп n:=false и цикл должен завершиться. Но при нажатии на стартовую кнопку остальные кнопки становятся некликабельными и панель зависает, а программа продолжает работать в цикле.
Нужна помощь, что исправить в коде

Код: Выделить всё
implementation

var

  x, y, s, k: integer; i: real;

  n:Boolean;
procedure Form1.start_R_Click(sender: Object; e: EventArgs);//запуск справа

begin

  n:=true;
    while n=true do
    begin //начало самой программы
      if n=false then
      begin
      line(250, 0, x + 250, y + 250);
      circle(x + 250, y + 250, 50);
      break;
      end;

    repeat
    i := i + pi / 100;
    x := round(100 * (cos(i)));
    y := round(10 * (sin(i)));
    lockdrawing;
    ClearWindow;
    line(250, 0, x + 250, y + 250);
    circle(x + 250, y + 250, 50);
    redraw;
    sleep(s);
    until i >= pi;
    i := 0;
    repeat
    i := i + pi / 100;
    x := round(100 * (-cos(i)));
    y := round(10 * (sin(i)));
    lockdrawing;
    ClearWindow;
    line(250, 0, x + 250, y + 250);
    circle(x + 250, y + 250, 50);
    redraw;
    sleep(s);
    until i >= pi;
    if i >= pi then i := 0;
    end; //конец программы
end;

procedure Form1.start_L_Click(sender: Object; e: EventArgs);//запуск слева
begin
n := true;
  while n=true do
  begin   //начало самой программы
    if n=false then
    begin
    break;
    line(250, 0, x + 250, y + 250);
    circle(x + 250, y + 250, 50);
    end;
  repeat
  i := i + pi / 100;
  x := round(100 * (-cos(i)));
  y := round(10 * (sin(i)));
  lockdrawing;
  ClearWindow;
  line(250, 0, x + 250, y + 250);
  circle(x + 250, y + 250, 50);
  redraw;
  sleep(s);
  until i >= pi;
  i := 0;
  repeat
  i := i + pi / 100;
  x := round(100 * (cos(i)));
  y := round(10 * (sin(i)));
  lockdrawing;
  ClearWindow;
  line(250, 0, x + 250, y + 250);
  circle(x + 250, y + 250, 50);
  redraw;
  sleep(s);
  until i >= pi;
  if i >= pi then i := 0;
  end; //конец программы

end;

procedure Form1.stop_Click(sender: Object; e: EventArgs);//кнопка стоп

begin
  n:=false;
  line(250, 0, x + 250, y + 250);//возврат маятника
  circle(x + 250, y + 250, 50);//                  в начальное положение

Re: Кнопка стоп в PascalABC.net, помогите.

СообщениеДобавлено: 14.06.2022 22:06:55
v-t-l

Re: Кнопка стоп в PascalABC.net, помогите.

СообщениеДобавлено: 15.06.2022 03:38:38
Seenkao
В событиях кнопки, ты не должен ни чего делать.
Твой цикл должен работать по таймеру. А это означает, что программу надо переделывать полностью.

Твои циклы "зациклены" и ни когда не выйдут. Потому что процесс запущен, кнопка нажата и цикл запущен. Ни какая программа не будет влезать в данный цикл, пока он не закончит работу. А работу он не закончит потому что n не изменится (в твоём варианте просто зависнет на вечном цикле).

При обработке кнопок такие действия не делаются. И даже если ты это сделаешь в таймере, то не факт, что будет выход из твоего цикла.

Сам цикл (внешний) надо убрать, код засунуть в таймер. При обработке кнопок, просто включаешь или выключаешь таймер.

Re: Кнопка стоп в PascalABC.net, помогите.

СообщениеДобавлено: 16.06.2022 10:43:01
wavebvg
Seenkao писал(а):таймер

Можно отправить PostMessage форме и обработать его.

Re: Кнопка стоп в PascalABC.net, помогите.

СообщениеДобавлено: 16.06.2022 12:19:43
Seenkao
wavebvg, начинающим не желательно такие советы давать. Сначала с таймерами научаться всё делать, а после можно уже более продвинутые способы рассматривать.