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.