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

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

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

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

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

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

Здравствуйте. Мне необходимо закрасить ячейки, в зависимости от значений в них( учитываются только значения в зеленых ячейках). Например, если таблица заполнена так:, то после нажатия на кнопку "Найти минимальный путь", должно получится так:.
Принцип такой:
Начиная с нижней левой зеленой ячейки, сравнивается зеленая ячейка справа и сверху, и та, в которой значение меньше закрашивается вместе с желтой ячейкой между двумя зелеными. Когда происходит выход из цикла закрашивается строка до конца или столбец до верха, в зависимости от "причины" выхода из цикла. Но вот почему-то закрашивание не происходит. Гугл не помог...
В DrawCell пишу код:

Код:
//Закрасить минимальный путь

  with StringGrid1, StringGrid1.Canvas do
  begin
  if clrd=true then
    begin
      ARow:=RowCount-2;
      ACol:=1;
     while ((ACol<=ColCount-1) or (ARow>=1)) do
      begin
        if (Cells[ACol+2,ARow]<Cells[ACol,ARow-2])then
        begin
          Brush.Color := clBtnFace;
          FillRect(Rect);
          TextOut(Rect.Left, Rect.Top + 2, Cells[ACol, ARow]);
          ARow:=ARow-2;
        end;
        if (Cells[ACol+2,ARow]<Cells[ACol,ARow-2])then
        begin
          Brush.Color := clBtnFace;
          FillRect(Rect);
          TextOut(Rect.Left, Rect.Top + 2, Cells[ACol, ARow]);
          ACol:=ACol+2;
        end;
        if (Cells[ACol+2,ARow]<Cells[ACol,ARow-2])and (Cells[ACol+2,ARow]<Cells[ACol,ARow-2]) then
        begin
          Brush.Color := clBtnFace;
          FillRect(Rect);
          TextOut(Rect.Left, Rect.Top + 2, Cells[ACol, ARow]);
          ACol:=ACol+2;
          ARow:=ARow-2;
        end;
      end;
  end;
Код кнопки:

Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
if (StringGrid1.Cells[1,StringGrid1.RowCount-2]<>'') then
  begin
   clrd := True;
    Refresh;
  end
  else
    ShowMessage('Табица заполнена не полностью!');
end;
Начальное значение clrd:=false;
Помогите, пожалуйста.
.FROST. вне форума Ответить с цитированием
Старый 12.04.2014, 21:57   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Неверный подход.
Поиск надо производить отдельно, отрисовку отдельно (например запоминать индексы клеток , включённых в путь в некий массив, и потом при отрисовке проверять их). А у Вас на каждой клетке (дроселл вызывается для каждой клетки грида, при его полной перерисовке, типа рефреша) цикл, который бегает по клеткам, но рисует постоянно в один и тот же рект. Если уж вы не хотите менять код серьёзно, то попробуйте менять хоть рект , например так Rect = stringgrid1.cellrect(acol, arow); Но ничего не гарантирую, т.к. в Ваш код почти не вчитывался (даже чисто подсознательно сложновато концентрировать внимание).
phomm вне форума Ответить с цитированием
Старый 14.04.2014, 11:28   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

полностью и категорически согласен с phomm

добавлю - ваша задача заполнить некую структуру (в простейшем случае - массив, равноразмерный StringGrid) значениями, которые однозначно определяют, являетс ли ячейка I,J частью минимального пути или нет.
после этого процедура рисования грида будет брать значение из этой структуры для текущей ячейки и выводить данную ячейку нужным цветом.


p.s. используйте StringGrid исключительно в качестве инструмента визуализации (отображения) данных, а не в качестве хранения в нём исходной информации и в качестве источника данных при обработке!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрашивание ячеек Vladya Microsoft Office Excel 4 11.11.2013 21:03
макрос в excel (vba) закрашивание ячеек Alex_91 Помощь студентам 0 23.05.2012 00:05
JTable закрашивание ячеек X@OC Общие вопросы по Java, Java SE, Kotlin 2 08.02.2012 11:48
Закрашивание ячеек в DBGRID jimmi З Помощь студентам 2 05.05.2011 06:38
Закрашивание ячеек в StringGrid ИВэТэшка Помощь студентам 7 12.04.2009 11:09