السلام عليكم
كيف يمكن حفظ محتويات الكائن Listbox في ملف Stream مع إمكانية إعادة فتح الملف المحفوظ .
وشكرا لكم .
السلام عليكم
كيف يمكن حفظ محتويات الكائن Listbox في ملف Stream مع إمكانية إعادة فتح الملف المحفوظ .
وشكرا لكم .
- طريق الألف ميل يبدأ بخطوة -
- ألعاب من تصميمي:
المنقذ
الأربع تربح
المتاهة
و عليكم السلام
تفضل هذا الكود والملف المرفق كلاهما يتكلم عن نفسه
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.عفوا تجد المثال المرفق في الرابط التالي
أخي محمد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;- طريق الألف ميل يبدأ بخطوة -
- ألعاب من تصميمي:
المنقذ
الأربع تربح
المتاهة
يا اخ فادي الطريقه صحيحه ال listBox بياناته txt عادي اما اذا اردت تخزين البيانات في ملف غير نصي مثلا DAT فهنا ك عدة طرق مثلا ( استخدام قواعد البيانات و هي موجوده في الدلفي ) اما اذا اردت ضغط البيانات او تشفيرها ( ممكن تستخدم CompressStream و غيرها ) فلا بد ان يكون سؤالك واضح ! و شكرا
أخي محمد :
أولا - لايوجد علاقة بين بيانات الـ ListBox و التعليمة Stream
ثانيا - التعليمة Stream تغنيك عن استخدام قواعد البيانات ( DataBase ) لأن بواسطتها يمكنك أن تحفظ مجموعة من النصوص ومجموعه من الصور في ملف واحد وهو حصرا غير اللاحقة txt بمعنى آخر يمكنك حفظ محتويات جميع الكائنات ( listbox1 + listbox2 + ....... ) بملف واحد في لاحقة عادة تكون ( dat ) مع إمكانية إعادة كل نص إلى مكانه عند عملية إعادة تحميل الملف المحفوظ
وبالمناسبة عندي كائنات تقوم بالعميلة السابقة ولكن المشكلة أنها تعمل مع الإصدارات القديمة للديلفي ولا تعمل مع الديلفي 7 .
أرجو أن تكون قد اتضحت مهمة التعليمة Stream .
- طريق الألف ميل يبدأ بخطوة -
- ألعاب من تصميمي:
المنقذ
الأربع تربح
المتاهة
يا اخ فادي انت تحتاج مراجعة ال steram وايضا ال ListBox و كيف تم بنائهم
ال ListBos طريقة حفظ بياناتها في ذاكرة الجهاز علي شكل تكست عادي يعني نصوص وانا هنا حبيت اوضح لك طريقة من طرق التخزين البيانات حسب ما طلبت ومضوعنا ما يتكلم عن العلاقه بين ال steam و ال ListBox ولا حتي عن اوجه الشبه بينهما !!!! ويا ليت تراجع سؤالك في البداية وايش احتمالات الاجابات عليه !!!
يا أخي في سؤالي ذكرت الحفظ من الـ ListBox على سبيل المثال فقط
وأما عن إحتمالات الإجابة على سؤالي فأحدها مثل الكود الذي وجدته والذي قد وضعته مسبقا حيث بكل بساطة يمكن تغير الكائن بدل من RichEdit إلى ListBox ليحفظ محتوياتها في ملف خاص باستخدام التعليمة Stream .
على كل شكرا لك أخي العزيز على المساعدة .
- طريق الألف ميل يبدأ بخطوة -
- ألعاب من تصميمي:
المنقذ
الأربع تربح
المتاهة
أخي فادي: ربما يمكنك أن تعرف ملفا من نمط المعطيات الذي تريد استخدامه أي
var f:file of tlistbox
وهكذا يمكنك حفظ الكائن المطلوب كاملاً في الملف ثم يمكنك استرجاعه كما هو من الملف لاحقاً يمكنك أن تضع اللاحقة التي تريد أعتقد أن هذه الطريقة تفيد في التشفير لكنها طبعاً لن تفيد في الضغط... طبعاً حجم الملف سيكون أكبر من النص داخل القائمة لأننا نحفظ القائمة كاملةً داخل الملف بكل خصائصها كما هي في الذاكرة وقت التنفيذ (إذا لم تكن على علم مسبق بالتعامل مع الملفات الثنائية يمكنني أن أوضح أكثر)
هذا الموضوع مغلق.