PDA

View Full Version : درباره TMemoryStream



iamehsan56
شنبه 09 آبان 1388, 11:48 صبح
من یه برنامه نوشتم که محتویات یه فرم رو تو یه فایل با writecomponentRes می نویسه و بعدش می خوام همون فایل رو تو حافظه لود کنم و دوباره بنویسمش رو فرم
نحوه ذخیره ام تو فایل اینجوریه



procedure TForm1.Button7Click(Sender: TObject);
var
Str1 : TFileStream;
begin


Str1 := TFileStream.Create ('e:\my',fmOpenWrite or fmCreate);
try
Str1.WriteComponentRes( form2.ClassName, form2);
finally
Str1.Free;

end;

end;

و لود کردنم تو حافظه این جوری :



procedure TForm1.Button5Click(Sender: TObject);
var
stream: TMemoryStream;
TempForm1: Tform2;
begin

try

stream:= TMemoryStream.Create;
stream.LoadFromFile('e:\my');
stream.ReadComponentRes(TempForm1) ;
form2.Free;
form2 := TempForm1;
form2.Show;

finally

stream.Free;
end;

end;

اما موقع load کردن تو حافظه error می ده .http://www.barnamenevis.org/forum/attachment.php?attachmentid=39110&stc=1&d=1256978794

لطفا راهنمایی بفرمایید
ممنون
ممنون

Felony
شنبه 09 آبان 1388, 12:01 عصر
همین چند روز پیش هم یکی از دوستان تو همین مورد مشکل داشت و مشکلش رفع شد ، تاپیک های چند روز قبل رو یه نگاه بکن .

Mahmood_M
شنبه 09 آبان 1388, 12:23 عصر
اشتباه شما در قسمت اختصاص Form2 به TempForm1 هست ...
به صورت زیر مقدار دهی کنید :


procedure TForm1.BitBtn2Click(Sender: TObject);
var
stream: TMemoryStream;
TempForm1: Tform2;
begin
try
stream:= TMemoryStream.Create;
stream.LoadFromFile('e:\my');
TempForm1 := TForm2.Create(Application);
stream.ReadComponentRes(TempForm1);
TempForm1.Show;
finally
stream.Free;
end;
end;

بهتره بگید که هدفتون چیه ، شاید راه حل بهتری پیدا شد ...

موفق باشید ...

iamehsan56
شنبه 09 آبان 1388, 12:42 عصر
من می خوام تعداد زیادی فایل با حجم کم رو تو حافظه قرار بدم تا در وقت لازم به جای خوندن از فایل از توحافظه برداشتشون کنم .
در واقع اگه به این آدرس برید روند کاری که می خوام انجام بدم به طور کامل اونجا هست
http://www.barnamenevis.org/forum/showthread.php?t=185939
اونجا از راهنمایی های آقای کشاورز استفاده زیادی کردم
خوشحال و ممنون می شم از راهنمایی شما هم استفاده کنم
بازم ممنون

iamehsan56
شنبه 09 آبان 1388, 16:20 عصر
من می خوام مثلا 10 تا فایل رو تو حافظه قرار بدم . اینکارو اینجوری انجامش دادم
اول


public
{ Public declarations }
stream:array[1..10]of TMemoryStream;

بعد



for I := 1 to 10 do
begin
stream[i]:= TMemoryStream.Create;
stream[i].LoadFromFile('e:\my.dfm');


end;

و اونارو بر مبنای ایندکس stream تو فرم لود می کنم .





procedure TForm1.Button9Click(Sender: TObject);
var

TempForm1: Tform2;
i:integer;
begin


i:=strtoint(memNum.Text); //memNum.Text is index for stream
TempForm1 := tform2.Create (Application);


stream[i].ReadComponentRes(TempForm1) ;


form2.Free;
form2 := TempForm1;
form2.Show;




end;

من ایندکس رو اینجا از تو یه edit box می دم . وقتی ایندکس ها رو وارد می کنم از 1 تا 10 درست عمل می کنه . اما اگه دو بار یه ایندکس رو وارد کنم error می ده . یعنی اگه دو بار درخواست خوندن از stream[1 ] بکنم error زیر رو می ده
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39130&stc=1&d=1256995156

لطفا راهنمایی بفرمایید
با تشکر

Mahmood_M
شنبه 09 آبان 1388, 20:38 عصر
در پست قبلی هم اشاره کردم که نحوه ی لود کردن اطلاعات ذخیره شده غلط هست ، به فرم Temp نیازی نیست ، این طور که من متوجه شدم میخواید فرم 2 رو آزاد کرده و مقدار ذخیره شده رو درش قرار بدید و نمایشش بدید ، یه جورایی قصد Reset کردن فرم رو دارید ، در این صورت کد زیر کفایت میکنه :

procedure TForm1.Button9Click(Sender: TObject);
var
i:integer;
begin
i:=strtoint(memNum.Text); //memNum.Text is index for stream
form2.Free;
Form2 := TForm2.Create(Application);
stream[i].ReadComponentRes(Form2);
form2.Show;
end;

اطلاعات رو مستقیما در فرم 2 بریزید و نیازی به فرم Temp نیست ...

این هم نمونه ی تصحیح شده ( البته من چند تا از Unit هایی که استفاده کرده بودید رو نداشتم و مجبور شدم برای کامپایل پروژه اونها رو از Uses حذف کنم ، شما فقط قسمت مربوط به لود کردن فرم رو کپی کنید در پروژه ی اصلی )

لینک دانلود نمونه ی تصحیح شده (http://nabegheh.parsaspace.com/Examples/My_new_stream.rar)

موفق باشید ...

iamehsan56
یک شنبه 10 آبان 1388, 08:51 صبح
اطلاعات رو مستقیما در فرم 2 بریزید و نیازی به فرم Temp نیست ...


من هم همینکارو کردم . اما مشکل زیر کماکان باقیه


من ایندکس رو اینجا از تو یه edit box می دم . وقتی ایندکس ها رو وارد می کنم از 1 تا 10 درست عمل می کنه . اما اگه دو بار یه ایندکس رو وارد کنم error می ده . یعنی اگه دو بار درخواست خوندن از stream[1 ] بکنم error زیر رو می ده

و همون error هم می آد
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39130&stc=1&d=1256995156

لطفا راهنمایی بفرمایید

Mahmood_M
یک شنبه 10 آبان 1388, 13:00 عصر
ببخشید ، من هم هواسم به این جملتون نبود ...
وقتی از یک Stream می خونید ، اون به آخر Seek میشه ! باید اون رو به اولش بفرستید !
مثلا قبل از خوندن از " ;(Seek(0, soFromBeginning " یا " ;(Seek(0, 0 " استفاده کنید :
procedure TForm1.Button9Click(Sender: TObject);
var
i:integer;
begin
i := Strtoint(memNum.Text); //memNum.Text is index for stream
Form2.Free;
Form2 := TForm2.Create(Application);
stream[I].Seek(0, soFromBeginning);
stream[i].ReadComponentRes(Form2);
form2.Show;
end;

موفق باشید ...

iamehsan56
یک شنبه 10 آبان 1388, 13:42 عصر
من از position استفاده کردم درست شد
هنگام لود مجدد باید به ابتدا برگشت یعنی باید
stream.position:=0
قرار داد
یا می شه اینکارو کرد
" ;(Seek(0, soFromBeginning " یا " ;(Seek(0, 0 "

ممنون از راهنمایی ها
ممنون