Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.15;
Скачать: CL | DM;

Вниз

Потоки и глюки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
1-47487
nimble
2002-07-04 07:20
2002.07.15
Dynamic Array


3-47213
Serg2000
2002-06-19 17:00
2002.07.15
ElTreeView


1-47433
Zombie
2002-07-03 09:28
2002.07.15
Как работать с TExcelWorkbook?


1-47592
kosyak
2002-06-27 11:00
2002.07.15
Как узнать координаты активной ячейки?


3-47084
Ord3f8h
2002-06-18 14:37
2002.07.15
Посоветуйте как лучше организовать клиент-серверное приложение