Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2019, 22:16   #1
LeonDTym
 
Регистрация: 19.08.2019
Сообщений: 7
Восклицание Delphi Изменение значений в ячейках Stringgrid1

Всем привет. Нужно организовать ввод чисел в ручную непосредственно в ячейки матрицы 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.
Вложения
Тип файла: rar Матрица.rar (212.1 Кб, 25 просмотров)
LeonDTym вне форума Ответить с цитированием
Старый 22.09.2019, 20:14   #2
LeonDTym
 
Регистрация: 19.08.2019
Сообщений: 7
По умолчанию

Вопрос уже не актуален. Сам все сделал)
LeonDTym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение значений StringGrid1 aank10 C++ Builder 0 24.03.2013 19:19
Изменение данных в ячейках ComboBox или ТеxtBox? seide Microsoft Office Excel 4 10.05.2012 12:58
Удаление и ввод значений в ячейках segail Microsoft Office Excel 0 16.12.2009 09:45
Изменение значенией в формуле на основе значений в ячейках ru3000 Microsoft Office Excel 11 07.08.2009 13:25
удаление значений в ячейках pirat:) Microsoft Office Excel 4 23.12.2008 20:54