Уважаемые знатоки! Очень прошу помочь разобраться!
Дана матрица StringGrid - заполняется она случайными числами от -100 до 100 на двойной щелчок мыши. Последний столбец матрицы выводит сумму четных чисел в каждой строке. Сравнивая эти суммы, я должна выбрать наименьшую, и строку, где она находится, выделить рамкой.
Все работает, наименьшая сумма находится, номер строки тоже, а вот canvas не могу сделать..
Привожу код формы. Предполагаю, что ошибка где-то в последнем фрагменте.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Label4: TLabel;
Label6: TLabel;
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i, j, k, s1, s2, s, k2, SumStr, str, stlb, n, x1, x2, x3, y1, y2, ind: integer;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
str:=6;
StringGrid1.RowCount:=str;
StringGrid1.Height:=154;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
str:=7;
StringGrid1.RowCount:=str;
StringGrid1.Height:=178;
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
str:=8;
StringGrid1.RowCount:=str;
StringGrid1.Height:=205;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
stlb:=StrToInt(Combobox1.text);
StringGrid1.ColCount:=stlb+1;
ind:=stlb+1;
if (stlb=6) then StringGrid1.Width:=458
else if (stlb=7) then StringGrid1.Width:=525
else if (stlb=8) then StringGrid1.Width:=590;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
flog.Close;
end;
procedure TForm1.FormDblClick(Sender: TObject);
begin
randomize;
//заполнение матрицы случайными числами в диапазоне -100..100
For i:=0 to StringGrid1.RowCount - 1 do
for j:=0 to StringGrid1.ColCount - 2 do
StringGrid1.Cells[j,i]:=IntToStr(random(201)-100);
//подсчет суммы четных элем. строк
for i:=0 to StringGrid1.RowCount - 1 do
begin
SumStr:=0;
for j:=0 to StringGrid1.ColCount - 2 do
begin
if (StrToInt(StringGrid1.Cells[j,i]) mod 2 = 0) then
begin
k:=StrToInt(StringGrid1.Cells[j,i]);
SumStr:=SumStr+k;
end;
end;
//занесение сумм в j-1 столбец матрицы
StringGrid1.Cells[StringGrid1.ColCount-1,i]:=IntToStr(SumStr);
end;
//перебор элементов последнего столбца для поиска наименьшего
for j:=StringGrid1.ColCount - 2 to StringGrid1.ColCount - 1 do
begin
s:=StrToInt(StringGrid1.Cells[j,0]);
n:=0;
for i:=0 to StringGrid1.RowCount-2 do
begin
s1:=StrToInt(StringGrid1.Cells[j,i+1]);
if s>s1 then
begin
n:=i+1; //номер строки с наим.элементом
s:=s1; //значение наим.элемента
end;
end;
end;
Label5.Caption:=IntToStr(s);
Label6.Caption:=IntToStr(n);
for i := 0 to StringGrid1.RowCount - 1 do begin
k2 := StrToInt(StringGrid1.Cells[StringGrid1.ColCount - 1, i]);
if k2 = s then begin
if n=0 then begin
y1:=0;
y2:=0;
x2:=ind*25;
x1:=y2;
x3:=25;
end;
if n=1 then begin
y1:=0;
y2:=25;
x2:=ind*25;
x1:=y2;
x3:=y2*2;
end;
if n=2 then begin
y1:=0;
y2:=50;
x2:=ind*25;
x1:=y2;
x3:=75;
end;
if n=3 then begin
y1:=0;
y2:=75;
x2:=ind*25;
x1:=y2;
x3:=100;
end;
if n=4 then begin
y1:=0;
y2:=100;
x2:=ind*25;
x1:=y2;
x3:=125;
end;
if n=5 then begin
y1:=0;
y2:=125;
x2:=ind*25;
x1:=y2;
x3:=150;
end;
StringGrid1.Canvas.Pen.Color := clGreen;
StringGrid1.Canvas.Pen.Width := 1;
StringGrid1.Canvas.MoveTo(y1,y2);
StringGrid1.Canvas.LineTo(x2,x1);
StringGrid1.Canvas.LineTo(x2,x3);
StringGrid1.Canvas.LineTo(x2*(-1),x3);
end;
end;
end;
end.