Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизПотоки и глюки Найти похожие ветки
← →
Deadlock (2002-06-19 03:35) [0]У меня проблемы с записью TStringsList в поток.Вот что я делаю:
Var
cm : TStringList;
Begin
cm := TStringList.Create;
End;
////// Save ///////
Var
St : TMemoryStream;
Begin
st := TMemoryStream.Create;
st.Save(..тут запись целых чисел, структур.); это работает!
cm.SavetoStream(St); запись без ошибок
st.SaveToFile("test");
st.free;
End;
////// Load ///////
Var
St : TMemoryStream;
Begin
st := TMemoryStream.Create;
st.LoadFromFile("test");
st.Read(..тут чтение целых чисел, структур.); это работает!
cm.LoadFromStream(St);
а вот тут фигня - читает до конца потока и все !!!!
А у меня там еще всего разного записано и его надо дочитать!!
st.free;
End;
Кто глючит: поток или список?
П.С. И за одно подскажите, пожайлуста, как сделать что-то типа TCompressedMemoryStream?
Хавает места много и каждый ламер сможет прочитать что у меня там лежит!
← →
MBo (2002-06-19 06:30) [1]при сохранении Persistent объектов в Stream, если в поток пишется еще что-нибудь, следует создать вспомогательный поток, сохранить в него объект, в главный записать длину вспомогательного, потом CopyFrom из вспомогательного (его Position в 0!). Чтение - читаем длину блока, копируем столько байт во вспомогательный, загружаем объект из вспомогательного.
Причины- см., например, Classes.pas TStrings.SaveToStream и LoadFromStream
← →
Deadlock (2002-06-23 03:11) [2]2 MBo:
Внял твоему совету и сделал две процедурки (запись/сохранение) TStringList через поток:
Procedure Save2st(R: TMemoryStream; T: TStringList);
Var
s : TMemoryStream;
i : LongInt;
Begin
s := TMemoryStream.Create;
T.SaveToStream(s);
i := S.Position;
r.write(i, Sizeof(i));
s.Position := 0;
R.CopyFrom(s, i);
S.free;
End;
Procedure Load2ST(R: TMemoryStream; Var T: TStringList);
Var
s : TMemoryStream;
i : LongInt;
Begin
s := TMemoryStream.Create;
R.Read(i, Sizeof(i));
S.CopyFrom(R, i);
T.LoadFromStream(s);
S.free;
End;
R - это мой рабочий поток. Но вот все равно объект не загружаеться как надо, т.е. ваще не загружаеться. Нервов уже на него нет! Застрял на мелочи :-( Объясни в чем я прокололся.
← →
MBo (2002-06-23 09:05) [3]1 метод
procedure TForm1.Button1Click(Sender: TObject);
var sl1:tstringlist;
FS:TFileStream;
MS:TMemoryStream;
i,j:integer;
d:double;
begin
sl1:=tstringlist.create;
sl1.assign(memo1.lines);
FS:=TFileStream.Create("e:\a.dat",fmCreate);
MS:=TMemoryStream.Create;
j:=5;
d:=3.14;
FS.Write(j,sizeof(Integer));
SL1.SaveToStream(MS);
MS.Position:=0;
i:=MS.Size;
FS.Write(i,sizeof(Integer));
FS.CopyFrom(MS,i);
FS.Write(d,SizeOf(d));
SL1.Free;
FS.Free;
MS.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var sl1:tstringlist;
FS:TFileStream;
MS:TMemoryStream;
i,j:integer;
d:double;
begin
SL1:=tstringlist.create;
FS:=TFileStream.Create("e:\a.dat",fmOpenRead);
MS:=TMemoryStream.Create;
FS.Read(j,sizeof(Integer));
FS.Read(i,sizeof(Integer));
MS.CopyFrom(FS,i);
SL1.LoadFromStream(MS);
FS.Read(d,SizeOf(d));
memo1.clear;
memo1.lines.add(inttostr(j));
memo1.lines.AddStrings(SL1);
memo1.lines.add(floattostr(d));
Sl1.Free;
FS.Free;
MS.Free;
end;
2 метод, удобен при большом количестве сохраняемых объектов
procedure TForm1.Button3Click(Sender: TObject);
var WR:TWriter;
FS:TFileStream;
SL:TStringList;
j:integer;
d:double;
begin
FS:=TFileStream.Create("e:\b.dat",fmCreate);
WR:=TWriter.Create(FS,512);
SL:=TStringList.Create;
SL.Assign(Memo1.Lines);
j:=5;
d:=3.14;
WR.WriteInteger(j);
WR.WriteString(SL.Text);
WR.WriteFloat(d);
SL.Free;
WR.Free;
FS.Free;
end;
procedure TForm1.Button4Click(Sender: TObject);
var RD:TReader;
FS:TFileStream;
SL:TStringList;
j:integer;
d:double;
begin
FS:=TFileStream.Create("e:\b.dat",fmOpenRead);
RD:=TReader.Create(FS,512);
SL:=TStringList.Create;
j:=RD.ReadInteger;
SL.Text:=RD.ReadString;
d:=RD.ReadFloat;
Memo1.Clear;
Memo1.Lines.Assign(SL);
memo1.lines.add(inttostr(j));
memo1.lines.add(floattostr(d));
SL.Free;
RD.Free;
FS.Free;
end;
← →
Deadlock (2002-06-28 03:49) [4]2MBo:
Совсем задолбали меня эти потоки - не выходит! Замучался....
Если конкретнее не могу с твоими примерами приколбасить запись/чтение битмапа и стринглиста. Где-то что-то да не заработает, со злости уже кусок монитора отгрыз! Помоги, на тебя одна НАДЕЖДА!!!!
← →
MBo (2002-06-28 07:18) [5]procedure TForm1.Button1Click(Sender: TObject);
var sl1:tstringlist;
FS:TFileStream;
MS:TMemoryStream;
i:integer;
bitmap:TBitmap;
begin
sl1:=tstringlist.create;
bitmap:=TBitmap.Create;
bitmap.loadfromfile("e:\4.bmp");
sl1.assign(memo1.lines);
FS:=TFileStream.Create("e:\a.dat",fmCreate);
MS:=TMemoryStream.Create;
SL1.SaveToStream(MS);
MS.Position:=0;
i:=MS.Size;
FS.Write(i,sizeof(Integer));
FS.CopyFrom(MS,i);
MS.Clear;
bitmap.SaveToStream(MS);
MS.Position:=0;
i:=MS.Size;
FS.Write(i,sizeof(Integer));
FS.CopyFrom(MS,i);
bitmap.free;
SL1.Free;
FS.Free;
MS.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var sl1:tstringlist;
FS:TFileStream;
MS:TMemoryStream;
i:integer;
bitmap:TBitmap;
begin
SL1:=tstringlist.create;
FS:=TFileStream.Create("e:\a.dat",fmOpenRead);
MS:=TMemoryStream.Create;
bitmap:=TBitmap.Create;
FS.Read(i,sizeof(Integer));
MS.CopyFrom(FS,i);
Ms.Position:=0;
SL1.LoadFromStream(MS);
MS.Clear;
FS.Read(i,sizeof(Integer));
MS.CopyFrom(FS,i);
Ms.Position:=0;
bitmap.LoadFromStream(MS);
memo1.clear;
memo1.lines.Assign(SL1);
image1.picture.assign(bitmap);
bitmap.free;
Sl1.Free;
FS.Free;
MS.Free;
end;
← →
Deadlock (2002-06-30 03:14) [6]Тут уже кланяюсь - все рулит :)
Спасибо!
← →
Deadlock (2002-06-30 06:59) [7]Да, совсем забыл когда сохраняешь длину объекта, то запись типа
FS.Write(i,sizeof(Integer)) не совсем уместна, т.к. объект TBitMap можеть быть больше 32768 байт :)
← →
MBo (2002-06-30 08:43) [8]MaxInt~2 миллиарда
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.019 c