Всем привет. Нужно организовать ввод чисел в ручную непосредственно в ячейки матрицы stringgrid1. Суть проги это генерация матрицы, поиск максимального элемента и перенос этого элемента в центр второй. И нужно теперь добавить редактирование матрицы(ввод чисел в матрицу) пользователем. Т.е. вводим размерность матрицы она генерируется, после редактирование нужными значениями и в итоге должна получится матрица с максимальным значением в центре(В моем коде просто генерация матрицы. ). Я приложу архив "Матрица.rar" с прогойи сам код.
Я понятия не имею как это реализовать.
Были идеи, но они не подошли. Кажется придется все переписывать(
Код:
unit LevonKurs;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Buttons, Menus;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
StringGrid2: TStringGrid;
Button3: TButton;
BitBtn1: TBitBtn;
Label1: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
procedure StringGrid2DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type Tmatr=array [1..50] of array [1..50] of real;
var
Form1: TForm1;
n,c:integer;
matr:Tmatr;
MaxCol, MaxRow : integer;
implementation
uses Unit2;
{$R *.dfm}
function findmax(var Matr: TMatr; var row, col: integer): real;
var i: integer; max: real;
begin
max := Matr[1,1]; row := 1; col := 1;
for i := 1 to n do
begin
//на главной диагонали
if Matr[i, i] > max then
begin
max := Matr[i, i];
row := i;
col := i
end;
//на побочной диагонали
if Matr[i, n-i+1] > max then
begin
max := Matr[i, n-i+1];
row := i;
col := n-i+1
end;
end;
findmax := max;
end;
//создание и вывод матрицы на экран
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
randomize;
repeat
val(Edit1.Text,n,c);
if c<>0 then
begin
showmessage('Введите начальные данные!'); //Выводит сообщение если введено что-то по мими чис
Edit1.Clear;
Edit1.SetFocus;
exit;
end;
if StrToInt(Edit1.Text) > 50 then //n не должно быть больше 50
begin
ShowMessage('Error!:Введите значения в диапозоне от 1 до 50');
edit1.text:='';
edit1.Setfocus;
exit;
end;
n:=strtoint(edit1.text);
if not odd(n) then //n должно быть нечетным
begin
showmessage('Введено неверное значение. Проверьте введенные данные!');
edit1.text:=''; //Выводит текст если n четная
edit1.Setfocus;
exit;
end;
until odd(n);
for i:=1 to n do
for j:=1 to n do
Matr[i,j]:=random*198-99;
findmax(matr,MaxRow,MaxCol);
for i:= 1 to n do
for j:=1 to n do
StringGrid1.Cells[j-1+1,i-1+1]:=FloatToStrF(matr[i,j],ffFixed,5,4);
for i:=1 to n do begin
StringGrid1.cells[0,0]:='Массив №1';
StringGrid1.cells[0,i]:=''+inttostr(i);
StringGrid1.cells[i,0]:=''+inttostr(i);
StringGrid1.colCount:=n+1;
StringGrid1.RowCount:=n+1;
end;
end;
//обмен элементов и вывод результата на экран
procedure TForm1.Button2Click(Sender: TObject);
var buf:real;
i,j,row,col:integer;
begin
if not odd(n) then //n должно быть нечетным
begin
showmessage('Введено неверное значение. Проверьте введенные данные!');
edit1.text:=''; //Выводит текст если n четная
edit1.Setfocus;
exit;
end;
buf := matr[n div 2 + 1, n div 2 + 1];
matr[n div 2 + 1, n div 2 + 1] := findmax(matr,row,col);
matr[row, col] := buf;
for i:= 1 to n do
for j:=1 to n do
StringGrid2.Cells[j-1+1,i-1+1]:=FloatToStrF(matr[i,j],ffFixed,5,4);
for i:=1 to n do begin
StringGrid2.cells[0,0]:='Массив №2';
StringGrid2.cells[0,i]:=''+inttostr(i);
StringGrid2.cells[i,0]:=''+inttostr(i);
StringGrid2.colCount:=n+1;
StringGrid2.RowCount:=n+1;
end;
end;
//Окрашивание макс. зн. в первой матрице
procedure TForm1.StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
if (MaxCol =0) or (MaxRow=0) then Exit;
if ((ACol= MaxCol)and(ARow= MaxRow)) then
begin
StringGrid1.Canvas.Brush.Color:=clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;
end;
//Окрашивание центра второй матрицы
procedure TForm1.StringGrid2DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
if (MaxCol =0) or (MaxRow=0) then Exit;
if ((ACol= n div 2+1)and(ARow= n div 2+1)) then
begin
StringGrid2.Canvas.Brush.Color:=clRed;
StringGrid2.Canvas.FillRect(Rect);
StringGrid2.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid2.Cells[Acol,Arow]);
end;
end;
//Очистка данных
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
begin
Edit1.clear;
with StringGrid1 do
for i:=0 to ColCount-1 do
Cols[i].Clear;
with StringGrid2 do
for i:=0 to ColCount-1 do
Cols[i].Clear;
end;
procedure TForm1.N3Click(Sender: TObject); // Выход
begin
Close;
end;
procedure TForm1.N2Click(Sender: TObject);// Справка
begin
Form2.Show;
end;
end.