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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2015, 15:46   #1
dubsteppaman
 
Аватар для dubsteppaman
 
Регистрация: 28.03.2015
Сообщений: 7
Восклицание Анимированное заполнение ячеек таблицы StringGrid разными способами

Доброго времени суток, уважаемые форумчане. Столкнулся с проблемой при решении задачи. Необходимо реализовать заполнение ячеек таблицы StringGrid размера mxn (число строк может равняться а может и не равняться числу столбцов (эти данные мы получаем из SpinEdit'ов)) способами, приведенными на картинке. Тем не менее необходимо с помощью компонента "TrackBar" реализовать регулировку скорости анимации (заполнения) таблицы поэлементно. Каждый способ заполнения необходимо реализовать с помощью отдельных процедур.

Способы заполнения (должны выбираться с помощью компонента RadioGroup):
1. По горизонтали (реализовано без анимации)
2. По вертикали (реализовано без анимации)
3. Змейка слева (реализовано без анимации)
4. Змейка справа (не реализовано)
5. Зигзаг (не реализовано)
6. Спираль (реализовано без анимации, и еще нужно переделать под таблицу произвольного размера)

Желательно предоставить коды для каждой из процедур. Убедительно прошу, помогите!

Прикрепляю к сообщению архив с проделанной работой до данного момента.
Изображения
Тип файла: jpg Способы заполнения.jpg (50.8 Кб, 130 просмотров)
Вложения
Тип файла: rar Заполнение StringGrid.rar (237.9 Кб, 15 просмотров)

Последний раз редактировалось dubsteppaman; 28.03.2015 в 17:09.
dubsteppaman вне форума Ответить с цитированием
Старый 28.03.2015, 17:16   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

А что уже сделано?
Вадим Мошев вне форума Ответить с цитированием
Старый 28.03.2015, 17:18   #3
dubsteppaman
 
Аватар для dubsteppaman
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

Сделаны все способы заполнения, кроме змейки справа (4 способ) и зигзага (5 способ), все способы заполнения выполнены без анимации, прошу объяснить, как можно ее реализовать на примере одной из процедур.
dubsteppaman вне форума Ответить с цитированием
Старый 28.03.2015, 17:26   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Для анимации можно воспользоваться процедурой sleep(N), где N - миллисекунды - она реализует задержку, либо работать с таймером.

Хотя, щас попробовал Sleep - что-то не то... может просто криво попробовал

Последний раз редактировалось Вадим Мошев; 28.03.2015 в 17:31.
Вадим Мошев вне форума Ответить с цитированием
Старый 28.03.2015, 18:56   #5
dubsteppaman
 
Аватар для dubsteppaman
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

А можете, на основе одной из процедур, написанных мной, продемонстрировать пример с использованием компонентов "Timer" и "TrackBar". Не могу понять, как использовать "Timer" в данном случае, и еще, какие события использовать в данном случае?

Последний раз редактировалось dubsteppaman; 28.03.2015 в 18:58.
dubsteppaman вне форума Ответить с цитированием
Старый 28.03.2015, 20:10   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

У таймера всего только одно событие, которое называется "Timer" и вызывается каждый раз по истечению интервала.

Я бы посоветовал переписать процедуры заполнения массива следующим образом.
Эта процедура за один вызов будет заполнять только одну ячейку массива, после чего вычислять координаты той ячейки, которая должна быть заполнена в следующий раз. Вычисление происходит на основе значений, вычисленных на предыдущем шаге. В начальный момент времени "пишущая головка" имеет положение по умолчанию, то есть, там, откуда должна начинаться запись, а вызов такой процедуры, как я уже говорил, сдвигает пишущую головку согласно алгоритму обхода матрицы. Координаты пишущей головки должны сохраняться между вызовами этих процедур для того, чтобы при следующем вызове записать число в ячейку с такими координатами и перейти к следующей ячейке.

Всё это будет выглядеть так в коде (псевдокод):
Код:

процедура заполнение по вертикали(X, Y)
начало
 Поместить число в ячейку в координатами (X, Y)
 вычисляем новое положение пишущей головки по оси X и записываем значение в переменную X
 вычисляем новое положение пишущей головки по оси Y и записываем значение в переменную Y
конецПроцедуры


Процедура-обработчки_события Таймер;
началоПроцедуры
 аналирузем алгоритм заполнения (itemIndex) с помощью case, как это сделано у вас;
 перед вызов процедуры обхода матрицы присвоить
  головкаX = нач_пол_X;
  головкаY = нач_пол_Y;

  ЗаполнениеПоВертикали(ГоловкаX, Головка Y)
КонецПроцедуры
Для таймера можно выставить интервал 1000 (это миллисекунды). Но в этом случае скорость заполнения будет всегда одна и та же и не будет зависеть от положения слайдера.

Пока реализуйте это.
Вадим Мошев вне форума Ответить с цитированием
Старый 28.03.2015, 20:48   #7
dubsteppaman
 
Аватар для dubsteppaman
 
Регистрация: 28.03.2015
Сообщений: 7
По умолчанию

Спасибо за вариант, попробую реализовать. Все-таки узнать бы наконец, как реализовать анимированное заполнение с помощью этих двух компонентов. Надеюсь, будут ещё предложены варианты форумчанами.
dubsteppaman вне форума Ответить с цитированием
Старый 28.03.2015, 21:03   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так что ли? Скорость можно менять в процессе заполнения
Код:
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    TrackBar1: TTrackBar;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    n,m,lNumber: Integer;
    lLastTick: Cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  Timer1.Enabled:=False;
  for i:=0 to StringGrid1.RowCount-1 do StringGrid1.Rows[i].Clear;
  n:=8; m:=10;
  StringGrid1.RowCount:=n; StringGrid1.FixedRows:=0;
  StringGrid1.ColCount:=m; StringGrid1.FixedCols:=0;
  TrackBar1.Max:=100;
  TrackBar1.Min:=10;
  TrackBar1.Position:=50;
  lNumber:=0;
  lLastTick:=GetTickCount;
  Timer1.Interval:=50;
  Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var xTick: Cardinal;
begin
  xTick:=GetTickCount;
  if xTick-lLastTick>=(1000 div TrackBar1.Position)*10 then begin
    lLastTick:=xTick;
    Inc(lNumber);
    StringGrid1.Cells[(lNumber-1) mod m,(lNumber-1) div m]:=IntToStr(lNumber);
    Timer1.Enabled:=lNumber<n*m;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.03.2015, 21:04   #9
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

А чтобы связать скорость заполнения (анимации) с положением ползунка, то у него надо прописать следующее событие:
Код:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
     Timer1.Interval:=(TrackBar1.Position+1)*50;
end;
Вадим Мошев вне форума Ответить с цитированием
Старый 28.03.2015, 21:13   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Не. Ч/з таймер сложно
Я бы так
Код:
procedure SoftWait (Milliseconds: Cardinal);
var
  t: Cardinal;
begin
  t := GetTickCount + Milliseconds;
  while GetTickCount < t do
    Application.ProcessMessages;
end;

//================ Заполнение "змейкой cлева" ===============
Procedure Left_Snake (var m,n:integer; StringGrid1:TStringGrid);
var
  i,j: integer;
begin
  with StringGrid1 do begin
    m := RowCount - 1;
    n := ColCount - 1;
    for i:=1 to m do
     for j:=1 to n do begin
       if odd(i) then Cells[j,i]:=IntToStr((i-1)*n+j) else Cells[j,i]:=IntToStr(i*n-j+1);
       SoftWait (100);
     end;
  end;
end;
// Сори за отступы. Привычка сильнее меня
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение ячеек таблицы gerka997 Microsoft Office Access 0 26.10.2014 14:06
Полное заполнение таблицы в общем доступе/, но без права повторного редактирования ячеек после сохранения Print Microsoft Office Excel 3 01.10.2011 13:20
поиск и заполнение ячеек таблицы Окоча Юра Microsoft Office Excel 2 16.01.2010 19:00
Скорость заполнения памяти разными способами. Alexcomeback Общие вопросы C/C++ 2 20.05.2009 23:14