|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Закрашивание ячеек грида по нажатию кнопки
Здравствуйте. Мне необходимо закрасить ячейки, в зависимости от значений в них( учитываются только значения в зеленых ячейках). Например, если таблица заполнена так:, то после нажатия на кнопку "Найти минимальный путь", должно получится так:.
Принцип такой: Начиная с нижней левой зеленой ячейки, сравнивается зеленая ячейка справа и сверху, и та, в которой значение меньше закрашивается вместе с желтой ячейкой между двумя зелеными. Когда происходит выход из цикла закрашивается строка до конца или столбец до верха, в зависимости от "причины" выхода из цикла. Но вот почему-то закрашивание не происходит. Гугл не помог... В 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; Помогите, пожалуйста. |
#2
|
||||
|
||||
Цитата:
Цитата:
Вот так вроде правильно закрашивает: Код:
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; Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
'Zanuda' (12.04.2014)
|
#3
|
|||
|
|||
Цитата:
Цитата:
Цитата:
Теперь, вроде программа к диссеру готова практически. Еще раз СПАСИБО! Последний раз редактировалось M.A.D.M.A.N., 12.04.2014 в 22:22. |
#4
|
||||
|
||||
Цитата:
|
#5
|
|||
|
|||
Цитата:
|