IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> и опять TStringGrid
marwell
сообщение 7.04.2011 14:40
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Доброго времени суток
Само задание звучит так: Дана таблица целых чисел ai, bi. Выделить цветом все совпадающие пары и максимальную из них, указать позиции.
Нашел в инете как выделять цветом только отдельные ячейки, но не уверен что правильно ее применяю. Еще выдает ошибку "Project Projectl.exe raised exception class EConvertError with message'" Is not a valid integer value1. Process stopped. Use Step or Run to continue." Смысл ошибки понимаю, но не вижу в каком месте она появляется, вроде везде правильно работаю с ячейками

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
SG: TStringGrid;
Edit1: TEdit;
procedure FormPaint(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
var i:integer;
begin
with SG do begin
cells[0,0]:='N';
cells[0,1]:='ai';
cells[0,2]:='bi';
for i:=1 to ColCount do
cells[i,0]:=IntToStr(i);
end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var i:integer;
begin
SG.ColCount := StrToInt((Sender as TEdit).Text);
for i:=1 to SG.ColCount do
SG.cells[i,0]:=IntToStr(i);
end;

procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var i,j,max:integer;
begin
max:=0;
j:=0;
for i:=1 to sg.ColCount-1 do begin
if StrToInt(sg.Cells[i,j+1])=StrToInt(sg.Cells[i,j+2]) then sg.Canvas.Brush.Color:=clRed;
if StrToInt(sg.Cells[i,j])>max then
begin max:=StrToInt(sg.Cells[i,j]);
sg.Canvas.Brush.Color:=clBlue;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+2, Rect.Top+2, sg.Cells[i, j]);
sg.Canvas.Brush.Color:=clBlack;
end;
end;

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 11.04.2011 20:09
Сообщение #2


Гость






Я в твоем коде вижу несколько недочетов:
  1. Ветка else, где выводится MessageDlg, относится к самому первому If-у, так? То есть, она отрабатывает каждый раз, когда рисуются серые клетки (ARow = 0 или ACol = 0). Оно тебе надо, чтоб при каждой перерисовке грида выводилось несколько диалоговых сообщений. А вдруг какое-то из них перекроет собственно ячейку, и часть грида снова станет невалидной, опять начнет перерисовываться, и тогда что? Кандидатура на вечный цикл? Не надо этого счастья. Зачем тебе понадобилось сообщать при перерисовке, что "введено не число"? Просто не обрабатывай, если не число, и всего делов.
  2. Как реализована проверка. Я бы сделал ровно так же, как делал в OnSetEditText:

      if (ACol > 0) and (ARow > 0) then
    with Sender as TStringGrid do
    begin
    if (Cells[ACol, ARow] <> '') and (Cells[ACol, ARow] = Cells[ACol, 3 - ARow]) and
    TryStrToInt(Cells[ACol, ARow], IntValue) then
    begin
    Canvas.Brush.Color := clRed;
    Canvas.Font.Color := clWhite;
    end
    else
    begin
    Canvas.Brush.Color := clWhite;
    Canvas.Font.Color := clBlack;
    end;
    if (ACol = max_index) then // <--- Максимум?
    begin
    Canvas.Brush.Color := clGreen;
    Canvas.Font.Color := clWhite;
    end;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left, Rect.Top, Cells[ACol, ARow]);
    end;
    То есть, я даже не проверяю, чему равно содержимое клетки Cells[ARow, ACol]. Мне достаточно того, что содержимое верхней и нижней ячеек одинаковое, не пустое, и одно из них - число. Раз ячейки содержат одинаковые значения - значит, и второе число. Логично? Раз оба - одинаковых числа, то их надо что? Правильно, подсветить другим цветом... Вот и устанавливаем красную подсветку. А потом проверяем (это было и раньше в коде), "не максимальное ли значение"? Максимальное отмечаем зеленым цветом...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
marwell   и опять TStringGrid   7.04.2011 14:40
мисс_граффити   вот здесь с границей массива ошибся: но это к де...   7.04.2011 17:14
marwell   а вот то, что заполняешь ты там только первую (ну...   7.04.2011 17:38
volvo   Где именно? Вообще-то границы грида определяются з...   7.04.2011 17:29
мисс_граффити   Где именно? Вообще-то границы грида определяются ...   11.04.2011 14:30
volvo   Нет... Смотри. Событие OnDrawCell происходит при ...   7.04.2011 18:23
marwell   кажется, я начал понимать ... if f=false then begi...   7.04.2011 18:26
marwell   добавил unit Unit1; interface uses Windows, ...   8.04.2011 12:56
volvo   Я имел в виду другое. unit Unit1; interface us...   8.04.2011 15:38
marwell   Я имел в виду другое. [hide="Смотри:"]...   8.04.2011 19:10
volvo   var value : Integer; // ... if TryStrToInt(Cel...   8.04.2011 19:35
marwell   var value : Integer; // ... if TryStrToInt(Ce...   8.04.2011 19:46
marwell   с TryStrToInt у меня проблема,никак не получается ...   10.04.2011 18:44
volvo   Это уж тебе решать, может оно и проще, а может и н...   11.04.2011 13:00
marwell   Это уж тебе решать, может оно и проще, а может и ...   11.04.2011 19:01
volvo   Я в твоем коде вижу несколько недочетов: Ветка els...   11.04.2011 20:09
marwell   ээ, черт, что-то я совсем того ... вот даже сейча...   11.04.2011 20:37
volvo   Надо просто лучше форматировать код. Считать end-ы...   11.04.2011 22:16
marwell   volvo ,спасибо за помощь   12.04.2011 15:49


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 3:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"