![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
|