ورود

View Full Version : دخیره عناصر روی یه panel در فایل



iamehsan56
یک شنبه 19 مهر 1388, 16:11 عصر
سلام
من از کد زیر واسه ذخیره کردن یه فرم تو فایل استفاده می کنم



procedure TMain.SaveDFMClick(Sender: TObject);
var
Str1 : TFileStream;
begin
if Savegdlg.Execute then
begin

Str1 := TFileStream.Create (saveGDlg.FileName+'.grf',fmOpenWrite or fmCreate);
try

Str1.WriteComponentRes ( outfrom.ClassName, outfrom);
finally
Str1.Free;

end;
end;
end;



و از کد زیر واسه لود کردن فایل توی یه فرم استفاده می کنم



procedure TMain.browse2Click(Sender: TObject);
var
Str1: TFileStream;
TempForm1: TOutFrom;
i:integer;
begin
if openGfile.Execute then
begin
Str1 := TFileStream.Create (openGfile.FileName, fmOpenRead);
try


TempForm1 := TOutFrom.Create (Application);
Str1.ReadComponentRes (TempForm1);
outfrom.Free;
outfrom := TempForm1;
outfrom.Show;

finally
Str1.Free;
end;
end;
end;



حالا می خوام به جای این که کل فرم رو ذخیره و بازیابی کنم ، همه عناصر روی یه panel رو که روی فرم قرار داره ذخیره و بازیابی کنم .
form رو تو کدای بالا به panel تغییر دادم . اما نشد .
در واقع می خوا م یه بخشی از کنترلهایی که رو فرم قرار گرفته رو ذخیره کنم . حالا مثلا اونارو روی یه panel قرار می دم و ذخیره می کنم (writecomponentREs) . اما چیزی که ذخیره می شه فقط خود panel هستش .

نظر شما چیه ؟
لطفا کمک کنید. کمک
خود برنامه رو هم ضمیمه کردم

vcldeveloper
دوشنبه 20 مهر 1388, 06:44 صبح
از متدهای ReadComponent و WriteComponent مربوط به Stream استفاده کنید. اگر میخواید داده ها بصورت متنی ذخیره بشند، نه باینری، می تونید از دو تابع ObjectBinaryToText و ObjectTextToBinary برای تبدیل اطلاعات کامپوننت موجود در Stream به Text و برعکس استفاده کنید.

iamehsan56
پنج شنبه 30 مهر 1388, 08:26 صبح
آقای کشاورز منظور من ذخیره کل عناصر روی panel به شکل یکجاست نه این که با یه حلقه کل اونارو دونه دونه بخونم و ذخیره کنم
راه دیگه ای نیست .چون من کلی عنصر دارم که روی یه panel هست و می خوام سریع این کار انجام بشه . شاید مثلا 1000 تا عنصر باشه . که وقت زادی می گیره .
لطفا راهنمایی بفرمایید

vcldeveloper
پنج شنبه 30 مهر 1388, 09:32 صبح
آقای کشاورز منظور من ذخیره کل عناصر روی panel به شکل یکجاست نه این که با یه حلقه کل اونارو دونه دونه بخونم و ذخیره کنم
لازم نیست برای همه آنها در داخل حلقه این کار را بکنید، Owner یک کامپوننت وظیفه stream کردن کل کامپوننت های متعلق به خودش را برعهده داره؛ برای همین هم ذخیره فرم موجب ذخیره کل کامپوننت های موجود در آن در داخل فایل DFM میشه. شما می تونید کل اون فرم را ذخیره کنید، یا آن Panel را در داخل یک Frame قرار بدید، و Frame را به این طریق ذخیره کنید، یا Owner تمام آن کامپوننت ها را به Panel مربوطه تغییر بدید.