الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال حول طريقة الحفظ باستخدام التعليمة Stream ؟

مغلق
بدأه Fadi-l في 24 يناير 2004 · 8 رد · 776 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف يمكن حفظ محتويات الكائن Listbox في ملف Stream مع إمكانية إعادة فتح الملف المحفوظ .

وشكرا لكم .

- طريق الألف ميل يبدأ بخطوة -

- ألعاب من تصميمي:

المنقذ

/index.ph...st&id=91370

الأربع تربح

/index.ph...st&id=91369

المتاهة

/index.ph...st&id=91374

#2

و عليكم السلام

تفضل هذا الكود والملف المرفق كلاهما يتكلم عن نفسه

 

var
  Form1: TForm1;
  MSt:TMemoryStream;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 MSt:=TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
MSt.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 MSt.Position:=0;
ListBox1.Items.SaveToStream(MSt);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MSt.Position:=0;
ListBox2.Items.LoadFromStream(MSt);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
MSt.SaveToFile('MyStreamFile.txt');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
MSt.LoadFromFile('MyStreamFile.txt');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
ListBox1.Items.SaveToFile('MyListBoxFile.txt');
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
ListBox2.Items.LoadFromFile('MyListBoxFile.txt');
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
 ListBox1.Items.Add(Edit1.text)
end;

end.
#3

عفوا تجد المثال المرفق في الرابط التالي

مثال ال Stream

#4

أخي محمدMr شكرا لك على المساعدة ولكن لا أظن أن هذه هي الطريقة الصحيحة لأن الملف المحفوظ من نوع ( txt ) وهو عادة يكون من نوع ( dat ) بالإضافة إلى أن حجم الملف المحفوظ بواسطة الـ Stream ممثال لحجم ملف الـ txt العادي على كل حال لقد وجدت كود يقوم بعملية الـ Stream ولكن المشكلة أنه يحفظ نص واحد فقط داخل الملف وما أريده هو حفظ عدة نصوص في ملف واحد

مثال : هناك ثلاثة كائنات من الـ Listbox كل واحد فيه كتابة غير الآخر أريد أن أحفظهم جميعا في ملف واحد مع إمكانية إعادة فتح الملف المحفوظ

ملاحظة :

الكود الذي وجدته يقوم بعملية الحفظ والضغط معا .

uses 
ZLib; 

{ Compress a stream } 

procedure CompressStream(inpStream, outStream: TStream); 
var 
InpBuf, OutBuf: Pointer; 
InpBytes, OutBytes: Integer; 
begin 
InpBuf := nil; 
OutBuf := nil; 
try 
GetMem(InpBuf, inpStream.Size); 
inpStream.Position := 0; 
InpBytes := inpStream.Read(InpBuf^, inpStream.Size); 
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes); 
outStream.Write(OutBuf^, OutBytes); 
finally 
if InpBuf <> nil then FreeMem(InpBuf); 
if OutBuf <> nil then FreeMem(OutBuf); 
end; 
end; 


{ Decompress a stream } 
procedure DecompressStream(inpStream, outStream: TStream); 
var 
InpBuf, OutBuf: Pointer; 
OutBytes, sz: Integer; 
begin 
InpBuf := nil; 
OutBuf := nil; 
sz := inpStream.Size - inpStream.Position; 
if sz > 0 then 
try 
GetMem(InpBuf, sz); 
inpStream.Read(InpBuf^, sz); 
DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes); 
outStream.Write(OutBuf^, OutBytes); 
finally 
if InpBuf <> nil then FreeMem(InpBuf); 
if OutBuf <> nil then FreeMem(OutBuf); 
end; 
outStream.Position := 0; 
end; 

{-------------------------}

procedure TForm1.Button1Click(Sender: TObject); 
var 
ms1, ms2: TMemoryStream; 
begin 
ms1 := TMemoryStream.Create; 
try 
ms2 := TMemoryStream.Create; 
try 
RichEdit1.Lines.SaveToStream(ms1); 
CompressStream(ms1, ms2); 
ShowMessage(Format('Stream Compression Rate: %d %%', 
[round(100 / ms1.Size * ms2.Size)])); 
ms2.SaveToFile('C:\ms2.dat'); 
finally 
ms1.Free; 
end; 
finally 
ms2.Free; 
end; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
ms1, ms2: TMemoryStream; 
begin 
ms1 := TMemoryStream.Create; 
try 
ms2 := TMemoryStream.Create; 
try 
ms1.LoadFromFile('C:\ms2.dat'); 
DecompressStream(ms1, ms2); 
RichEdit1.Lines.LoadFromStream(ms2); 
finally 
ms1.Free; 
end; 
finally 
ms2.Free; 
end; 
end;

