Modul crt powoduje problem z wypisaniem danych.

0

Mam problem który polega błędnym wypisaniu danych z pliku rekordow. Moj fragment programu polega na zapisaniu rekordów do pliku, a nastepnie na ich ladnym wypisaniu. Jednak gdy na początku programu dopisze uses crt to pojawiają sie problemu z ktorymi nie umiem sobie poradzic:( Znacie moze jakiś sposob na wyczyszczenie ekrany bez korzystania z modulu crt, lub moze pomozecie mi rozwiazac moj problem? Problem polega na tym ze przy korzystaniu z czyszczenia ekranu wyswietla mi tylko ostatnie rekordy "ktore zmiescily sie na ekranie" + dwa bonusy.

Czy da sie wyczyścić ekran nie korzystajac z ClrScr??

moj problem postaram sie zilustrowac;

bez korzystania z crt wypisuje mi wszystkie wprowadzone dane:
http://imageshack.us/photo/my-images/862/beztytuuajg.png/

z dopisaniem uses crt po 3 uruchomieniu
http://imageshack.us/photo/my-images/716/beztytuubtq.png/
dodam ze nie dopisalem clrscr

program project1;

uses crt;

const

  logintxt = 'D:\login.txt';

type

  DaneLogowania = record
    Login: string[20];
    Haslo: string[20];
    upr: Integer;
    nrucznia: Integer;
  end;

var
  uprawnienie: Integer;
  numerucznia, i: Integer;

procedure sprawdzczyjestlogin(sprlogin: string; var istnieje: Boolean);
var
  pliklogin: file of danelogowania;
  SprawdzanyRekord: DaneLogowania;
begin
  istnieje := false;
  Assign(pliklogin, logintxt);
  Reset(pliklogin);
  while not Eof(pliklogin) do
  begin
    Read(pliklogin, SprawdzanyRekord);
    if SprawdzanyRekord.Login = sprlogin then
    begin
      istnieje := true;
      Writeln('podany login istnieje, podaj inny');
      Break;
    end;
  end;
  Close(pliklogin);
end;

procedure dodanieuprawnienia(IdUcznia: Integer);
var
  pliklogin: file of danelogowania;
  LogDoDodania: danelogowania;
  uprawnieniedododania: string;
  istnieje: Boolean;
  znak: Char;
begin
  repeat
    Writeln('podaj login do zapisu');
    Readln(LogDoDodania.login);
    sprawdzczyjestlogin(LogDoDodania.login, istnieje);
  until istnieje = false;
  Writeln('podaj haslo do zapisu');
  Readln(LogDoDodania.Haslo);
  repeat
    Writeln('podaj uprawnienie 1-dla nauczyciela, 2-dla rodzica');
    Readln(znak);
    uprawnieniedododania := znak;

  until (uprawnieniedododania = '1') or (uprawnieniedododania = '2');
  Val(uprawnieniedododania, LogDoDodania.upr);
  if uprawnieniedododania = '2' then
  begin
    LogDoDodania.Nrucznia := IdUcznia;
  end
  else
    LogDoDodania.Nrucznia := 0;
  Assign(pliklogin, logintxt);
  Reset(pliklogin);
  Seek(pliklogin, FileSize(pliklogin));
  Write(pliklogin, LogDoDodania);
  Close(pliklogin);
  Writeln('login i haslo zostaly zapisane, wcisnij enter');
  Readln;
end;

procedure wypiszloginy;
var
  pliklogin: file of danelogowania;
  WypisywanyRekord: danelogowania;
begin
  Assign(pliklogin, logintxt);
  Reset(pliklogin);
  while not Eof(pliklogin) do
  begin
    Writeln;
    Read(pliklogin, WypisywanyRekord);
    Writeln(WypisywanyRekord.Login);
    Writeln(WypisywanyRekord.Haslo);
    Writeln(WypisywanyRekord.upr);
    Writeln(WypisywanyRekord.nrucznia);
  end;
  Close(pliklogin);
end;


begin

  //for i:=1 to 11 do
  //dodanieuprawnienia(i);

  wypiszloginy;

  Readln;
end.
0

Problem polega na tym ze przy korzystaniu z czyszczenia ekranu wyswietla mi tylko ostatnie rekordy "ktore zmiescily sie na ekranie" + dwa bonusy.
Nie rozumiem problemu. Obrazki nic nie dają, bo nie wiadomo co na nich jest a co powinno być.
Wyjaśnij dokładniej, co się dzieje.

Tak na oko w twoim kodzie nie ma nic, co miałoby inaczej się zachowywać z modułem CRT i bez. Napisz jakiego używasz kompilatora.

0

Kod bałaganiarski, dziwnie sformatowany z pustymi liniami co chwile (czyżby znowu parser zgłupiał chociaz linie są krótkie, zobacze jak mi się wklei). Wedle mnie kod powinien wyglądać tak jak poniżej. Sprawdzałem dla sześciu loginów i wszystkie pokazuje, bo coś ostatnio chyba Ty pisałeś, że wypisuje tylko pięć. Błąd na pewno nie polega na dodaniu modułu crt, tylko tego, że nie zapisywałeś prawidłowo numeru ucznia, w sumie w ogóle tego nie robileś, bo procedura Val była błędnie zapisana, a poza tym plik nie tworzył się kiedy go nie było na dysku, stąd nagłe wyjście z kodu. Poza tym do sprawdzania istnienia użytkownika powinno się zastosować tutaj funkcję, a nie procedurę z parametrem wyjściowym. A i pod Delphi 7 z modułem crt jaki znalazłem na swoim dysku też teraz wszystko działa. Poza tym polecam wypisywać zmienne i inne elementy kodu zaczynając z wielkich liter i plik z danymi nazwać raczej nie txt bo sugeruje to, że dane są zapisywane w czystym tekstcie, a tak nie jest. A i fajnie, że zaczynasz chyba naukę od konsoli, a nie od na przykład Delphi i VCL oraz bezmyślnego układania komponentów na formatce, ale ja się dziwie, że w dzisiejszych oienkowych czasach ludzie męczą się i robią w konsoli programy wymagające inrerakcji z użytkownikiem. Ja rozumiem zrobić coś na szybko co nie wiem będzie parsowało jakiś plik albo coś szyfrowało czy wykonywało jakieś operacje bez potrzeby ingerencji użytkownika, ale dla odpytywania o dane lepiej zrobić jakieś GUI. Chyba, że to staroświeccy nauczyciele zatrzymali się na czasach przed epoką "Bajtka" i ZX Spectrum, mając takie wymagania ;/

program project1;

{$MODE DELPHI}
{$APPTYPE CONSOLE}

uses
  crt;

const
  logintxt = 'D:\logins.dat';

type
  TDaneLogowania = record
    Login : string[20];
    Haslo : string[20];
    Upr : integer;
    NrUcznia : integer;
  end;

var
  KodBledu : integer;

function sprawdzczyjestlogin(sprlogin : string) : boolean;
var
  PlikLogin : file of TDaneLogowania;
  SprawdzanyRekord : TDaneLogowania;
begin
  ClrScr;
  Result := False;
  Assign(PlikLogin, logintxt);
{$I-}
  Reset(PlikLogin);
{$I+}
  if IOResult = 0 then
  begin
    while not Eof(PlikLogin) do
    begin
      Read(PlikLogin, SprawdzanyRekord);
      if SprawdzanyRekord.Login = sprlogin then
      begin
        Result := True;
        Writeln('podany login istnieje, podaj inny!');
        Break;
      end;
    end;
    Close(PlikLogin);
  end;
end;

procedure DodanieUprawnienia(IdUcznia : integer);
var
  istnieje : boolean;
  LogDoDodania : TDaneLogowania;
  uprawnieniedododania : string;
  PlikLogin : file of TDaneLogowania;
begin
  ClrScr;
  repeat
    Write('podaj login do zapisu: ');
    Readln(LogDoDodania.login);
    Istnieje := sprawdzczyjestlogin(LogDoDodania.login);
  until not Istnieje;
  Write('podaj haslo do zapisu: ');
  Readln(LogDoDodania.Haslo);
  repeat
    Write('podaj uprawnienie 1-dla nauczyciela, 2-dla rodzica: ');
    uprawnieniedododania := readkey;
  until (uprawnieniedododania = '1') or (uprawnieniedododania = '2');
  Val(uprawnieniedododania, LogDoDodania.Upr, KodBledu);
  if uprawnieniedododania = '2' then
  begin
    LogDoDodania.NrUcznia := IdUcznia;
  end
  else
  begin
    LogDoDodania.NrUcznia := 0;
  end;
  Assign(PlikLogin, logintxt);
{$I-}
  Reset(PlikLogin);
{$I+}
  if IOResult <> 0 then
  begin
    Rewrite(PlikLogin);
  end;
  Seek(PlikLogin, FileSize(PlikLogin));
  Write(PlikLogin, LogDoDodania);
  Close(PlikLogin);
  Writeln;
  Writeln('login i haslo zostaly zapisane, wcisnij dowolny klawisz');
  Readkey;
end;

procedure Wypiszloginy;
var
  WypisywanyRekord : TDaneLogowania;
  PlikLogin : file of TDaneLogowania;
begin
  Assign(PlikLogin, logintxt);
  Reset(PlikLogin);
  while not Eof(PlikLogin) do
  begin
    Read(PlikLogin, WypisywanyRekord);
    Writeln(WypisywanyRekord.Login);
    Writeln(WypisywanyRekord.Haslo);
    Writeln(WypisywanyRekord.Upr);
    Writeln(WypisywanyRekord.NrUcznia);
  end;
  Close(PlikLogin);
end;

begin
  ClrScr;
  DodanieUprawnienia(666);
  Wypiszloginy;
  Readln;
end.

EDIT: kod wstawił się ok, więc nie wiem skąd taka głupia moda na puste linijki co chwile, przecież to bardzo utrudnia czytanie kodu. A komunikaty dla nieistnenia pliku sobie już sam obsłuż po else od IOResult. A i post dotyczy podstaw według mnie więc przenoszę, tym razem otagując.

0

No to temat do usuniecia:D

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