TFileStream

0

Pomocy!!!
Nie znam sią na Stream'ach, czytałem, spróbowałem i nie wiem co jest nie tak.
Jednym Buttonem zapisuję, drugim czytam. I jest ok jak najpierw zapiszę, to można coś tam robić na Formie i w każdej chwili plik odczytać. Jak chcę od razu odczytać zapisany wcześniej plik to wywala mi błąd i znowu zapisz i później jest ok

type
    Trec = record
           color:TColor;
           name:string;
           end;

    Ttab = array of array of Trec;

    MTrecord =^Trecord;
    Trecord  = record
               nazwa:string;
               tab:Ttab;
               end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
   k,w:Integer;
   rec1:MTrecord;
   f_s:TFileStream;
begin
   rec1:=AllocMem(SizeOf(Trecord));
   with rec1^ do
   begin
      nazwa:='1234567890123456789012345678901234567890123456789';
      SetLength(tab,202);
      for k:=0 to 200 do
      begin
         for w:=0 to 200 do
         begin
            SetLength(tab[k],202);
            if (w=50)and(k=50) then
            begin
               tab[k][w].name:='proba';
               tab[k][w].color:=clGreen;
            end
            else
            begin
               tab[k][w].name:='ble ble';
               tab[k][w].color:=clRed;
            end;
         end;
      end;
   end;

   f_s:=TFileStream.Create('C:\\Windows\\Pulpit\\plik.str', fmCreate);
   f_s.WriteBuffer(rec1^,SizeOf(Trecord));
   f_s.Free;

   FreeMem(rec1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   rec1:MTrecord;
   f_s:TFileStream;
begin
   rec1:=AllocMem(SizeOf(Trecord));
   f_s:= TFileStream.Create('C:\\Windows\\Pulpit\\plik.str',fmOpenRead);
   f_s.ReadBuffer(rec1^,SizeOf(Trecord));
   f_s.Free;

   Edit1.Text:=rec1^.tab[50][50].name;
   FreeMem(rec1);
end;
0

Nie ma pojecia , powinno dzialac. Nie wiem dokladnie jak jest z pozycjami w struminiach tuz po zainicjowaniu obiektu. Ja na wszelki wypadek zawsze daje position:=0; wiec moze sprobuj w procedure TForm1.Button2Click(Sender: TObject); dac po f_s:= TFileStream.Create('C:\Windows\Pulpit\plik.str',fmOpenRead); f_s.position:=0;. Nic innego nie przychodzi mi do glowy.

0

position nic nie dało, coś to jakieś dziwne, he he jak pojmę Stream'y, to pewnie będę wiedział o co chodzi... ale może mi ktoś podpowie dzisiaj?

0

Może napisz jaki to jest błąd i dokladnie w ktorym miejscu.

0

to dziwne ale jest tak że z wykorzystanie mplików txt śmiga ładnie :)

Może napisz jaki to jest błąd i dokladnie w ktorym miejscu.

pogwałcenie dostępu :D
AccessVolatine czy jakoś tak

to dziwne ale jest tak że z wykorzystanie mplików txt śmiga ładnie :)

a jeszcze jedno co zauważyłem.
w pliku który on tworzy jest zawsze inna wartość, a to trochę dziwne bo z kodu wynika jednoznacznie co powinno być w pliku... :-|

0

Ehh ten blad nie ma nic wspolnego ze strumieniami. po prostu sizeof(Trecord) jest tu zupelnie bez sensu jesli w rekordzie jest dlugi lancuch (string) . Do taich rzeczy msisz uzywac string[iles tam]

Albo wyodrebnic z rekordu lancuch i zapisac go odrebnie do strmienia uwzgledniajac jego dlugosc, tylko ze tę dlugosc musisz oczywiscie zapisac tez zeby potem cztajac wiedziec ile czytac.

0

Błąd leży w użyciu typu String, który jest jedynie wskaźnikiem do tekstu. Musisz użyć ShortString (z tym, że ograniczysz sobie długość do 255 znaków), String[ilość_znaków] (nie więcej, jak 255), lub włóż przed stringiem jego długość, po czym zapisuj do streamu twój_string[1].

0

No i przy odczycie najpierw zarezerwoj odpowiednia ilosc pamieci dla stringa jak rowniez dla tbalicy tab.

pozdro [cya] </ort>

0

Wielkie dzięki, ale jeszcze jest jeden szczegół. Stringi zmieniłem ale musiałem zamienić jeszcze tablicę dynamiczną a na tym mi szczególnie zależało. Może mi podpowiecie jak (jeżeli w ogóle to możliwe) zapisywać tablice dynamiczne?

0

Najpierw zapisujesz ilość elementów tej tablicy, potem każdy element tablicy z osobna. Przy odczycie, najpierw pobierasz ilośc elementów i robisz na tabnlicy setlength, a potem znowu pętla i odczyt elementu do tablicy.

0

Dziękuję [hurra]

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