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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2014, 15:31   #1
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию Заполнение Грида

Доброго времени суток. При заполнении 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;
И рисунок:
.FROST. вне форума Ответить с цитированием
Старый 08.04.2014, 15:44   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

while (c>=1) do //бесконечный цикл при НЕвыполнении условия odd(r)=false
поскольку изменение с (c:=c-2); возможно (будет выполнено) только при данном условии, а изменение r в данном цикле не предусмотрено.
Цитата:
а потом остальные зеленые ячейки по нажатию отдельной кнопки. Объединить эти процедуры пытался, но не удалось. Возможно ли это?
buttonX.Click; //программное "нажатие" кнопки

Код:
button1.click; //сначала будут выполнены действия при нажатии button1
button2.click; //потом действия при нажатии button2
Цитата:
а изменение r в данном цикле не предусмотрено.
выносим его из цикла
Код:
if odd(r) =false then begin
  c:=rowcount;
  while (c>=1) do begin
     cells[c,r]:=...
     c:=c-2;
  end;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.04.2014 в 15:56.
evg_m вне форума Ответить с цитированием
Старый 08.04.2014, 15:57   #3
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
while (c>=1) do //бесконечный цикл при НЕвыполнении условия odd(r)=false
поскольку изменение с (c:=c-2); возможно (будет выполнено) только при данном условии, а изменение r в данном цикле не предусмотрено.

buttonX.Click; //программное "нажатие" кнопки

Код:
button1.click; //сначала будут выполнены действия при нажатии button1
button2.click; //потом действия при нажатии button2
Изменение r задано же в цикле For, но почему-то не выполняется.
.FROST. вне форума Ответить с цитированием
Старый 08.04.2014, 16:01   #4
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Уточню, здесь с-столбец, а r -строка.
.FROST. вне форума Ответить с цитированием
Старый 08.04.2014, 16:02   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
for r:=1 to ... begin
  while (c>=1) do begin//мы не может закончить вот ЭТО!
  end;
//  и до следующего r никогда не дойдем!!
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.04.2014, 16:04   #6
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Спасибо!!!!!!!!1 Получилось. Осталось только закрасить минимальный путь и диссер готов)
.FROST. вне форума Ответить с цитированием
Старый 08.04.2014, 19:44   #7
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

А по поводу двух последовательных вычислений.. На одной кнопки это сделать нельзя, т.к. вторые расчеты зависят от первых.
Я правильно понял? У меня лично не получилось.. Думаю сделать так, две кнопки наложить друг на друга, вторую сделать невидимой, пока не нажать первую, после чего первая становится инвизной. Бред конечно, немного, но умнее ничего придумать пока не могу.
.FROST. вне форума Ответить с цитированием
Старый 09.04.2014, 09:58   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
две кнопки наложить друг на друга, вторую сделать невидимой, пока не нажать первую
button2.Enabled:=false; // делаем кнопку ненежимаемой !!! (можно это сделать во время конструирования) или там где мы поняли что ее не стоит нажимать.

Во время (или после) неких расчетов, как только мы поняли что теперь можем разрешить нажимать
button2.Enabled:=true;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.04.2014, 15:09   #9
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Ну да. Или так. Просто я хочу, чтобы одна кнопка нажималась один раз, без второй.
.FROST. вне форума Ответить с цитированием
Старый 09.04.2014, 15:13   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Все там можно на одну кнопку посадить, так например:
Код:
procedure TForm1.ButtonClick(Sender: TObject);
var i,j,si,sj: Integer;
begin
  i:=StringGrid1.ColCount-1;
  while i>0 do begin
    j:=0;
    while j<StringGrid1.RowCount-1 do begin
      if i=StringGrid1.ColCount-1 then si:=0 else si:=StrToIntDef(StringGrid1.Cells[i+1,j],0)+StrToIntDef(StringGrid1.Cells[i+2,j],0);
      if j=0 then sj:=0 else sj:=StrToIntDef(StringGrid1.Cells[i,j-1],0)+StrToIntDef(StringGrid1.Cells[i,j-2],0);
      if (si>0) and (sj>0) then StringGrid1.Cells[i,j]:=IntToStr(Min(si,sj))
      else if si>0 then StringGrid1.Cells[i,j]:=IntToStr(si)
      else if sj>0 then StringGrid1.Cells[i,j]:=IntToStr(sj);
      Inc(j,2);
    end;
    Dec(i,2);
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.04.2014 в 15:15.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Высота строки грида S.I.L.E.N.T. Компоненты Delphi 12 11.11.2013 14:11
Компонент грида с таскабельными записями igh0st Общие вопросы Delphi 4 22.02.2013 08:31
Раскраска строк грида $T@LKER Общие вопросы Delphi 0 01.09.2011 16:52
столбцы грида в список Aleksandr Общие вопросы Delphi 2 03.06.2011 16:02
Видимость колонок Грида Aleksandr Общие вопросы Delphi 2 26.04.2011 17:15