- طريق الألف ميل يبدأ بخطوة -

- ألعاب من تصميمي:

المنقذ

/index.ph...st&id=91370

الأربع تربح

/index.ph...st&id=91369

المتاهة

/index.ph...st&id=91374

#5

يا اخ فادي الطريقه صحيحه ال listBox بياناته txt عادي اما اذا اردت تخزين البيانات في ملف غير نصي مثلا DAT فهنا ك عدة طرق مثلا ( استخدام قواعد البيانات و هي موجوده في الدلفي ) اما اذا اردت ضغط البيانات او تشفيرها ( ممكن تستخدم CompressStream و غيرها ) فلا بد ان يكون سؤالك واضح ! و شكرا

#6

أخي محمد :

أولا - لايوجد علاقة بين بيانات الـ ListBox و التعليمة Stream

ثانيا - التعليمة Stream تغنيك عن استخدام قواعد البيانات ( DataBase ) لأن بواسطتها يمكنك أن تحفظ مجموعة من النصوص ومجموعه من الصور في ملف واحد وهو حصرا غير اللاحقة txt بمعنى آخر يمكنك حفظ محتويات جميع الكائنات ( listbox1 + listbox2 + ....... ) بملف واحد في لاحقة عادة تكون ( dat ) مع إمكانية إعادة كل نص إلى مكانه عند عملية إعادة تحميل الملف المحفوظ

وبالمناسبة عندي كائنات تقوم بالعميلة السابقة ولكن المشكلة أنها تعمل مع الإصدارات القديمة للديلفي ولا تعمل مع الديلفي 7 .

أرجو أن تكون قد اتضحت مهمة التعليمة Stream .

- طريق الألف ميل يبدأ بخطوة -

- ألعاب من تصميمي:

المنقذ

/index.ph...st&id=91370

الأربع تربح

/index.ph...st&id=91369

المتاهة

/index.ph...st&id=91374

#7

يا اخ فادي انت تحتاج مراجعة ال steram وايضا ال ListBox و كيف تم بنائهم

ال ListBos طريقة حفظ بياناتها في ذاكرة الجهاز علي شكل تكست عادي يعني نصوص وانا هنا حبيت اوضح لك طريقة من طرق التخزين البيانات حسب ما طلبت ومضوعنا ما يتكلم عن العلاقه بين ال steam و ال ListBox ولا حتي عن اوجه الشبه بينهما !!!! ويا ليت تراجع سؤالك في البداية وايش احتمالات الاجابات عليه !!!

#8

يا أخي في سؤالي ذكرت الحفظ من الـ ListBox على سبيل المثال فقط

وأما عن إحتمالات الإجابة على سؤالي فأحدها مثل الكود الذي وجدته والذي قد وضعته مسبقا حيث بكل بساطة يمكن تغير الكائن بدل من RichEdit إلى ListBox ليحفظ محتوياتها في ملف خاص باستخدام التعليمة Stream .

على كل شكرا لك أخي العزيز على المساعدة .

- طريق الألف ميل يبدأ بخطوة -

- ألعاب من تصميمي:

المنقذ

/index.ph...st&id=91370

الأربع تربح

/index.ph...st&id=91369

المتاهة

/index.ph...st&id=91374

#9

أخي فادي: ربما يمكنك أن تعرف ملفا من نمط المعطيات الذي تريد استخدامه أي

var f:file of tlistbox

وهكذا يمكنك حفظ الكائن المطلوب كاملاً في الملف ثم يمكنك استرجاعه كما هو من الملف لاحقاً يمكنك أن تضع اللاحقة التي تريد أعتقد أن هذه الطريقة تفيد في التشفير لكنها طبعاً لن تفيد في الضغط... طبعاً حجم الملف سيكون أكبر من النص داخل القائمة لأننا نحفظ القائمة كاملةً داخل الملف بكل خصائصها كما هي في الذاكرة وقت التنفيذ (إذا لم تكن على علم مسبق بالتعامل مع الملفات الثنائية يمكنني أن أوضح أكثر)

هذا الموضوع مغلق.

مواضيع مشابهة