Rekordok használata
Ez az egyszerű program a rekordok
használatát demonstrálja. Az adatokat tipizált lemezes állományban tárolja,
melyet futáskor betölt, a programból való kilépéskor pedig automatikusan a
lemezre ment. Ha a lemezes állomány nem létezik, akkor üres tartalommal
automatikusan létrehozza.
A program az adatokat egy sztringrácsban jeleníti meg,
melynek sorai egy rekord mezőit tartalmazza. A sztringrács cellái editálhatók.
A rács utolsó sora összesítést tartalmaz, mely cellaváltásra aktualizálódik és
tartalmát billentyűzetről átírni csak ideiglenesen
lehet.
Új rekord beszúrására, illetve rekordok törlésére
nyomógombok állnak rendelkezésre. A maximális rekordszámot a max nevű konstans
tartalmazza.
A program futási képe:
A program listája:
unit URekord;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TfmRekord = class(TForm)
lbRekord: TLabel;
sgTabla: TStringGrid;
btKilepes: TButton;
btIns: TButton;
btDel: TButton;
Procedure Lemezrol;
Procedure Lemezre;
Procedure RekordTablabol(Sor:Word);
Procedure RekordTablaba(Sor:Word);
Procedure Szamol;
procedure FormCreate(Sender: TObject);
procedure btKilepesClick(Sender: TObject);
procedure btInsClick(Sender: TObject);
procedure btDelClick(Sender: TObject);
procedure sgTablaClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
St11=String[11];
St24=String[24];
St32=String[32];
TRekord=Record
Ind: LongInt;
Nev: St32;
SzulDat: St11;
Nem: Char;
Szak: St24;
Kredit: Word;
OsztDij: LongInt;
Tandij: LongInt;
Atlag: Real;
End;
Const Max=1000;
CRekord:TRekord=(Ind:0;
Nev:'';
SzulDat:'';
Nem:' ';
Szak:'';
Kredit:0;
OsztDij:0;
Tandij:0;
Atlag:0);
var
fmRekord: TfmRekord;
RSz: LongInt;
FRekord: File Of TRekord;
RekordT: Array[1..Max] Of TRekord;
DNev: String;
implementation
{$R *.dfm}
Procedure TfmRekord.Lemezrol;
Begin
RSz:= 0;
AssignFile(FRekord,DNev); {$I-}Reset(FRekord);{$I+}
If IOResult<>0 Then ReWrite(FRekord)
Else While Not EOF(FRekord) Do
Begin
Inc(RSz); Read(FRekord, RekordT[RSz]);
End;
CloseFile(FRekord);
End;
Procedure TfmRekord.Lemezre;
Var I: LongInt;
Begin
With sgTabla Do For I:= 1 To RowCount-2 Do RekordTAblaba(I);
AssignFile(FRekord,DNev); ReWrite(FRekord);
For I:= 1 To RSz Do Write(FRekord, RekordT[I]);
CloseFile(FRekord);
End;
Procedure TfmRekord.RekordTablabol(Sor:Word);
Var N: Word;
K: Integer;
R: Real;
Begin
With sgTabla Do With RekordT[Sor] Do
Begin
Val(Cells[0,Sor],N,K); If K=0 Then Ind:= N Else Ind:= 0;
Nev:= Cells[1,Sor];
SzulDat:= Cells[2,Sor];
If Cells[3,Sor]<>'' Then Nem:= Cells[3,Sor][1] Else Nem:= ' ';
Szak:= Cells[4,Sor];
Val(Cells[5,Sor],N,K); If K=0 Then Kredit:= N Else Kredit:= 0;
Val(Cells[6,Sor],N,K); If K=0 Then OsztDij:= N Else OsztDij:= 0;
Val(Cells[7,Sor],N,K); If K=0 Then Tandij:= N Else Tandij:= 0;
Val(Cells[8,Sor],R,K); If K=0 Then Atlag:= R Else Atlag:= 0;
End;
End;
Procedure TfmRekord.RekordTablaba(Sor:Word);
Var Ws: String;
Begin
With sgTabla Do With RekordT[Sor] Do
Begin
Cells[0,Sor]:= IntToStr(Ind);
Cells[1,Sor]:= Nev;
Cells[2,Sor]:= SzulDat;
Cells[3,Sor]:= Nem;
Cells[4,Sor]:= Szak;
Cells[5,Sor]:= IntToStr(Kredit);
Cells[6,Sor]:= IntToStr(OsztDij);
Cells[7,Sor]:= IntToStr(Tandij);
Ws:= FloatToStr(Atlag);
Ws[Pos(',',Ws)]:= '.';
Cells[8,Sor]:= Ws;
End;
End;
Procedure TfmRekord.Szamol;
Var I, ASz: Word;
Oszt, TDij: LongInt;
Atl: Real;
Ws: String;
Begin
For I:= 1 To RSz Do RekordTablabol(I);
Oszt:= 0; TDij:= 0; Atl:= 0; ASz:= 0;
With sgTabla Do
Begin
For I:= 1 To RSz Do With RekordT[I] Do
Begin
Oszt:= Oszt+OsztDij;
TDij:= TDij+Tandij;
If Atlag<>0 Then Inc(ASz);
Atl:= Atl+Atlag;
End;
Cells[6,RowCount-1]:= IntToStr(Oszt);
Cells[7,RowCount-1]:= IntToStr(TDij);
If ASz<>0 Then
Begin
Ws:= FloatToStr(Atl/ASz);
Ws[Pos(',',Ws)]:= '.';
Cells[8,RowCount-1]:= Ws
End Else Cells[8,RowCount-1]:= '0';
End;
End;
procedure TfmRekord.sgTablaClick(Sender: TObject);
Var I: Word;
begin
With sgTabla Do
Begin
Cells[1,RowCount-1]:= 'Összesen:';
For I:= 2 To 5 Do Cells[I,RowCount-1]:= '';
End;
For I:= 1 To RSz Do RekordTablabol(I); Szamol;
end;
procedure TfmRekord.btKilepesClick(Sender: TObject);
begin
Lemezre;
Close;
end;
procedure TfmRekord.FormCreate(Sender: TObject);
Var I: LongInt;
begin
DNev:= 'Hallgatók.dat';
Lemezrol;
With sgTabla Do
Begin
RowCount:= RSz+2;
ColWidths[1]:= 150;
ColWidths[2]:= 64;
ColWidths[3]:= 32;
ColWidths[4]:= 100;
ColWidths[6]:= 48;
ColWidths[7]:= 48;
Cells[0,0]:= 'Index';
Cells[1,0]:= 'Név';
Cells[2,0]:= 'Szül.Dat.';
Cells[3,0]:= 'Nem';
Cells[4,0]:= 'Szak';
Cells[5,0]:= 'Kredit';
Cells[6,0]:= 'Ösztöndíj';
Cells[7,0]:= 'Tandíj';
Cells[8,0]:= 'Átlag';
Cells[1,RowCount-1]:= 'Összesen:';
For I:= 1 To RSz Do RekordTablaba(I);
End;
Szamol;
end;
procedure TfmRekord.btInsClick(Sender: TObject);
Var I, J: Word;
begin
With sgTabla Do
Begin
RowCount:= RowCount+1;
For I:= RowCount-1 DownTo Row+1 Do
For J:= 1 To ColCount-1 Do Cells[J,I]:= Cells[J,I-1];
Cells[0,Row]:= IntToStr(Row); For J:= 1 To ColCount-1 Do Cells[J,Row]:= '';
For I:= 1 To RowCount-2 Do Cells[0,I]:= IntToStr(I);
Cells[0,RowCount-1]:= '';
End;
Inc(RSz); For I:= 1 To RSz Do RekordTablabol(I); Szamol;
end;
procedure TfmRekord.btDelClick(Sender: TObject);
Var I, J: Word;
begin
With sgTabla Do
Begin
If Row=RowCount-1 Then Exit;
For I:= Row To RowCount-2 Do
For J:= 1 To ColCount-1 Do Cells[J,I]:= Cells[J,I+1];
For J:= 1 To ColCount-1 Do Cells[J,Rowcount-1]:= '';
RowCount:= RowCount-1;
For I:= 1 To RowCount-2 Do Cells[0,I]:= IntToStr(I);
Cells[0,RowCount-1]:= '';
If (Row>1) And (Row=RowCount-1) Then Row:= Row-1;
End;
RekordT[RSz]:= CRekord;
Dec(RSz); For I:= 1 To RSz Do RekordTablabol(I); Szamol;
end;
end.