Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2022, 20:55   #1
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию Timer и StringGrid

Доброго времени суток, помогите пожалуйста с заданием
При нажатии кнопки необходимо, чтобы таблица заполнялась числами от 1 до того момента, как закончатся ячейки в StringGrid1, размеры которого задаются через Edit'ы. Необходимо, чтобы заполнение производилось по таймеру с интервалом в 1500 мсек.

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

Если заданы разные размеры для матрицы (не квадратная и/или нет четкой середины) то отправной элемент - слева, как на примере ниже

Код:
3	0	0	0	0     0     0
4	2	0	0	0     0     0
5	12	1	0	0     0     0
6	11	13	0	0     0     0
7	10	14	17	0     0     0
8       9       15      16     18     0     0

Последний раз редактировалось mr.stranger; 05.06.2022 в 21:10.
mr.stranger вне форума Ответить с цитированием
Старый 05.06.2022, 21:43   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Для начала сделайте без таймера в цикле с использованием функции
Код:
procedure WaitAMoment();
begin
 Sleep(150);
 Application.ProcessMessages;
end;
Потом станет понятнее как сделать через таймер. В функции таймера по сути будет блок операций цикла с инкрементом, но без вызова этой функции.
macomics вне форума Ответить с цитированием
Старый 05.06.2022, 21:54   #3
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Интересно, а где можно применить такой алгоритм?
Valick вне форума Ответить с цитированием
Старый 05.06.2022, 22:02   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

У преподавателя с воображением беда просто.
macomics вне форума Ответить с цитированием
Старый 05.06.2022, 23:20   #5
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Для начала сделайте без таймера в цикле
Средний элемент
Код:
i := StringGrid1.RowCount div 2;
j := StringGrid1.ColCount div 2;
Не понимаю, как сделать движение по диагонали вверх
Код:
for q := j downto 0 do
begin
...
end;
Так идет по прямой
mr.stranger вне форума Ответить с цитированием
Старый 05.06.2022, 23:37   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
while (i >= 0) and (j >= 0) do begin

dec(i); dec(j);
end;
macomics вне форума Ответить с цитированием
Старый 05.06.2022, 23:40   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Если нужно прийти именно в верхний левый угол по диагонали, то после нахождения i и j, нужно из них выбрать меньшее число (например, k) и идти по элементам [k, k].
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.06.2022, 23:43   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Только вам надо действовать не так. Надо посчитать количество элементов, которые надо заполнить (не важно каким образом)
Код:
for i := 0 to RowCount -1 do
  for j := 0 to ColCount - 1 do
    if j <= i then inc(k) else break;
Далее надо организовать один линейный цикл
Код:
if RowCount div 2 < ColCount div 2 then x := RowCount div 2 else x := ColCount div 2;
y := x; j := 0;
for i := 0 to k - 1 do begin
  Cells[x, y] := inttostr(k);
  case j of
  0: begin
      dec(x); dec(y);
      if (x = 0) or (y = 0) or ((x - 1 >= 0) and (y - 1 >= 0) and (Cells[x - 1, y - 1] <> '0')) then j := 1;
    end;
  1: ...
  end;
  WaitAMoment; // Это при реализации без Timer. Далее все выше написанное из цикла надо будет переместить в процедуру TForm1.Timer1Timer
end;
А внутри надо будет написать функции (case j of) перехода от элемента к элементу и одновременного обновления значения j, чтобы на следующей иттерации цикла приращение обновляло направление (если необходимо).

Последний раз редактировалось macomics; 06.06.2022 в 00:01.
macomics вне форума Ответить с цитированием
Старый 06.06.2022, 01:04   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

macomics, а зачем считать количество и делать по нему цикл, если потом для таймера цикл все равно выбрасывать? Почему бы сразу не сделать цикл while True do, а внутри условия выхода из него с break, чтобы при переходе на таймер убрать сам цикл, а break заменить на остановку таймера.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2022, 06:05   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

BDA: Вообще то даже нужно. Но я преследовал цель нагляднее показать как перейти от обычной логики заполнения таблицы значениями к алгоритму, позволяющему сделать анимацию через таймер. В бесконечном цикле не сразу очевидно какая переменная всем управляет.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Edit, Timer, StringGrid Женька Good Помощь студентам 1 19.10.2012 22:08
Timer... Teleport Общие вопросы Delphi 13 14.09.2011 17:02
Timer или While? xrob Общие вопросы Delphi 7 24.08.2011 14:06
timer(vc++) NiCola999 Windows Forms 13 31.01.2011 06:00
Timer... Roof Общие вопросы Delphi 11 11.10.2007 12:57