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 13:00
Сообщение #2


Гость






Цитата
А не проще ли использовать OnKeyPress и просто запретить ввод остальных символов, кроме чисел?
Это уж тебе решать, может оно и проще, а может и не совсем... Но в использовании TryStrToInt ничего сложного не вижу. Вот так, например:
procedure TForm1.SGSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
var
i : integer;
IntValue : Integer; // <--- Раз ...
begin
max_index := -1;
with Sender as TStringGrid do
begin
// Проходим по всем ячейкам, и смотрим, равные ли значения в [, 1] и [, 2],
// и не пустые ли они. В общем, все, как и выше.
for i := 1 to ColCount do
if (Cells[i, 1] <> '') and (Cells[i, 1] = Cells[i, 2]) and TryStrToInt(Cells[i, 1], IntValue) then // <--- Два ...
begin
if max_index = -1 then // Если это первое непустое значение - то начинаем отсчет с него
max_index := i
else
// Если нет - то сравнваем с предыдущим максимумом...
if IntValue > StrToInt(Cells[max_index, 1]) then // <--- Три ...
max_index := i;
end; // if Cells ...
Invalidate; // <--- Ну, и перерисовываем...
end;
end;
, теперь даже если ты введешь не число (или число, но не целое, а вещественное), ничего страшного в этом обработчике не случится, все нецелые просто не будут обрабатываться (максимум среди них не будет искаться). Сделай что-то подобное в OnDrawCell - и можешь быть спокоен: вылетов не будет...
 К началу страницы 
+ Ответить 
marwell
сообщение 11.04.2011 19:01
Сообщение #3


Бывалый
***

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

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


Цитата(volvo @ 11.04.2011 13:00) *

Это уж тебе решать, может оно и проще, а может и не совсем... Но в использовании TryStrToInt ничего сложного не вижу. Вот так, например:
procedure TForm1.SGSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
var
i : integer;
IntValue : Integer; // <--- Раз ...
begin
max_index := -1;
with Sender as TStringGrid do
begin
// Проходим по всем ячейкам, и смотрим, равные ли значения в [, 1] и [, 2],
// и не пустые ли они. В общем, все, как и выше.
for i := 1 to ColCount do
if (Cells[i, 1] <> '') and (Cells[i, 1] = Cells[i, 2]) and TryStrToInt(Cells[i, 1], IntValue) then // <--- Два ...
begin
if max_index = -1 then // Если это первое непустое значение - то начинаем отсчет с него
max_index := i
else
// Если нет - то сравнваем с предыдущим максимумом...
if IntValue > StrToInt(Cells[max_index, 1]) then // <--- Три ...
max_index := i;
end; // if Cells ...
Invalidate; // <--- Ну, и перерисовываем...
end;
end;
, теперь даже если ты введешь не число (или число, но не целое, а вещественное), ничего страшного в этом обработчике не случится, все нецелые просто не будут обрабатываться (максимум среди них не будет искаться). Сделай что-то подобное в OnDrawCell - и можешь быть спокоен: вылетов не будет...

именно в OnDrawCell я и пытался сделать.
Я рассуждал так: сначала надо проверить, введено ли вообще значение
далее уже проверить, число ли это
потом уже остальные условия из OnDrawCell(проверка равны ли значения во 2ой и 3ей строке, проверка на максимальную пару)

procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
var IntValue : Integer;
begin
if (ACol > 0) and (ARow > 0) then
with Sender as TStringGrid do
begin
if (Cells[ACol, ARow] <> '') then
begin
if TryStrToInt(Cells[i, 1], IntValue) then
begin
if Cells[ACol, ARow] = Cells[ACol, 3 - ARow] then
begin
Canvas.Brush.Color := clRed;
Canvas.Font.Color := clWhite;
end
else
begin
Canvas.Brush.Color := clWhite;
Canvas.Font.Color := clBlack;
end;
if ACol = im then
begin
Canvas.Brush.Color := clGreen;
Canvas.Font.Color := clWhite;
end;

Canvas.fillRect(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, Cells[ACol, ARow]);
end
else MessageDLG('Ошибка! Введено не число!',mtError,[mbOK],0);
end;
end;
end;

но, что-то я делаю не так
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"