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

Delphi Sources



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

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

Здравствуйте. Мне необходимо закрасить ячейки, в зависимости от значений в них( учитываются только значения в зеленых ячейках). Например, если таблица заполнена так:, то после нажатия на кнопку "Найти минимальный путь", должно получится так:.
Принцип такой:
Начиная с нижней левой зеленой ячейки, сравнивается зеленая ячейка справа и сверху, и та, в которой значение меньше закрашивается вместе с желтой ячейкой между двумя зелеными. Когда происходит выход из цикла закрашивается строка до конца или столбец до верха, в зависимости от "причины" выхода из цикла. Но вот почему-то закрашивание не происходит. Гугл не помог...
В 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;
Помогите, пожалуйста.
Ответить с цитированием
  #2  
Старый 12.04.2014, 20:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Zanuda
Принцип такой:
Начиная с нижней левой зеленой ячейки, сравнивается зеленая ячейка справа и сверху, и та, в которой значение меньше закрашивается вместе с желтой ячейкой между двумя зелеными.
А если значения в обоих ячейках будут одинаковыми?
Цитата:
Сообщение от Zanuda
Но вот почему-то закрашивание не происходит.
По событию OnDrawCell можно прорисовывать только затребованную ячейку, в остальных рисовать нельзя.
Вот так вроде правильно закрашивает:
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Grid: TStringGrid;
  Can: TCanvas;
  Color: TColor;
  s: string;
  Col, Row: Integer;
begin
  Grid := (Sender as TStringGrid);
  Can := Grid.Canvas;

  if not Odd(ACol xor ARow) then
    Color := $CCFFFF
  else if Odd(ACol) then
    Color := $99FF66
  else
    Color := clWhite;

  if clrd then
  begin
    Col := 1;
    Row := (Grid.RowCount - 1) and not 1;

    while (Row >= ARow) and (Col <= ACol) do
    begin
      if (ACol = Col) and (ARow = Row) then
      begin
        Color := $6666FF;
        Break;
      end;

      if (Row < 2) or
        ((Row >= 2) and
         (Col <= (Grid.ColCount - 3)) and
         (StrToIntDef(Grid.Cells[Col + 2, Row], 0) <
          StrToIntDef(Grid.Cells[Col, Row - 2], 0)) ) then
      begin
        Inc(Col, 2);
        if (ACol = Col - 1) and (ARow = Row) then
        begin
          Color := $6699FF;
          Break;
        end;
      end else
      begin
        Dec(Row, 2);
        if (ACol = Col) and (ARow = Row + 1) then
        begin
          Color := $6699FF;
          Break;
        end;
      end;
    end;
  end;

  Can.Brush.Color := Color;
  Can.FillRect(Rect);
  s := Grid.Cells[ACol, ARow];
  Can.TextOut((Rect.Right + Rect.Left - Can.TextWidth(s)) div 2,
    (Rect.Bottom + Rect.Top - Can.TextHeight(s)) div 2, s);
  if gdFocused in State then
    DrawFocusRect(Can.Handle, Rect);
end;

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: string);
begin
  StringGrid1.Repaint;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if (StringGrid1.Cells[1, StringGrid1.RowCount - 2] <> '') then
  begin
    clrd := True;
    StringGrid1.Repaint;
  end
  else
    ShowMessage('Табица заполнена не полностью!');
end;
Цитата:
Сообщение от Zanuda
Гугл не помог...
Ну да, Гугл пока программы писать не научился
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
'Zanuda' (12.04.2014)
  #3  
Старый 12.04.2014, 21:48
'Zanuda' 'Zanuda' вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
А если значения в обоих ячейках будут одинаковыми?
Зарисовать оба пути.


Цитата:
Сообщение от poli-smen
Ну да, Гугл пока программы писать не научился
К сожалению. Хотя я искал в нем лишь теорию,которая не помогла.. Видимо плохо искал.

Цитата:
Сообщение от poli-smen
Вот так вроде правильно закрашивает:
Да,работает вроде. Спасибо тебе огромное. Не в первый раз ты меня выручаешь.
Теперь, вроде программа к диссеру готова практически. Еще раз СПАСИБО!

Последний раз редактировалось M.A.D.M.A.N., 12.04.2014 в 22:22.
Ответить с цитированием
  #4  
Старый 12.04.2014, 22:27
Аватар для Пахом Поехавший
Пахом Поехавший Пахом Поехавший вне форума
Заблокирован
 
Регистрация: 27.03.2014
Адрес: Гауптвахта
Сообщения: 3
Версия Delphi: три семёрки
Репутация: 10
По умолчанию

Цитата:
Теперь, вроде программа к диссеру готова практически.
ты пишеш програму для диссертации,а программировать не умееш? диссертация по программированию ?
Ответить с цитированием
  #5  
Старый 13.04.2014, 10:35
'Zanuda' 'Zanuda' вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Пахом Поехавший
ты пишеш програму для диссертации,а программировать не умееш? диссертация по программированию ?
Нет. Высшая математика (оптимальное управление).
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter