Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osnovy_programmirovanija_v_srede_lazarus.pdf
Скачиваний:
185
Добавлен:
18.03.2015
Размер:
6.53 Mб
Скачать

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

6.3.10.2. Компонент TStringGrid

TStringGrid находится во вкладке Additional и имеет вид, рис. 6.59.

Рис. 6.59. Вид компонента TStringGrid

Компонент представляет собой таблицу, состоящую из строк Rows и

столбцов Cols. В свою очередь таблица это двумерный массив, значениями которого являются строки символов и, следовательно, имеет тип string. Дос-

туп к данным осуществляется через свойство Cells. Ячейке таблицы, нахо-

дящейся на пересечении столбца с номером Col и строки с номером Row, соот-

ветствует элемент массива Cells[Col,Row]. Обратите внимание, вначале указывается столбец, а затем строка. Нумерация столбцов и строк начинается с нуля. Основные свойства компонента TStringGrid следующие:

ColCount – количество столбцов таблицы;

RowCount – количество строк таблицы;

FixedCols – количество фиксированных столбцов таблицы. Обычно фик-

сируется один, самый левый столбец и используется для задания постоянной информации, например, заголовка столбца. Но можно зафиксировать и больше столбцов. При этом зафиксированные столбцы выделяются цветом и при гори-

зонтальной прокрутке таблицы остаются на месте;

FixedRows – количество фиксированных строк таблицы. Точно так же,

607

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

фиксируется обычно одна строка для задания заголовка, но можно зафиксиро-

вать и больше строк. Строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте;

FixedColor – цвет фиксированных строк и столбцов.

VisibleColCount – количество видимых (прокручиваемых) столбцов,

равно ColCount FixedCols;

VisibleRowCount – количество видимых (прокручиваемых) строк, равно

RowCount FixedRows;

ScrollBars – определяет наличие в таблице полос прокрутки. Если ука-

зать значение ssAutoBoth, то полосы прокрутки будут появляться и исчезать автоматически в зависимости от того, помещается таблица в окно компонента или нет.

Во вкладке Options свойств TStringGrid определены ряд свойств,

наиболее важными из которых являются:

goEditing – разрешает или запрещает редактирование содержимого яче-

ек таблицы. true – редактирование разрешено, false – запрещено;

goTab – разрешает (true) или запрещает (false) использование клави-

ши <Таb> для перемещения курсора в следующую ячейку таблицы;

goAlwaysShowEditor – признак нахождения компонента в режиме ре-

дактирования. Если значение свойства false, то для того, чтобы в ячейке поя-

вился курсор, надо начать набирать текст, нажать клавишу <F2> или сделать щелчок мышью.

Итак, вернемся к реализации метода Гаусса решения системы линейных алгебраических уравнений. Для ввода коэффициентов расширенной матрицы системы воспользуемся компонентом TStringGrid. Создайте новый проект и спроектируйте вид приложения так, как показано на рисунке 6.60.

Установите следующие свойства компонента TStringGrid:

ColCount = 1; RowCount = 1; FixedCols = 0; FixedRows = 0;

608

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

goEditing = true; goTab = true;

goAlwaysShowEditor = true;

Рис. 6.60. Форма приложения

Код программы:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, Grids, LCLType, LCLProc;

type

{ TForm1 }

TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Label4: TLabel; Memo1: TMemo;

StringGrid1: TStringGrid;

609

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject;

var Key: char); procedure FormShow(Sender: TObject);

procedure Gauss(var vector: array of extended; var b: array of extended;

var x: array of extended; var n: integer);

procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState); private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; n: integer;

a:array of array of extended;{матрица коэффициентов системы, двумерный динамический массив}

vector: array of extended; {преобразованный одномерный динамический массив }

b:array of extended;

x: array of extended; implementation

{ TForm1 }

procedure TForm1.Gauss(var vector: array of extended; var b: array of extended; var x: array of extended; var n: integer);

var

a: array of array of extended;{матрица коэффициентов системы, двумерный динамический массив}

i, j, k, p, r: integer; m, s, t: real;

begin try

SetLength(a, n, n); {установка фактического размера массива Преобразование одномерного массива в двумерный}

610

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

k:= 1;

for i:= 0 to n - 1 do for j:= 0 to n - 1 do begin

a[i, j]:= vector[k]; k:= k + 1;

end;

for k:= 0 to n - 2 do begin

for i:= k + 1 to n - 1 do begin

if (a[k, k]= 0) then begin

{перестановка уравнений} p:= k;

for r:= i to n - 1 do begin

if abs(a[r, k]) > abs(a[p, k]) then p:= r; end;

if p <> k then begin

for j:= k to n - 1 do begin

t:= a[k, j];

