Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.04.2014, 15:30
'Zanuda' 'Zanuda' вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Заполнение Грида

Доброго времени суток. При заполнении StringGrid-а я столкнулся с одной проблемой. Дан грид, с заполненными ячейками "молочного" цвета. Мне необходимо заполнить зеленые ячейки, начиная с правого верхнего угла по следующему принципу: Сравнивается сумма значений в двух ячейках сверху(зеленой и молочной) и справа(тоже зеленой и молочной), и минимальная сумма записывается в ячейку. Например, член матрицы
S[3,5]:=min((S[1,5]+H[2,5]),(S[3,7]+V[3,6])), где S-зеленые ячейки, а V,H-молочные( по горизонтали и вертикали соотв-но).
А первая строка и последний столбец заполняется суммой предыдущей зеленой ячейки и молочной.
Цикл я написал, но почему то заполняется только 2я строка. Помогите разобраться, пожалуйста. И еще вопрос, у меня сначала заполняется первая строка и последний столбец(зеленые ячейки), а потом остальные зеленые ячейки по нажатию отдельной кнопки. Объединить эти процедуры пытался, но не удалось. Возможно ли это?
Вот код:
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  c,r:integer;
begin
  c:=StringGrid1.ColCount-3;
  For r:=2 to StringGrid1.RowCount-1 do
  while (c>=1) do
  begin
    if (odd(r)=false) then
    begin
      S[r,c]:=min((strtoint(StringGrid1.Cells[c,r-2])+strtoint(StringGrid1.Cells[c,r-1])),(strtoint(StringGrid1.Cells[c+2,r])+strtoint(StringGrid1.Cells[c+1,r])));
      StringGrid1.Cells[c,r]:=inttostr(S[r,c]);
      c:=c-2;
    end;
  end;
end;
И рисунок:
Ответить с цитированием
  #2  
Старый 08.04.2014, 15:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Zanuda
.....
Цикл я написал, но почему то заполняется только 2я строка.
.....
Вот код:
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  c,r:integer;
begin
  c:=StringGrid1.ColCount-3;
  For r:=2 to StringGrid1.RowCount-1 do
  while (c>=1) do
  begin
.....
У тебя переменная "c" инициализируется всего один раз, а по логике должна инициализироваться для каждой обрабатываемой строки:
Код:
var
  c, r: Integer;
begin
  for r := 2 to StringGrid1.RowCount - 1 do
  begin
    c := StringGrid1.ColCount - 3;
    while c >= 1 do
    begin
.....
    end;
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
'Zanuda' (08.04.2014)
  #3  
Старый 08.04.2014, 15:55
'Zanuda' 'Zanuda' вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Логично. Спасибо. Но теперь программа зависает... Буду дальше разбираться.
Ответить с цитированием
  #4  
Старый 08.04.2014, 16:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Zanuda
Логично. Спасибо. Но теперь программа зависает... Буду дальше разбираться.
Зависает, потому что вычитание от переменной "c" нужно вынести за условие. Т.е. переменная "c" должна уменьшаться всегда, а не только для чётных строк, иначе первая же нечётная строка вызовет бесконечный цикл в связи с неуменьшением этой переменной:
Код:
var
  c, r: Integer;
begin
  for r := 2 to StringGrid1.RowCount - 1 do
  begin
    c := StringGrid1.ColCount - 3;
    while c >= 1 do
    begin
      if not Odd(r) then
      begin
.....
      end;
      Dec(c, 2);
    end;
  end;
end;
Ответить с цитированием
  #5  
Старый 08.04.2014, 19:51
'Zanuda' 'Zanuda' вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

С заполнением ячеек разобрался.

А по поводу двух последовательных вычислений.. На одной кнопки это сделать нельзя, т.к. вторые расчеты зависят от первых.
Я правильно понял? У меня лично не получилось.. Думаю сделать так, две кнопки наложить друг на друга, вторую сделать невидимой, пока не нажать первую, после чего первая становится инвизной. Бред конечно, немного, но умнее ничего придумать пока не могу.
Ответить с цитированием
  #6  
Старый 08.04.2014, 20:06
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Zanuda
А по поводу двух последовательных вычислений.. На одной кнопки это сделать нельзя, т.к. вторые расчеты зависят от первых.
Я правильно понял? У меня лично не получилось.. Думаю сделать так, две кнопки наложить друг на друга, вторую сделать невидимой, пока не нажать первую, после чего первая становится инвизной. Бред конечно, немного, но умнее ничего придумать пока не могу.
А почему на одной кнопке нельзя сделать оба вычисления (одно за другим)?
Ответить с цитированием
  #7  
Старый 08.04.2014, 20:26
'Zanuda' 'Zanuda' вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
А почему на одной кнопке нельзя сделать оба вычисления (одно за другим)?
Сначала вычислются значения в первой строке и последнем столбце, а затем остальные ячейки.
Хотя ошибки у меня возникали до исправлений, связанных с заполнением таблицы. Поэтому я и разделил эти процедуры на 2 кнопки. Надо будет снова объединить. Вдруг действительно заработает.
Ответить с цитированием
  #8  
Старый 09.04.2014, 00:40
Ol`ka Ol`ka вне форума
Прохожий
 
Регистрация: 09.04.2014
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Можно в конце процедуры "первых расчетов" вызвать процедуру "вторых расчетов". Как то так )))
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter