[pascal] nie zapisuje do bazy danych

0

Witam, mam problem, ponieważ pisałem program na podstawie innego, wszystko działa dobrze oprócz zapisywania do bazy danych (w oryginale też jest ten problem). Po właczeniu można sobie coś dopisać i potem wybrać odnośnik z menu i wszystko jest jak nalezy,a le gdy wyłącze program i włacze na nowo, program nie czyta nic(bo nic nie zapisał). Oto fragment kodu:

type
    Gra=record
    Tytul:string[30];
    Platforma:string[15];
    Gatunek:string[10];
    end;

var
   wbazie:array[0..gry-1] of Gra;
   liczbagier:integer;
implementation

const baza='gry.dat';
procedure zapiszgry;
var
   plik: file of gra;
   i:integer;
   begin
        assign(plik,baza);
        rewrite(plik);
        for i:=0 to liczbagier-1 do
            write(plik, wbazie[i]);
        close(plik);
   end;

procedure pokazgry;
var
   plik:file of gra;
   i:integer;
   begin
        {$i-}
        assign(plik,baza);
        reset(plik);
        i:=0;
        if ioresult=0 then
        begin
             while not eof(plik) do
             begin
                  read(plik, wbazie[i]);
                  inc(i);
             end;
             close(plik);
        end;
   {$i+}
   liczbagier:=i
   end;

Z góry dziekuje za pomoc. Pozdrawiam :)

0

spróbuj użyć CloseFile zamiast Close.

0

hmm wywala błąd unknown identifier :(

0

sorki.. pośpieszyłem się... CloseFile jest m.in. w delphi.

Może Twój problem jest związany z inną częścią kodu (np. tam gdzie dopisujesz rekordy do tablicy).

0

Hmm troszke zmieniłem procedurę zapisu ale nadal nic... Bynajmniej oto całe źródło:

unit KATALOG;

interface

uses crt;

const
     gry = 500;

type
    Gra=record
    Tytul:string[30];
    Platforma:string[15];
    Gatunek:string[10];
    end;

var
   wbazie:array[0..gry-1] of Gra;
   liczbagier:integer;

procedure menu0;
procedure menu1;
procedure menu2;
procedure menu3;
procedure menu4;
procedure zapiszgry;
procedure pokazgry;

function nowagra(const giera : gra):boolean;
function usungre(nr:integer):boolean;
function ilegier:integer;

implementation

const baza='gry.db';

procedure menu0;
var
   wybierz:byte;
begin
     clrscr;
     writeln('1 - pokaz gry');
     writeln('2 - dodaj gre');
     writeln('3 - usun gre');
     writeln('4 - wyjdz');
     writeln;
     writeln('Co chcesz zrobic ?');
     readln(wybierz);
     if wybierz=1 then menu1;
     if wybierz=2 then menu2;
     if wybierz=3 then menu3;
     if wybierz=4 then menu4;
end;

procedure menu1;
var
   i:integer;
begin
     clrscr;
     writeln('Gry w Bazie');
     writeln;
     for i:=0 to ilegier-1 do
     begin
          write(i+1,'.',wbazie[i].Tytul,' na ',wbazie[i].Platforma,' to gra ',wbazie[i].Gatunek);
          writeln;
     end;
     writeln;
     writeln('Wcisnij klawisz by wyjsc do menu glownego');
     repeat until keypressed;
     menu0;
end;

procedure menu2;
var
   gierka:Gra;
begin
     clrscr;
     writeln('Dodawanie gry do Katalogu');
     writeln;
     writeln('Nazwa Gry: ');
     readln(gierka.Tytul);
     writeln('Gra na platforme: ');
     readln(gierka.Platforma);
     writeln('Ta gra jest gra (gatunek - akcji, wyscygowa, fpp symulacja)');
     readln(gierka.Gatunek);
     if nowagra(gierka) then
     writeln('Ok gra zostala dodana')
     else writeln('Cos poszlo nie tak, gra nie dodana');
     repeat until keypressed;
     menu0;
end;

procedure menu3;
var
   usun:integer;
begin
     clrscr;
     writeln('Usuwanie gry z katalogu');
     writeln;
     writeln('Podaj numer gry w katalogu');
     readln(usun);
     if usungre(usun-1) then
     writeln('Ok gra zostala usunieta')
     else writeln('cos poszlo nie tak, gra nie usunieta');
     repeat until keypressed;
     menu0;
end;

procedure menu4;
begin
     clrscr;
     writeln('Zapisuje baze przed wyjsciem');
     delay(1000);
     write('.');
     delay(1000);
     write('.');
     delay(1000);
     write('.');
     delay(2000);
     write('Zapisano');
     writeln;
     writeln('dziekuje za skorzystanie z programu');
     repeat until keypressed;
     halt;
end;

procedure zapiszgry;
var
   plik: file of gra;
   i:integer;
   begin
        assign(plik,baza);
        rewrite(plik);
        for i:=0 to liczbagier-1 do
            write(plik, wbazie[i]);
        close(plik);
   end;

procedure pokazgry;
var
   plik:file of gra;
   i:integer;
   begin
        {$i-}
        assign(plik,baza);
        reset(plik);
        i:=0;
        if ioresult=0 then
        begin
             while not eof(plik) do
             begin
                  read(plik, wbazie[i]);
                  inc(i);
             end;
             close(plik);
        end;
   {$i+}
   liczbagier:=i
   end;


function ilegier:integer;
begin
     ilegier:=liczbagier;
end;

function nowagra(const giera:Gra):boolean;
var
   i:integer;
begin
     if liczbagier >= gry-1 then
     nowagra:=false
     else
     begin
          i:=liczbagier-1;
          while (giera.Tytul < wbazie[i].Tytul) and (i >= 0) do
          begin
               wbazie[i+1]:=wbazie[i];
               dec(i);
          end;
          wbazie[i+1]:=giera;
          inc(liczbagier);
          nowagra:=true
     end;
end;

function usungre(nr:integer):boolean;
var
   i:integer;
begin
     if (nr<0) or (nr>liczbagier-1) then
     usungre:=false
     else
     begin
          for I:=nr to liczbagier-2 do
          wbazie[i]:=wbazie[i+1];
          dec(liczbagier);
          usungre:=true;
     end;
end;
end.
0

ok juz wiem co było "nie tak" hah :D dziekuję osobie która starała się pomóc ;)

0
tdk napisał(a)

a le gdy wyłącze program i włacze na nowo, program nie czyta nic(bo nic nie zapisał).

o ile dobrze wyczytałem z kodu, to do zapisu utworzona zostala procedura zapiszgry a problem tkwi w tym, że nigdzie jej nie wywołujesz.

przemyśl też czy nie warto zmienić struktury programu. aktualnie procedury menu0 menu1 menu2 menu3 wywoluja sie wzajemnie, co w końcu doprowadzi do błędu 'stack overflow'

1 użytkowników online, w tym zalogowanych: 0, gości: 1