[Delphi] Zapis całości Listview'a do strumienia i do pliku

0

Witam, chciałbym zapisać zawartość ListViewa do strumienia, próbowałem tak:

var
  S : TFileStream; 
[...]

procedure TForm1.Button8Click(Sender: TObject);
begin
  listview.Items.Item[0].SubItems.savetostream(s);
end;

ale przy wciśnięciu buttona wyskakuje mi "Acces violition at address 0041AEB3 in module 'Project1.exe'. Read of address 00000000."

Czy istnieje może jakiś sposób, by zapisać CAŁĄ zawartość listviewa w prostszy sposób?
Czytałem o tym w TUTAJ ale tam jest to strasznie zamotane, ja bym chciał po prostu zapisać wszystko w jedno miejsce, a potem to odczytać.

0

jak dla mnie to zabrakło utworzenia strumienia np:
s:=TFileStream.Create(0)

0

wyskakuje "StreamWriteError".

0
vir2000 napisał(a)

jak dla mnie to zabrakło utworzenia strumienia np:
s:=TFileStream.Create(0)

jak dla mnie zabrakło trochę myślenia (zapisujesz do czego?, odczytujesz z czego?):
http://pl.wikibooks.org/wiki/Delphi/TFileStream,_czyli_zabawa_na_plikach

constructor Create(const FileName: string; Mode: Word); overload;
constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload;
0

teraz u mnie wygląda to tak:

  type MyRecord = record
     item : TListItems;
     end;

var
  Form1: TForm1;
  S : TFileStream;
   Buffer: array of byte;
   REC :myrecord;


implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
//ODCZYT
   if not FileExists('dane.txt') then showmessage('plik niedostępny');
   if not FileExists('dane.txt') then Exit;

    S := TFileStream.Create('dane.txt', fmCreate); //otworz do zapisu
    S.Read(Rec,SizeOf(Rec));
    listview.Items:=rec.item;
    listview.Refresh;
    S.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//ZAPIS
  S := TFileStream.Create('dane.txt', fmCreate); //otworz do zapisu
  rec.item:=listview.Items;
  S.Write(Rec,SizeOf(Rec));
  s .Free;
end;

I efekt jest taki, że po kliknięciu na buttona2 nie pokazuje już żadnych errorów, ale po kliknięciu na B1 nic się kompletnie nie dzieje, a jeśli włącze program, i jako pierwszy wcisnę B1 to wyskakuje "Cannot assign a nil to TListItems" ... no domyślam się, że w tym momencie coś może być jednak z zapisywaniem tego strumienia i rekordów ...

0

zrobiłem sobię próbę ze zwykłym stringiem, który miał się zapisywać też w strumieniu, ale wychodzi na to, że się nie zapisuje ...

mam takie pytanie inne, skoro jest
S := TFileStream.Create('C:\plik.txt', fmOpenRead); //otworz tylko do odczytu

to czy istnieje coś takiego łopatologicznego w drugą stronę, a'la coś jak ta:
S := TFileStream.Save('C:\plik.txt', fm ... );

0

jak możesz zapisać coś do pliku skoro przy otwieraniu nadajesz prawa "tylko do odczytu"

przy zapisie musisz nadać prawa do zapisu

S := TFileStream.Create('C:\\plik.txt', fmOpenWrite);

a resztę masz tu :

http://4programmers.net/Delphi/Artyku%C5%82y/Strumienie

0

nie możesz sobie ot-tak wrzucić obiektu do pliku. nie da się. obiekt składa się z masy wskaźników, których nie da się serializować (to znaczy da się, ale z bardzo bardzo dużymi problemami).
stringa też nie możesz w zwykły sposób zapisać, bo to wskaźnik. sprawdź sobie sizeof, wyjdzie że string ma 4B niezależnie od długości napisu.

0
ŁF napisał(a)

sprawdź sobie sizeof, wyjdzie że string ma 4B niezależnie od długości napisu.
Przynajmniej do niedawana LongString w Delphi to jedynie wskaźnik na pierwszy znak, rozmiar łańcucha jest zapisany zaraz przed pierwszym znakiem.

// nie rozumiem Twojej wypowiedzi - zgadzasz się czy nie, bo napisałeś to samo co ja tylko innymi słowami, ale w sposób jakbyś negował to co sam napisałem - Ł

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