Interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
a:array[1..5] of integer;//массив
summ:integer; //элемент қосындысы
sr:real; //арифметикалық орта
i:integer; //индекс
begin
//массивті енгізуді санаймыз,
//егер ұяшық бос болса, онда оған сәйкес массив элементі
//нөлге тең
for i:=1 to 5 do
if Length(StringGrid1.Cells[i-1,0])<>0
then a[i]:=StrToInt(StringGrid1.Cells[i-1,0])
else a[i]:=0;
//массивті өңдеу
summ:=0;
for i:=1 to 5 do
summ:=summ+a[i];
sr:=summ/5;
//нәтижені шығару
Label2.Caption:=
'Элементтер қосындысы:'+InttoStr(summ)+#13+
'Арифметикалық ортасы:'+FloatToStr(sr);
end;
end.
Программаны орындаған соң енді, осы программаға өзгеріс енгізгіміз келеді. Яғни курсор келесі ұяшыққа <Enter> пернесін басқанда автоматты түрде көшсе. Оны OnKeyPress оқиғасын өңдеу процедурасының көмегімен жасаймыз. Осы процедураға кесте ұяшығына енгізілгендерді филтрлеуді қосуға болады. Біздің жағдайымызда ұяшыққа тек цифр енгізетін болу керек.
Листинг 8.3 OnKeyPress оқиғасын өңдеу процедурасы
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9':; //
#13: //
if StringGrid1.Col<StringGrid1.ColCount-1
then StringGrid1.Col:=StringGrid1.Col+1;
else key:=Chr(0); //
end;
end;
Егер массивке нақты сандарды енгізу керек болса(a:array[1..5] of real), онда OnKeyPress оқиғасын өңдеу процедурасы қиындайды. Себебі минус және сандарды бөлу символы (үтір) символдарға жатады. DecimalSeparator айнымалысын пайдаланамыз.
Листинг 8.4 Нақты сандар массивін енгізу және өңдеу.
unit Sum_AO;
Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
a:array[1..5] of real; //массив
summ:real; //элементтер қосындысы
sr:real; //арифметикалық ортасы
i:integer; //индекс
begin
//массивті енгізу санаймыз,
//егер ұяшық бос болса,
//онда оған сәйкес массив элменті нолге тең
for i:=1 to 5 do
if Length(StringGrid1.Cells[i-1,0])<>0
then a[i]:=StrToInt(StringGrid1.Cells[i-1,0])
else a[i]:=0;
//массивті өңдеу
summ:=0;
for i:=1 to 5 do
summ:=summ+a[i];
sr:=summ/5;
//нәтижені шығару
Label2.Caption:=
'Элементтер қосындысы:'+ FloatToStr(summ)+#13+
'Арифметикалық ортасы:'+FloatToStr(sr);
end;
//функция ұяшыққа енгізілетін сандарды ғана енгізеді
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9':; //цифр және <Backspace>
#13: //<Enter> пернесі
if StringGrid1.Col<StringGrid1.ColCount-1
then StringGrid1.Col:=StringGrid1.Col+1;
'.',',': //санның бүтін және бөлшек бөлігін бөлуші
begin
if key<>DecimalSeparator then
Key:=DecimalSeparator ;//бөлгішті рұқсат етілген символға ауыстыру
if Pos(StringGrid1.Cells[StringGrid1.Col,0],
DecimalSeparator )<>0
then key:=Chr(0); //екінші бөлгішті енгізуге тиым салу
end;
'-': //минусты бірінші символ ретінде ғана енгізуге болады
if Length(StringGrid1.Cells[StringGrid1.Col,0])<>0
then key:=Chr(0);
else //
key:=Chr(0) ;
end;
end;
end.
