80

Тут говорят!
Авторизация
Список форумов
Войти через акаунт
 

Помощь по Delphi
Подписаться/отписаться на тему (функция доступна только для зарегистрированных пользователей) Любимая тема (вкл/выкл) []

Добавление сообщений к этой теме для незарегистрированных пользователей невозможно
Тему смотрит 1 незарегистрированный пользователь
Модераторы
Рейтинг темы:   (22868 просмотров)
Вы не можете создавать новые темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
 

Xielf Xielf в оффлайне

энтузиаст
Сообщений: 301

Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный

Всем доброго времени суток. Я с делфи знаком всего 3 дня и как бы изучать все тонкости этого языка нет необходимости. Просто нужно написать программку. Всё почти написал и работает, но одна проблемка.
Вот часть текста:

{нажимаю Button1, запускается этот цикл}
While i <= 500 do
begin
if Button2.Click = True then Exit;
if CheckBox1.Checked = True then Exit;
a:=Random(1000);
if a mod 2 = 0 then x:=x+1 else x:=x-1;
if x < 1 then x:=14 else if x > 14 then x:=1;
case x of
1 : RadioButton1.Checked := True;
{....}
14 : RadioButton14.Checked := True;
end;
i:=i+1;
n:=TrackBar1.Position;
Sleep(n);
Label2.Caption:=FloatToStr(n);
Application.ProcessMessages;
end;


Смысл программы в следующем, нужно создать "анимацию" элементов RadioButton, которые бы "мигали" с определённой скоростью (задаётся через TrackBar).

Анимация должна запускаться нажатием кнопки Button1 (это работает) и останавливаться кнопкой Button2 (не работает)

В моём случае нажатие кнопки Button2 должно завершить цикл While.
В коде красным выделил то что не работает (т.к. Click - не Boolean), а зелёным - работает (если в процессе анимации поставлю галочку, цикл завершается). Но галочка CheckBox1 меня не устраивает, нужна именно кнопка. Вот вопрос как завершить цикл While кнопкой Button2?

Последний раз редактировалось Xielf; 21.03.13 в 12:16.
 

R0bur R0bur в оффлайне

писатель
Сообщений: 1 462

R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный

Xielf (21.03.13 12:10) писал(a):
Вот вопрос как завершить цикл While кнопкой Button2?
Если не для дела, а только для сдачи зачёта, то можно ввести в заголовок цикла глобальную булеву переменную и по событию нажатия кнопки Button2 инвертировать её значение.
Если для дела, то нужно использовать механизмы синхронизации потоков, предусмотренные в операционной системе.

Последний раз редактировалось R0bur; 21.03.13 в 22:50.
--------------------
Приходи тихо, проси мало, уходи быстро.
 

Xielf Xielf в оффлайне

энтузиаст
Сообщений: 301

Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный

R0bur (21.03.13 22:47) писал(a):
Если не для дела, а только для сдачи зачёта, то можно ввести в заголовок цикла глобальную булеву переменную и по событию нажатия кнопки Button2 инвертировать её значение.
Если для дела, то нужно использовать механизмы синхронизации потоков, предусмотренные в операционной системе.

Видимо придётся более углублено изучить Delphi..
 

R0bur R0bur в оффлайне

писатель
Сообщений: 1 462

R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный R0bur популярный

Xielf (22.03.13 00:12) писал(a):

Видимо придётся более углублено изучить Delphi..
Я так понимаю, что процедуру-обработчик события для Button1 ("Procedure Button1.Click (...)" или как там уже в Delphi -- не помню) Вы уже сделали, в ней находится текст той процедуры, который Вы привели выше. Осталось создать процедуру-обработчик для Button2 ("Procedure Вutton2.Click(...)").

Кстати, если Вы сделаете переменную-параметр цикла i глобальной, чтобы она была видна из процедур-обработчиков событий Button1.Click и Button2.Click, то для завершения цикла достаточно в процедуре Button2.Click присвоить ей значение, большее 500.

Имейте в виду, что решение это с точки зрения программирования параллельных процессов не является корректным, поскольку существует вероятность одновременного обращения к переменной i из двух процессов (точнее, нитей).

--------------------
Приходи тихо, проси мало, уходи быстро.
 

Xielf Xielf в оффлайне

энтузиаст
Сообщений: 301

Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный Xielf популярный

R0bur (22.03.13 20:47) писал(a):
для завершения цикла достаточно в процедуре Button2.Click присвоить ей значение, большее 500.
Всё, наконец дошло как это провернуть, всё на много проще чем казалось. Спасибо за советы, всё работает как надо.

Последний раз редактировалось Xielf; 23.03.13 в 00:24.
 
Быстрый переход
[]
Вверх
HOSTER.BY: профессиональный хостинг и регистрация доменов .BY
Более 35000 сайтов выбрали нас. Присоединяйтесь!
 
РЕСУРСЫ ПОРТАЛА
   Все ресурсы