a[k, j]:= a[p, j]; a[p, j]:= t;

end;

t:= b[k]; b[k]:= b[p]; b[p]:= t;

end;

end; // конец блока перестановки уравнений m:= a[i, k] / a[k, k];

a[i, k]:= 0;

for j:= k + 1 to n - 1 do begin

a[i, j]:= a[i, j] - m * a[k, j]; end;

b[i]:= b[i] - m * b[k]; end;

end;

{Проверка существования решения} if a[n - 1, n - 1] <> 0 then

611

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

begin

x[n - 1]:= b[n - 1] / a[n - 1, n - 1]; for i:= n - 2 downto 0 do

begin s:= 0;

for j:= i + 1 to n - 1 do begin

s:= s - a[i, j] * x[j]; end;

x[i]:= (b[i] + s) / a[i, i]; end; Memo1.Lines.Add('Решение:'); for i:= 0 to n - 1 do

Memo1.Lines.Add('x' + IntToStr(i + 1) + '=' + FloatToStr(x[i]));

end else

if b[n - 1] = 0 then Memo1.Lines.Add('Система уравнений' +

' не имеет решения.')

else

Memo1.Lines.Add('Система уравнений' +

' имеет бесконечное множество решений.');

except

on EInvalidOP do

Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');

on EMathError do

Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');

on EZeroDivide do

Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');

on EOverflow do

Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');

on EUnderflow do

Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');

on EAccessViolation do

Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');

612

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

end;

a:= nil; // освобождение памяти end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift:TShiftState);

begin

if (Key = VK_Return) then begin

if (StringGrid1.Col >= n) then begin

StringGrid1.Row:= StringGrid1.Row + 1; StringGrid1.Col:= 0;

Key:= 0; end;

end;

end;

procedure TForm1.FormShow(Sender: TObject); begin

StringGrid1.ColCount:= 1;

StringGrid1.RowCount:= 1; Edit1.SetFocus; Button3.Visible:= true; Button4.Visible:= false;

end;

procedure TForm1.Button1Click(Sender: TObject); begin

Memo1.Clear;

StringGrid1.Clean; StringGrid1.ColCount:= 1; StringGrid1.RowCount:= 1; Edit1.Clear; Edit1.SetFocus; Button3.Visible:= true; Button4.Visible:= false;

end;

procedure TForm1.Button2Click(Sender: TObject); begin

{освобождение памяти, распределенной для динамических массивов}

a:= nil; vector:= nil; x:= nil;

b:= nil;

613

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

Close();

end;

procedure TForm1.Button3Click(Sender: TObject); begin

Edit1.SetFocus;

if Length(Edit1.Text) = 0 // если пустая строка then exit;

n:= StrToInt(Edit1.Text); StringGrid1.ColCount:= n + 1; StringGrid1.RowCount:= n ; Stringgrid1.SetFocus; Button3.Visible:= false; Button4.Visible:= true;

end;

procedure TForm1.Button4Click(Sender: TObject); begin

if (StringGrid1.Col >= n) then begin

StringGrid1.Row:= StringGrid1.Row + 1; StringGrid1.Col:= 0;

end else

StringGrid1.Col:= StringGrid1.Col+1; end;

procedure TForm1.Button5Click(Sender: TObject); var i, j, k, code:integer;

begin

{Установка реальных размеров динамических массивов} SetLength(a, n, n);

SetLength(vector, n * n); SetLength(b, n); SetLength(x, n);

for j:= 0 to n - 1 do for i:= 0 to n - 1 do begin

val(StringGrid1.Cells[i, j], a[i, j], code); if code <> 0 then

begin

ShowMessage('Ошибка при вводе коэффициентов матрицы'); StringGrid1.SetFocus;

exit;

end;

end;

614

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

for j:= 0 to n - 1 do begin

val(StringGrid1.Cells[n, j], b[j], code); if code <> 0 then

begin

ShowMessage('Ошибка при вводе свободных членов'); StringGrid1.SetFocus;

exit;

end;

end;

code:=0;

{Преобразование двумерного массива в одномерный} k:= 1;

for j:= 0 to n - 1 do for i:= 0 to n - 1 do begin

vector[k]:= a[i, j]; k:= k + 1;

end;

{Вызов процедуры решения системы линейных алгебраических уравнений методом Гаусса}

Gauss(vector, b, x, n); end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then begin

if Length(Edit1.Text) = 0 // если пустая строка then exit;

n:=StrToInt(Edit1.Text); StringGrid1.ColCount:= n + 1; StringGrid1.RowCount:= n ; Stringgrid1.SetFocus;

exit;

end;

{разрешаем только цифры, знак минус и кл. BackSpace} if not (Key in ['0' .. '9', #8])

then begin

Key:= #0; exit;

end;

615

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]