علاقة الميراث لـ TMemoryStream هي كما يلي
كائن
|
TStream
|
TCustomMemoryStream
|
TMemoryStream
كيفية استخدام TMemoryStream؟
في الواقع، يتم استخدام TmemoryStream تمامًا مثل TStream.
للحصول على سمات وأساليب محددة، يرجى الاطلاع على المساعدة.
هنا مثال:
ماذا علي أن أفعل إذا كنت أرغب في قراءة وكتابة صورة نقطية مباشرة في الذاكرة؟
TmemoryStream يساعدك كثيرا
فار
BitmapMemoryStream:TMemoryStream;
Bitmap1:TBitmap;
الإجراء TForm.Button1Click(Sender:TObject);
يبدأ
BitmapmemroyStream:=TmemoryStream.Create; ملف://Create MemoryStream
Bitmap1:=TBitmap.Create;
يحاول
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
يستثني
ShowMessage('خطأ في ملف التحميل bitmap1.bmp');
نهاية؛
نهاية؛
الإجراء TForm.Button2Click(Sneder:Tobject);
يبدأ
إذا تم تعيينه (Bitmap1) بعد ذلك
Bitmap1.SaveToStream(BitmapmemoryStream);
نهاية؛
الإجراء TForm.Button3Click(Sender:TObject);
يبدأ
إذا كان BitmapMemoryStream<>لا شيء إذن
يبدأ
يحاول
BitmapMemroyStream.SaveToFile('Bitmap1.str'); الملف://حفظ دفق الذاكرة وحجمه
الملف://Bitmap1.bmp نفسه
يستثني
showmessage('خطأ في ذاكرة الوصول!');
نهاية؛
نهاية؛
نهاية؛
الإجراء TForm.Button4Click(Sender:TObject);
فار
المخزن المؤقت: صفيف [0..53] من شار؛
يبدأ
إذا تم تعيينه (BitmapMemroyStream) بعد ذلك
يحاول
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
إذا كان Buffer[0]='B' وBuffer[1]='M'، فقم بملف://إعادة كتابة محتوى الذاكرة
يبدأ
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);// اكتب المحتوى المعاد كتابته في الملف
نهاية؛
يستثني
ShowMessage('خطأ في الوصول إلى memroyStream');
نهاية؛
نهاية؛
يمكنك أن ترى مدى ملاءمة استخدام TMemoryStream لقراءة الذاكرة وكتابتها. بالطبع، ليست هناك حاجة لإنشاء صورة نقطية أولاً.
يمكنك استخدام LoadFromFile لتشغيل الملف مباشرة، ولكن بالنسبة لتدفقات الذاكرة الأخرى، يمكنك استخدام الطريقة المذكورة أعلاه.
ما ورد أعلاه هو مجرد مقدمة بالنسبة للوظائف الأخرى، يمكنك قراءة المساعدة واكتشافها بنفسك!
هناك العديد من كائنات البث الأخرى، وكلها متشابهة إلى حد كبير، لذا يمكنك استخدامها جميعًا!
كيفية كتابة محتويات الدفق إلى الحافظة ومعالجتها
يتم إنجاز هذه التقنية بالرجوع إلى تطبيق فئة الحافظة الخاصة بدلفي. وضع محتويات الدفق في الحافظة،
أولاً، قم بتسجيل التنسيق الخاص بك باستخدام الدالة RegisterClipboardFormat()
ثم قم بالخطوات الثلاث التالية:
1. قم بإنشاء دفق محتوى واكتب المحتوى فيه
2. قم بإنشاء منطقة محتوى عالمية واكتب محتوى الدفق
3. اتصل بـ ClipBoard.SetAsHandle() لكتابة المحتوى إلى الحافظة
كتابة المحتوى إلى الحافظة
فار
hbuf :Thandle;
bufptr : المؤشر؛
mstream: TMemoryStream;
يبدأ
mstream := TMemoryStream.Create;
يحاول
{-- كود معالجة التدفقات --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
يحاول
bufptr := GlobalLock(hbuf);
يحاول
Move(mstream.Memory^, bufptr^, mstream.size);
Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
أخيراً
GlobalUnlock(hbuf);
نهاية؛
يستثني
GlobalFree(hbuf);
يرفع؛
نهاية؛
أخيراً
mstream.Free;
نهاية؛
نهاية؛
يرجى الحرص على عدم تحرير المخزن المؤقت العالمي المخصص. يتم تنفيذ هذا العمل بواسطة الحافظة
يجب عليك نسخه ومعالجته لاحقًا.
قراءة محتويات الحافظة
فار
hbuf :Thandle;
bufptr : المؤشر؛
mstream: TMemoryStream;
يبدأ
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
إذا hbuf <> 0 ثم ابدأ
bufptr := GlobalLock(hbuf);
إذا bufptr <> nil ثم ابدأ
يحاول
mstream := TMemoryStream.Create;
يحاول
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.Position := 0;
{-- كود معالجة التدفقات --}
أخيراً
mstream.Free;
نهاية؛
أخيراً
GlobalUnlock(hbuf);
نهاية؛
نهاية؛
نهاية؛
نهاية؛
نصائح لاستخدام TStream لقراءة البيانات وكتابتها في Dephi
يتم توفير نوع بيانات مجردة TStream في Dephi لدعم العمليات على تدفق البيانات. تأتي هذه البيانات عادةً من الملفات وقواعد البيانات وكائنات الذاكرة وكائنات OLE وما إلى ذلك. يوفر TStream طريقة موحدة وموجزة لقراءة البيانات وكتابتها. في الظروف العادية، لا نحتاج إلى استخدام فئة TStream مباشرة، ويتم تغليف قراءة وكتابة بيانات التدفق في طرق التحكم VCL. ولكن إذا لم تتمكن هذه الأساليب من تلبية متطلباتنا، فسنحتاج إلى التحكم يدويًا في قراءة البيانات وكتابتها بأنفسنا.
1. الطرق والخصائص الشائعة الاستخدام لـ TStream:
---- 1. وظيفة القراءة (var Buffer؛ Count: Longint): Longint virtual؛
---- 2. وظيفة الكتابة (const Buffer؛ Count: Longint): Longint virtual؛
---- 3. وظيفة البحث (الإزاحة: Longint؛ الأصل: Word): Longint virtual؛
---- 4. موقع العقار: لونجينت؛
---- 5. حجم العقار: لونجينت
---- القراءة والكتابة والبحث كلها وظائف افتراضية خالصة، وتوفر طرقًا مجردة لقراءة البيانات وكتابتها وتحديد موضعها. تقرأ طريقة القراءة البيانات من الدفق إلى المخزن المؤقت، وتنفذ طريقة الكتابة العملية المعاكسة. تشير القيمة المرجعة إلى الحجم الفعلي للبيانات المقروءة والمكتوبة. يوفر Seek طريقة لتحريك مؤشر البيانات في الدفق. يمكن أن تأخذ المعلمة Origin ثلاث قيم: soFromBeginning، وsoFromCurrent، وsoFromEnd هي الإزاحة، والقيمة المرجعة هي موضع مؤشر بيانات الدفق الحالي.
---- يمثل الموضع موضع مؤشر البيانات في الدفق. هذه الخاصية قابلة للقراءة والكتابة، ويتم تنفيذها بالفعل عن طريق استدعاء أسلوب Seek، لذا فهي أكثر ملاءمة لاستخدام هذه الخاصية في الاستخدام الفعلي. تشير سمة الحجم إلى حجم الدفق الحالي، بالنسبة للتدفقات المختلفة، يكون أحيانًا للقراءة فقط.
2. قراءة وكتابة بيانات الدفق.
---- 1. SaveToStream(Stream: TStream); file:// يكتب البيانات الموجودة في الفصل إلى الموضع الحالي للدفق
---- 2.LoadFromStream(Stream: TStream); file://اقرأ البيانات الموجودة في الدفق من الموضع الحالي
---- في الاستخدام الفعلي، نحتاج فقط إلى استخدام الوظيفتين المذكورتين أعلاه.
3. أمثلة
----يظهر مخطط شجرة الميراث لـ TStream في الشكل 1 (محذوف). في الاستخدام الفعلي، يتم استخدام TFileStream وTMemoryStream وTblobStream بشكل أكثر شيوعًا. لنأخذ هذه التدفقات الثلاثة كمثال لتوضيح الاستخدام المحدد.
---- إنشاء نموذج Form1، ضع ثلاثة أزرار btnRead، btnInvert، btnSave ومربع حوار فتح الملف OpenDialog1 بالإضافة إلى عناصر التحكم في البيانات DataSource1، Table1، test.
---- استخدم سطح مكتب قاعدة البيانات المقدم من Dephi لإنشاء اختبار جدول. توجد صورة حقل في الجدول، ويتم حفظ اسم ملف قاعدة البيانات باسم test.db. ضع dbTest عنصر تحكم TDatabase وعنصر تحكم TTable Table1 وعنصر تحكم DataSource DataSource1 وعنصر تحكم TDBNavigator DBNavigator1 في النموذج. قم بتوصيل dbTest بقاعدة البيانات التي تم إنشاؤها للتو بواسطة سطح المكتب، وقم بتعيين خاصية TableName الخاصة بـ Table1 على test.db، وقم بتعيين خاصية DataSet الخاصة بـ DataSource1 إلى Table1، وقم بتعيين خاصية DataSource الخاصة بـ DBNavigator1 إلى DataSource1، وقم بتعيين خصائص VisibleButtons الأربعة الأولى على TRUE. بالإضافة إلى ذلك، قم بتعيين الاتصال الخاص بـ dbtest إلى TRUE والخاصية Active الخاصة بـ Table1 إلى TRUE بحيث تكون قاعدة البيانات مفتوحة من البداية.
----يتم كتابة رمز الحدث على النحو التالي:
---- 1. انقر فوق حدث btnRead، هنا يوضح استخدام TFileStream.
فار
مرض التصلب العصبي المتعدد: TFileStream؛
يبدأ
إذا OpenDialog1.Execute بعد ذلك
يبدأ
MS:=TFileStream.Create
(OpenDialog1.FileName، fmOpenRead)؛
Image1.Picture.Bitmap.LoadFromStream(MS);
MS.Free;
نهاية؛
نهاية؛
---- 2. انقر فوق حدث btnInvert، هنا يوضح استخدام TMemoryStream. يتم استخدام وظيفة العكس، وهي وظيفة بسيطة تعمل على عكس لون الصورة (صالحة فقط للصور الملونة الحقيقية) وتقوم بإرجاع مؤشر إلى كتلة بيانات الصورة المعالجة.
فار
م
S: TMemoryStream؛
الصورة: المؤشر؛
يبدأ
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
pImage:=Invert(MS.Memory, MS.size);
تعتبر سمة الملف://الذاكرة مؤشرًا لكتلة الذاكرة الفعلية
MS.Write(pImage^,MS.size);
MS.Position:=0;
السطر السابق من التعليمات البرمجية في file:// يحرك المؤشر إلى نهاية الدفق، لذلك يجب إعادة تعيينه.
Image1.Picture.Bitmap.LoadFromStream(MS);
FreeMem(pImage);
MS.Free;
نهاية؛
وظيفة العكس هي كما يلي:
الدالة TForm1.Invert
(pImage: المؤشر؛ الحجم: عدد صحيح): المؤشر؛
فار
pData، pMem: PChar؛
ط: عدد صحيح؛
يبدأ
pMem:=AllocMem(size);
CopyMemory(pMem,pImage,size);
pData:=pMem+54;
لأني:=0 إلى الحجم 54-1 افعل
يبدأ
pData^:=Char(not integer(pData^));
pData:=pData+1;
نهاية؛
النتيجة:=pMem;
نهاية؛
---- 1. انقر فوق حدث btnSave، هنا يوضح استخدامًا آخر لـ TMemoryStream، وكتابة البيانات في الدفق إلى قاعدة البيانات.
فار
مرض التصلب العصبي المتعدد: تميموريستريم؛
يبدأ
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
الجدول 1. إلحاق؛
file://يضيف سجلاً في قاعدة البيانات
TblobField(Table1.FieldbyName
('صورة')).LoadFromStream(MS);
الجدول 1. آخر؛
file://يكتب التحديثات لقاعدة البيانات
نهاية؛
---- 4. انقر فوق حدث DBNavigator1، هنا يوضح استخدام TBlobStream، باستخدام طريقة مختلفة عن الكتابة لقراءة بيانات الصورة لقاعدة البيانات.
فار
مرض التصلب العصبي المتعدد: تيار؛
يبدأ
مع Table1 القيام به
MS:=CreateBlobStream
(FieldbyName('image'),bmRead);
Image1.Picture.Bitmap.
LoadFromStream(MS);
MS.Free;
نهاية؛
هذا كل شيء. شكرا لقراءة هذا المقال. ليس لدي ما يكفي من النقاط لاستخدامها، لذلك لا بد لي من كسب بعض النقاط لاستبدالها. إذا شعرت أن هذه المقالة مفيدة لك، يرجى التصويت لي، شكرًا لك.