Odczyt z pliku

0

Mam taki problem. Chcę odczytać rekord z pliku, jednak podczas każdej próby wyskakuje mi access violation. Poniżej zamieszczam definicję rekordu i kod procedury wczytywania.

 type
      TQuest = record
        Nazwa : String[50];
        Tipsy : TStrings;
        Tresc : TStrings;
        Cmd : TStrings;
        WinWar : TStrings;
      end;
         TQuestFile = file of TQuest;

var
Quest : TQuest;
plik : TQuestFile;
begin
  if OpenDialog.Execute then begin
    AssignFile(plik,OpenDialog.FileName);
    if FileExists(OpenDialog.FileName) then begin
      Reset(plik);
      try
        read(plik,Quest);
      finally
        CloseFile(plik);
      end;
        NazwaEdit.Text := Quest.Nazwa;
        MemoTipsy.Lines := Quest.Tipsy;
        MemoTresc.Lines := Quest.Tresc;
        ListCmd.Items := Quest.Cmd;
        ListWar.Items := Quest.WinWar;
    end;
  end;
end;

Czy ktoś byłby w stanie mi pomóc z tym problemem?

0

Odczyt obiektów z pliku w ten sposób chyba nie zadziała. Musiał byś zrobić coś a'la serializacja.

AV wyskakuje zapewne przy := Quest.Tipsy; ten obiekt nie jest utworzony. Nawet jeśli jakoś go zapisałeś do pliku to wskazuje on na jakiś losowy obszar pamięci.

Kiedyś miałem potrzebę zapisu stringów o różnej długości, to wykombinowałem prostą metodę zapisu:

IDENTYFIKATOR;DŁUGOŚĆ_STRINGA;STRING;IDENTYFIKATOR;DŁUGOŚĆ_STRINGA;STRING;...

Chociaż ja tam chyba nie miałem enterów ....

b

0

Właśnie o entery chodzi.. Eh.. A może zna ktoś jakikolwiek sposób żeby te wszystkie TStrings upchać do jednego pliku a potem odczytać? Chodzi o mi o jeden plik, bo 5 osobnych to żaden problem, ale staram się tego uniknąć

0

No ale z enterami też by było, tylko trzeba by odczytywać zdeko inaczej, procedurami do których się podaje ile bajtów zaczytać. Zresztą zwykłymi też by poszło. Czytasz cały plik do String'a a potem parsujesz wedle mojej postaci. Czyli czytasz ze stringa (Copy + Delete + Pos) identyfikator, potem długość, a potem właściwego string'a. Pamiętaj tylko przy zapisie że enter to dwa bajty (zazwyczaj).

b

0

Ok, dzięki wielkie :) Spróbuję.
Jeśli ktoś jeszcze miałby jakiś pomysł to byłbym wdzięczny

@Edit problem rozwiązałem sposobem podobnym do podanego przez B0bika. Dzięki :)

@Edit2 Kumpel wsparł w potrzebie i oto prezentuję (dla potomnych) rozwiązanie problemu:

type
   TQuest = record
    Nazwa : String[50];
    Tipsy : TStrings;
    Tresc : TStrings;
    Cmd : TStrings;
    WinWar : TStrings;
   end;
     TQuestFile = file of TQuest;


procedure odczyt;
var
Quest : TQuest;
plik : TQuestFile;
begin
  if OpenDialog.Execute then begin
    AssignFile(plik,OpenDialog.FileName);
    if FileExists(OpenDialog.FileName) then begin
      Reset(plik);
      try
        read(plik,Quest);
      finally
        CloseFile(plik);
      end;
        NazwaEdit.Text := Quest.Nazwa;
        MemoTipsy.Lines.Text := Quest.Tipsy;
        MemoTresc.Lines.Text := Quest.Tresc;
        TStrings(ListCmd.Items).Text := Quest.Cmd;
        TStrings(ListWar.Items).Text := Quest.WinWar;
    end;
  end;
end;
procedure zapis;
var
Quest : TQuest;
plik : TQuestFile;
begin
  SaveDialog.Execute;
  AssignFile(plik,SaveDialog.FileName);
      ReWrite(plik);
       Quest.Nazwa :=  NazwaEdit.Text;
        Quest.Tipsy := MemoTipsy.Lines.Text;
        Quest.Tresc := MemoTresc.Lines.Text;
        Quest.Cmd :=   TStrings(ListCmd.Items).Text;
        Quest.WinWar :=  TStrings(ListWar.Items).Text;
      try
        write(plik,Quest);
      finally
        CloseFile(plik);
      end;
end;

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