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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
mikekilogolf
незнакомец
Сообщения: 1
Зарегистрирован: 13.06.2022 18:58:34

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

Сообщение 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);//                  в начальное положение
Вложения
Нажатие на стоп.png
Нажатие на стоп.png (7.73 КБ) 25277 просмотров
Seenkao
энтузиаст
Сообщения: 573
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

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

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

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

Сам цикл (внешний) надо убрать, код засунуть в таймер. При обработке кнопок, просто включаешь или выключаешь таймер.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

Seenkao писал(а):таймер
Можно отправить PostMessage форме и обработать его.
Seenkao
энтузиаст
Сообщения: 573
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

wavebvg, начинающим не желательно такие советы давать. Сначала с таймерами научаться всё делать, а после можно уже более продвинутые способы рассматривать.
Ответить