Вопрос по делфи

Интересные алгоритмы, олимпиадные задачи, эффектные и эффективные решения. freepascal, delphi, c, c++, c#, java, javascript, perl, ruby, python, php, bash, wsh и т.д. Компиляторы, интерпретаторы, линкеры, отладчики, системы контроля версий и многое другое.

Модератор: xdsl

Вопрос по делфи

Сообщение Azmadan 28 мар 2009, 10:59

Народ как в делфи сделать стрелку секундомера чтоб она по кругу бегала мне говорили что по какой-то через cos или sin но точно не сказали через какую. Помогите плиззз!
Отрадно спать, отрадней камнем быть.
О, в этот век, преступный и постыдный,
Не жить, не чувствовать - удел завидный!
Прошу, молчи, не смей меня будить.
Аватара пользователя
Azmadan
 
Сообщения: 9
Зарегистрирован: 14 фев 2009, 08:59
Откуда: Мейде ин СССР
Полное имя: Самойлов Артём Андреевич

Re: Вопрос по делфи

Сообщение Vladislav_133 28 мар 2009, 11:36

Вообще то Дельфи тут не причем. Тут чистая геометрия. Что такое стрелка? Это отрезок, у которого один конец (x1,y1) неподвижен и для простоты находится в начале координат. Второй конец (x2,y2) отрезка движется по кругу. Таким образом в цикле должен меняться угол наклона. Но для того, чтобы точка двигалась надо вычилять ее координаты, при изменении угла наклона. Получаем x2=l*cos(A), y2=l*sin(A). Здесь l - длина отрезка, которую задаем, A - угол (в радианах) который будет меняться. Ну и остается на каждом шаге еще стирать предыдудщую стрелку и рисовать следующую. Между этими двумя событиями, естественно, следует не большую задержку сделать.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Вопрос по делфи

Сообщение xdsl 29 мар 2009, 17:59

А дальше - открываем лекции или литературу, читаем про класс TCanvas. Допустим, рисуем на на холсте формы (напр. Form1.Canvas).
Где рисовать? Ответ - в обработчике события onPaint формы (напр. Form1.onPaint), который вызывается, когда компонент должен быть перерисован.
Как и где секунды считать? Как - Vladislav_133 уже сказал. Для ответа на вопрос "где?" есть компонент TTimer. Запрограммируйте его на срабатывание раз в секунду, и пусть он изменяет параметр l на 2Pi/60. В конце обработчика не забыть перерисовать форму (напр. вызвать Form1.invalidate)

Вот так это делается правильно. Если нужно по-быстрому, то все расчёты и рисование можно сосредоточить в таймере. Это будет на первый взгляд работать. Но только на первый и очень неискушенный. При сдаче внимательному преподавателю - не пройдет. Он тут-же продемонстрирует неадекватное поведение секундомера при полном или частичном перекрытии формы другими окнами, перемещении формы за пределы экрана, минимизации-восстановлении формы и т.п.

P.S. Если перерисовка в omPaint,то стирать старый рисунок не нужно, т.к. по умолчанию старое содержимое к этому моменту уже все залито фоновым цветом. Следствие - в onPaint перерисовывать надо весь секундомер, а не только секундную стрелку

P.P.S. И вообще, цифровые часы выглядят стильнее, да и сварганить их куда проще ;)
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Вопрос по делфи

Сообщение Vladislav_133 30 мар 2009, 09:14

У меня то сложилось впечатление, что товарищ не знает, как со стрелкой быть, а на проблему синхронизации ему наплевать. А проблема действительно есть, поскольку таймер, если даже его и запрограммировать на срабатывание через 1 сек., может несколько ошибаться, из-за многозадачности. Следовательно, надо через каждые n (?) тиков сверяться с системными часами и поправлять время. Но, мне кажется, этого в задании не было.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Вопрос по делфи

Сообщение Azmadan 31 мар 2009, 12:13

Благодарю за ответы. Я просто не мог заставить стрелку двигаться корректно. А задача стоящая передомной была следующей: "Реализовать программу-секундомер. Предусмотреть запуск и остановку секундомера, вывод "засечек" времени" и без использования лейбла, меомо и других компонентов т.к. Мы сейчас проходим графику в делфи
Отрадно спать, отрадней камнем быть.
О, в этот век, преступный и постыдный,
Не жить, не чувствовать - удел завидный!
Прошу, молчи, не смей меня будить.
Аватара пользователя
Azmadan
 
Сообщения: 9
Зарегистрирован: 14 фев 2009, 08:59
Откуда: Мейде ин СССР
Полное имя: Самойлов Артём Андреевич

Re: Вопрос по делфи

Сообщение LMP 12 апр 2009, 11:57

Код: Выделить всё
type
  TA = class
    P: TB;
  end;
  TB = class
    P: TA;
  end;

Как это заставить работать?

Если мне не изменяет память, нам когда-то рассказывали такой способ, т.е. в самом начале нужно сказать что тип TB будет обьявлен дальше.

Всем спасибо кто задумался, совместными усилиями решение было найдено
Код: Выделить всё
type
  TB = class;
  TA = class
    P: TB;
  end;
  TB = class
    P: TA;
  end;
Последний раз редактировалось LMP 14 апр 2009, 07:43, всего редактировалось 1 раз.
LMP
Elite
 
Сообщения: 49
Зарегистрирован: 26 янв 2009, 22:05
Полное имя: Кобелев Денис

Re: Вопрос по делфи

Сообщение xdsl 13 апр 2009, 17:20

Forward-объявления классов - правильный подход. Им пользуются во всех библиотеках. Вот, например, кусочек подключаемого файла /usr/share/fpcsrc/2.2.2/rtl/objpas/classes/classesh.inc с моего компьютера:
Код: Выделить всё
...
{ Forward class declarations }
  TStream = class;
  TFiler = class;
  TReader = class;
  TWriter = class;
  TComponent = class;
...
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.


Вернуться в Алгоритмизация и программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron