Отчет о лабораторной работе 1 Создание многопоточных программ в среде Delphi и исследование свойств потоков
Скачать 1.02 Mb.
|
Федеральное агентство по образованию Рязанский государственный радиотехнический университет Кафедра ЭВМ Отчет О лабораторной работе №1 «Создание многопоточных программ в среде Delphi и исследование свойств потоков» Выполнила: ст. гр. 142 Малахова А.В. Проверил: Засорин С.В. Рязань 2013 г.
Форма приложения: Рисунок 1 – форма приложения Разные варианты выполнения приложения: Рисунок 2 – приоритет 2ого потока больше Рисунок 3 – приоритет 1ого потока больше Код программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Timer1: TTimer; TrackBar1: TTrackBar; TrackBar2: TTrackBar; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure TrackBar2Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Count1,Count2: integer; {число вычислений в секунду в потоке} ThreadId1,ThreadId2:dword; {идентификатор потока} HThread1, HThread2: THandle; {указатель на поток} implementation {$R *.dfm} procedure Execute1; var I, Total, Avg: integer; begin while True do begin Total:=0; for i:=1 to 10 do inc(Total, Random(Maxint)); Avg:=Avg Div 10; inc(Count1); end; end; procedure Execute2; var I, Total, Avg: integer; begin while True do begin Total:=0; for i:=1 to 10 do inc(Total, Random(Maxint)); Avg:=Avg Div 10; inc(Count2); end; end; procedure TForm1.Button1Click(Sender: TObject); begin HThread1:=CreateThread (nil, 0, @ Execute1, nil, 0, ThreadId1); end;
Окна работы приложения 2 представлено на рисунках: Рисунок 4 – работа приложения при низких приоритетах потоков Рисунок 5 – работа приложения при высоких приоритетах потоков При максимальных приоритетах потоков увеличивается их производительность и замечается медленный отклик программ ОС. Код программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Thrd, ExtCtrls, StdCtrls, ComCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; TrackBar1: TTrackBar; TrackBar2: TTrackBar; Timer1: TTimer; Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure TrackBar1Change(Sender: TObject); private { Private declarations } public { Public declarations } Thread1,Thread2:TSimpleThread; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Thread1:=TSimpleThread.Create(False); Thread1.Priority:=tpLowest; Thread2:=TSimpleThread.Create(False); Thread2.Priority:=tpLowest; end; procedure TForm1.Button3Click(Sender: TObject); begin close(); end; procedure TForm1.Timer1Timer(Sender: TObject); begin Edit1.Text:=intToStr(Thread1.Count ); Thread1.Count:=0; Edit2.Text:=intToStr(Thread2.Count ); Thread2.Count:=0; end; procedure TForm1.TrackBar1Change(Sender: TObject); var i: Integer; Priority: TThreadPriority; begin Priority:=tpLowest; for i:=0 to (Sender as tTrackBar).Position-1 do inc(Priority); if Sender=TrackBar1 then Thread1.Priority:=Priority else Thread2.Priority:=Priority; end; end. unit Thrd; interface uses Classes; type TSimpleThread = class(TThread) private { Private declarations } protected procedure Execute; override; public Count: Integer; end; implementation { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TSimpleThread.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; } { TSimpleThread } procedure TSimpleThread.Execute; var i,Total,Avg:integer; begin while True do begin Total:=0; for i:=1 to 10 do inc(Total,Random(Maxint)); Avg:=Avg Div 10; inc(Count); end; end; end.
В программе создается три потока, каждый из которых перемещает изображение (например, автомобиль) по форме. Примеры выполнения приложения: Рисунок 6 – запущен только 1ый поток Рисунок 7 – запущен 1ый поток и 3ий поток с более высоким приоритетом Рисунок 8 – запущены все 3 потока, приоритет 3его выше Код программы: unit move; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, car1; type TForm1 = class(TForm) TrackBar1: TTrackBar; TrackBar2: TTrackBar; TrackBar3: TTrackBar; Button1: TButton; Button2: TButton; Button3: TButton; PaintBox1: TPaintBox; PaintBox2: TPaintBox; PaintBox3: TPaintBox; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure TrackBar1Change(Sender: TObject); private public Thread1, Thread2, Thread3:TMoveThread; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var taxi00, taxi01: TBitMap; begin taxi00:=tbitmap.Create; // Создается объект BitMap taxi00.LoadFromFile('5.bmp'); //В него загружается изображение taxi01:=tbitmap.Create; taxi01.LoadFromFile('51.bmp'); thread1:=TMoveThread.Create(taxi00,taxi01,PaintBox1);//Создается поток Thread1.Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы. thread2:=TMoveThread.Create(taxi00,taxi01,PaintBox2); Thread2.Priority:=tpLowest; thread3:=TMoveThread.Create(taxi00,taxi01,PaintBox3); Thread3.Priority:=tpLowest; Thread1.Suspend;Thread2.Suspend; Thread3.Suspend; end; procedure TForm1.Button1Click(Sender: TObject); begin if Thread1.Suspended=true then begin Thread1.Resume ; Button1.caption:='Стоп' end else begin Thread1.Suspend ; Button1.caption:='Старт'; end; end; procedure TForm1.Button2Click(Sender: TObject); begin if Thread2.Suspended=true then begin Thread2.Resume ; Button2.caption:='Стоп' end else begin Thread2.Suspend ; Button2.caption:='Старт'; end; end; procedure TForm1.Button3Click(Sender: TObject); begin if Thread3.Suspended=true then begin Thread3.Resume ; Button3.caption:='Стоп' end else begin Thread3.Suspend ; Button3.caption:='Старт'; end; end; procedure TForm1.TrackBar1Change(Sender: TObject); var I: integer; priority:TThreadPriority;{ Изменение приоритета соответствующего потока } begin priority:=tpIdle; for i:=0 to ((sender as ttrackbar).position -1) do inc(priority); if sender=trackbar1 then thread1.priority:=priority else if sender=trackbar3 then thread3.priority:=priority else thread2.Priority:=priority; end; end. unit car1; interface uses Classes, Graphics, ExtCtrls, SysUtils; type TMoveThread = class(TThread) private FBox: TPaintBox; // Где воспроизводится картинка b0,b1: tbitmap; // Сами картинки i:integer; // Для определения координат картинки procedure DoVisualSwap; // Одна процедура двигает вправо, procedure DoVisual; // Другая влево protected procedure Execute; override; public Thread1, Thread2, Thread3:TMoveThread; constructor Create(a,b: TBitmap; c:TPaintBox); destructor Destroy; override; end; implementation constructor TMoveThread.Create(a,b:tbitmap; c:TPaintBox); begin b0:=a;b1:=b;Fbox:=c;i:=0; inherited Create(False); end; procedure TMoveThread.DoVisualSwap;{Двигает картинку вправо} begin with FBox do begin canvas.Draw(i,0,b0); inc(i); end; end; procedure TMoveThread.DoVisual; { Двигает картинку влево } begin with FBox do begin canvas.Draw(i,0,b1); dec(i); end; end; procedure TMoveThread.Execute; begin while true do begin while i<=(fbox.Width+b0.Width) do Synchronize(DoVisualSwap); while i>=(0-b0.Width) do Synchronize(DoVisual); end; end; destructor TMoveThread.Destroy; begin b0.free; b1.free; inherited Destroy; end; end.
Форма приложения: Рисунок 9 – форма Клавиатурного Тренажёра Лёгкий уровень игры: Рисунок 9 – лёгкий уровень игры Средний уровень: Рисунок 10 – средний уровень игры Сложный уровень: Рисунок 11 – сложный уровень игры Режим русского языка: Рисунок 12 – режим русского языка При изменении компонента scrollbar меняется скорость падения букв. При количестве ошибок, равном 10, игра заканчивается: Рисунок 13 – окончание игры Код программы: unit move; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, car1; type TForm1 = class(TForm) Button1: TButton; PaintBox1: TPaintBox; PaintBox2: TPaintBox; PaintBox3: TPaintBox; Timer1: TTimer; Image1: TImage; Edit1: TEdit; Label1: TLabel; TrackBar1: TTrackBar; Label2: TLabel; Button2: TButton; Button3: TButton; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; GroupBox2: TGroupBox; RadioButton4: TRadioButton; RadioButton5: TRadioButton; Timer2: TTimer; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure TrackBar1Change(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Timer2Timer(Sender: TObject); private public Thread: array[1..3] of TMoveThread; taxi00: char; end; var Level: integer; Form1: TForm1; check: boolean; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var img: TBitMap; begin img:= tbitmap.Create; img.LoadFromFile('12.bmp'); Image1.canvas.draw(0,0,img); RadioButton4.Checked:=true; thread[1]:=TMoveThread.Create(PaintBox1);//Создается поток Thread[1].Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы. thread[2]:=TMoveThread.Create(PaintBox2);//Создается поток Thread[2].Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы. thread[3]:=TMoveThread.Create(PaintBox3);//Создается поток Thread[3].Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы. RadioButton2.Checked:=true; check:=false; end; procedure TForm1.Button1Click(Sender: TObject); var x:integer; begin RadioButton1.Enabled:=false; RadioButton2.Enabled:=False; RadioButton3.Enabled:=False; RadioButton4.Enabled:=False; RadioButton5.Enabled:=False; Button1.Enabled:=false; TrackBar1.enabled:=false; if RadioButton1.checked=true then level:=3; if RadioButton2.checked=true then level:=2; if RadioButton3.checked=true then level:=1; for x:=1 to level do begin thread[x].DoVisualSwap; Thread[x].resume; check:=true; end; end; procedure TForm1.Button3Click(Sender: TObject); var x:integer; begin RadioButton1.Enabled:=true; RadioButton2.Enabled:=true; RadioButton3.Enabled:=true; RadioButton4.Enabled:=true; RadioButton5.Enabled:=true; Button1.Enabled:=true; TrackBar1.enabled:=true; check:=false; for x:=1 to level do begin PaintBox1.Refresh; PaintBox2.Refresh; PaintBox3.Refresh; Thread[x].er:=0; edit1.Text:=inttostr(0); thread[x].terminate; thread[x].DoVisualSwap; end; label3.Caption:=''; end; procedure TForm1.Button2Click(Sender: TObject); begin Close; end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var x:integer; begin if check=true then begin for x:= 1 to level do if thread[x].b0 = Key then begin thread[x].DoVisualSwap; PaintBox1.Refresh; PaintBox2.Refresh; PaintBox3.Refresh; exit; end; thread[1].er:=(thread[1].er)+1; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var x:integer; begin for x:=1 to level do begin if check=true then begin thread[x].Execute; thread[x].go:=true; edit1.Text:=inttostr((thread[1].er)+(thread[2].er)+(thread[3].er)); end; end; end; procedure TForm1.TrackBar1Change(Sender: TObject); begin Timer1.Interval := 70 - TrackBar1.Position*20; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if edit1.Text='10' then begin button3.Click; Button1.Enabled:=false; label3.Caption:='вы проиграли!'; end; if edit1.Text='11' then begin button3.Click; Button1.Enabled:=false; label3.Caption:='вы проиграли!'; end; if edit1.Text='12' then begin button3.Click; Button1.Enabled:=false; label3.Caption:='вы проиграли!'; end; end; end. unit car1; interface uses Classes, Graphics, ExtCtrls, SysUtils; type TMoveThread = class(TThread) private protected public FBox: TPaintBox; // Где воспроизводится картинка i:integer; // Для определения координат картинки b0: char; go: boolean; er: integer; procedure Execute; override; procedure DoVisualSwap; constructor Create(c:TPaintBox); destructor Destroy; override; end; implementation uses move; constructor TMoveThread.Create(c:TPaintBox); begin Fbox:=c;go:=false;er:=0; inherited Create(False); end; procedure TMoveThread.DoVisualSwap; begin i:=0; if form1.RadioButton4.Checked=true then b0:=chr(random(26)+97) else b0:=chr(random(32)+224); end; procedure TMoveThread.Execute; begin if go=true then begin FBox.Canvas.textout(20,i,b0); i:=i+1; go:=false; end; while i>(fbox.Height) do begin er:=er+1; synchronize(DoVisualSwap); end; end; destructor TMoveThread.Destroy; begin b0:=#0; inherited Destroy; end; end.
Дано прямоугольное поле размером MxN клеток. На поле задана произвольная система препятствий, начальная клетка, в которой находится «Черепашка», и конечная клетка. Найдите маршрут выхода «Черепашки» из лабиринта, если он существует, и пронумеруйте клетки маршрута в том порядке, в котором проходит их «Черепашка». «Черепашка» может делать шаг на одну клетку в любом из четырех направлений: влево, вправо, вверх, вниз. Исходная форма приложения: Рисунок 14 – форма игры Лабиринт Прохождение лабиринта: Рисунок 15 – прохождение лабиринта Отсутствие решения: Рисунок 16 – отсутствие решения Код программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls, Spin, ImgList; type TForm1 = class(TForm) Button1: TButton; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; StaticText1: TStaticText; StaticText2: TStaticText; Button2: TButton; Button3: TButton; DrawGrid1: TDrawGrid; ImageList1: TImageList; Timer1: TTimer; Button4: TButton; StringGrid1: TStringGrid; Button5: TButton; procedure Button1Click(Sender: TObject); procedure SpinEdit1Change(Sender: TObject); procedure SpinEdit2Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure Timer1Timer(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; m, n, sx, sy, fx, fy: integer; //размер лабиринта, координаты в массиве лабиринта а старта и финиша a,b: array[0..20, 0..20] of integer; //массивы лабиринта а и b go: boolean; done: boolean; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var c,r: integer; begin SpinEdit1.Text:='10'; // начальный размер SpinEdit2.Text:='10'; // лабиринта sx:=0;sy:=0;fx:=strtoint(SpinEdit1.Text)-1;fy:=strtoint(SpinEdit2.Text)-1; RadioButton1.Checked:=true; a[fx,fy]:=1; a[sx,sy]:=2; for c:=0 to m do for r:=0 to n do b[c,r]:=0; end; procedure TForm1.SpinEdit1Change(Sender: TObject); //изменение ширины var c,r: integer; begin DrawGrid1.ColCount:=strtoint(SpinEdit1.Text); m:=strtoint(SpinEdit1.Text); DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1); DrawGrid1.Repaint; sx:=0;sy:=0;fx:=m-1;fy:=n-1; for c:=0 to m do for r:=0 to n do begin a[c,r]:=0; b[c,r]:=0; end; a[sx,sy]:=2; fx:=m-1; a[fx,fy]:=1; end; procedure TForm1.SpinEdit2Change(Sender: TObject); //изменение высоты var c,r: integer; begin DrawGrid1.RowCount:=strtoint(SpinEdit2.Text); n:=strtoint(SpinEdit2.Text); DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1); DrawGrid1.Repaint; sx:=0;sy:=0;fx:=m-1;fy:=n-1; for c:=0 to m+1 do for r:=0 to n+1 do begin a[c,r]:=0; b[c,r]:=0; end; a[fx,fy]:=1;a[sx,sy]:=2; a[fx,fy]:=0; fy:=n-1; a[fx,fy]:=1; end; procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); //построение лабиринта begin if (ACol=SX) and (ARow=SY) then exit; if (ACol=FX) and (ARow=FY) then exit; if radiobutton2.Checked=true then //препятствие begin a[acol,arow]:=-1; DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35); ImageList1.Draw(DrawGrid1.Canvas,ACol*35+2,ARow*35+2,0); end; if radiobutton1.Checked=true then //старт begin a[sx,sy]:=0; a[acol,arow]:=2; DrawGrid1.Canvas.Rectangle(sx*35-1,sy*35-1,sx*35+35,sy*35+35); sx:=acol; sy:=arow; DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35); ImageList1.Draw(DrawGrid1.Canvas,ACol*35+2,ARow*35+2,2); end; if radiobutton3.Checked=true then //финиш begin a[fx,fy]:=0; a[acol,arow]:=1; DrawGrid1.Canvas.Rectangle(fx*35-1,fy*35-1,fx*35+35,fy*35+35); fx:=acol; fy:=arow; DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35); ImageList1.Draw(DrawGrid1.Canvas,ACol*35+2,ARow*35+2,1); end; if radiobutton4.Checked=true then //удалить препятствие begin a[ACol, ARow]:=0; DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35); end; DrawGrid1.Repaint; end; procedure TForm1.Button3Click(Sender: TObject); //очистка лабиринта полностью var c,r: integer; begin DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1); DrawGrid1.Repaint; sx:=0;sy:=0;fx:=m-1;fy:=n-1; for c:=0 to m do for r:=0 to n do begin a[c,r]:=0; b[c,r]:=0; end; a[fx,fy]:=1;a[sx,sy]:=2; end; procedure TForm1.Button2Click(Sender: TObject); //поиск пути var count, k, i, j,c,r: integer; begin count:=0; i:=sx; j:=sy; a[i,j]:=0; b[i,j]:=1; for k:=0 to 200 do begin if ((a[i+1,j]=0)or(a[i+1,j]=1)) and (b[i+1,j]=0) then begin inc(i); if a[i,j]=1 then //идем вправо begin showmessage('Путь найден!'); //for c:=0 to m do // for r:=0 to n do begin b[c,r]:=0; end; exit; end; b[i,j]:=1; inc(count); DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count)); end; if ((a[i-1,j]=0)or(a[i-1,j]=1)) and (b[i-1,j]=0) then begin dec(i); if a[i,j]=1 then //идем влево begin showmessage('Путь найден!'); //for c:=0 to m do // for r:=0 to n do begin b[c,r]:=0; end; exit; end; b[i,j]:=1;inc(count); DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count)); end; if ((a[i,j+1]=0)or(a[i,j+1]=1)) and (b[i,j+1]=0) then begin inc(j); if a[i,j]=1 then //идем вверх begin showmessage('Путь найден!'); //for c:=0 to m do // for r:=0 to n do begin b[c,r]:=0; end; exit; end; b[i,j]:=1;inc(count); DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count)); end; if ((a[i,j-1]=0)or(a[i,j-1]=1)) and (b[i,j-1]=0) then begin dec(j); if a[i,j]=1 then //идем вниз begin showmessage('Путь найден!'); //for c:=0 to m do // for r:=0 to n do begin b[c,r]:=0; end; exit; end; b[i,j]:=1;inc(count); DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count)); end; if ((a[i+1,j]=-1)or(b[i+1,j]=1)) // условие невозможности поиска выхода and((a[i-1,j]=-1)or(b[i-1,j]=1)) and((a[i,j+1]=-1)or(b[i,j+1]=1)) and((a[i,j-1]=-1)or(b[i,j-1]=1)) then begin showmessage('Пути не существует'); a[sx,sy]:=2; exit; end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); //прорисовка компонентов var c,r:integer; begin ImageList1.Draw(DrawGrid1.Canvas,sx*35+2,sy*35+2,2); ImageList1.Draw(DrawGrid1.Canvas,fx*35+2,fy*35+2,1); for c:=0 to m do for r:=0 to n do begin if a[c,r]=-1 then ImageList1.Draw(DrawGrid1.Canvas,c*35+2,r*35+2,0); end; end; procedure TForm1.Button1Click(Sender: TObject); begin //выход из игры Close; end; procedure TForm1.Button4Click(Sender: TObject); //отображение массива а var c,r: integer; begin for c:=0 to m do for r:=0 to n do begin stringgrid1.Colcount:=m; stringgrid1.rowcount:=n; stringgrid1.Cells[c,r]:= inttostr(a[c,r]); end; end; procedure TForm1.Button5Click(Sender: TObject); //отображение массива b var c,r: integer; begin for c:=0 to m do for r:=0 to n do begin stringgrid1.Colcount:=m; stringgrid1.rowcount:=n; stringgrid1.Cells[c,r]:= inttostr(b[c,r]); end; end; end. |