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
сообщение 7.04.2011 18:23
Сообщение #2


Гость






Цитата
если сделать так, будет неправильно?
Нет...

Смотри. Событие OnDrawCell происходит при перерисовке каждой клетки. То есть, когда ты рисуешь одну клетку, тебе нужно всего навсего проверить ту, которая выше или ниже нее, одинаковый ли текст они содержат:
procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
if (ACol > 0) and (ARow > 0) then // Если это условие не выполняется - то вообще ничего не делать
with Sender as TStringGrid do
begin

// Вот оно: проверяем, в текущей клетке не пусто? Нет? Тогда проверяем,
// текущая и та, что выше/ниже (если сейчас рисуется второй ряд, то 3 - 2 = 1,
// значит проверится то, что выше. Иначе: 3 - 1 = 2, проверится вышестоящая клетка)
// содержат одинаковый текст? Можно еще проверить, что там число, но я не стал этого делать
if (Cells[ACol, ARow] <> '') and (Cells[ACol, ARow] = Cells[ACol, 3 - ARow]) then
begin
Canvas.Brush.Color := clRed; // Да, содержимое одинаково, и непустое - красим
Canvas.Pen.Color := clWhite;
end
else
begin
Canvas.Brush.Color := clWhite; // Нет, ячейки либо разные либо пустые. Не красим...
Canvas.Pen.Color := clBlack;
end;

// Собственно, рисуем ячейки и текст в них.
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, Cells[ACol, ARow]);
end;
end;

Вот. А теперь - еще кое что: как только ты вводишь информацию в ячейку, тебе надо перекрасить таблицу: во-первых, возможно, пары одинаковых значений больше нет, а во-вторых, максимум мог измениться. Что для этого надо? Я сделал обраотчик события OnSelEditText у грида:
procedure TForm1.SGSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
begin
// Помечаем грид как невалидный, это приведет к его перерисовке
(Sender as TStringGrid).Invalidate;
end;


Вот в этом же самом событии, OnSelEditText, я бы и находил максимум, индекс макс. элемента, запоминал бы его в переменной, описанной в классе формы (не надо злоупотреблять глобальными переменными, лучше работать с членами класса), а в OnDrawCell добавил бы еще одну проверку: если сейчас рисуется ячейка, индекс 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:10
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"