القسم 2: استخدام DBImage لاستخراج JPEG - بطريقة خاطئة
DBImage - خذ واحدًا (DBImage - خذ واحدًا)
عند محاولة القيام بشيء جديد باستخدام دلفي، أول شيء أفعله هو أن أطلب مساعدة دلفي المضمنة للحصول على طريقة ما. هذا ما ستجيب عليه وثائق المساعدة: تمثل صورة TDBImage (في صفحة عناصر التحكم في البيانات في لوحة المكونات) صورة رسومية لحقل BLOB في السجل الحالي لقاعدة البيانات. استخدم TDBImage لتمثيل قيم الحقول الرسومية. يسمح TDBImage للنماذج بعرض البيانات الرسومية من قاعدة البيانات. يحتوي TDBImage فقط على بعض خصائص رؤية البيانات أكثر من مكون TImage. الخاصيتان الأكثر أهمية هما: مصدر البيانات (مصدر البيانات) والحقل (الحقل). تقوم الخاصية DataSource بتوصيل المكون الرسومي بقاعدة البيانات. يوجد في النموذج الخاص بنا مكون DataSource يسمى DataSource1 - والذي يمثل مجموعة بيانات. تشير خاصية الحقل إلى الحقل (في الجدول) الذي يحتوي على الصورة.
كل شيء واضح، الآن ضع مكون DBImage في النموذج وقم بتسميته DBImage1 افتراضيًا. من أجل توصيل DBImage بحقل BLOB في الجدول، نحتاج فقط إلى إجراء التكوين التالي (باستخدام Object Inspector):
DBImage1.DataSource = DataSource1
DBImage1.Field = صورة
هذه خدعة ضرورية لعرض صورة JPEG الموجودة في حقل الصورة بجدول التطبيقات.
للتحقق من أن هذا التكوين يعمل، الشيء الوحيد الذي يتعين علينا القيام به هو تعيين الخاصية النشطة لمكون ADOTable1 على True. يمكننا القيام بذلك في Object Inspector أثناء التصميم. بمجرد القيام بذلك، سيظهر مربع الحوار التالي:
ماذا؟ لماذا تظهر "الصورة النقطية غير صالحة"؟ لدينا صور JPEG بدلاً من صور BMP - هل هذه هي المشكلة؟ دعنا نعود للمساعدة.
بعد فترة من النقر على المساعدة، توصلت إلى نتيجة: للحصول على صورة JPG في قاعدة البيانات، علينا استخدام كائن TJpegImage. لعرض الصور، نحتاج إلى نسخة بسيطة وغير مرئية من مكون الصورة. وفي الوقت نفسه، نحتاج إلى استخدام دفق لتحميل الصورة من كائن BLOB. وصف مستند المساعدة: يجب أن نستخدم TADOblobStream للوصول إلى قيمة حقل BLOB أو حقل المذكرة (الملاحظة) في مجموعة بيانات ADO أو تغييرها.
القسم 3: استخدام التدفقات لاستخراج JPEG - طريقة خاطئة
سحب ملف JPEG - خذ اثنين!
نظرًا لأننا لا نستطيع فعل أي شيء باستخدام DBImage - فقم بإزالته من النموذج ووضع مكون TImage عادي (صفحة إضافية) يسمى ADOImage. لسوء الحظ، لا يحتوي مكون الصورة على أي خصائص خاصة بالبيانات، لذا يلزم وجود برنامج منفصل لعرض الصورة من جدول قاعدة البيانات الذي تمثله. إن أبسط طريقة لتحقيق ذلك هي وضع زر على النموذج، ووضع كافة التعليمات البرمجية للبرنامج في حدث OnClick الخاص به، وتسمية الزر: "btnShowImage".
من أجل استخدام ADOBLOBStream، توصي وثائق المساعدة بإنشاء مثيل TADOBlobStream، باستخدام أسلوب "الدفق" لقراءة حقول الرسومات من مجموعة البيانات، ثم تحرير دفق BLOB. في مكان ما في المنتصف، سنحتاج إلى تحميل صورة JPEG من كائن TADOBlobStream باستخدام طريقة LoadFromStream. سيتم استخدام خصائص الصورة والرسومات الخاصة بمكون الصورة لتخزين الصور وعرضها فعليًا.
كائن الميدان، ما هو؟
في هذه المرحلة، أفترض أن القليل من المعرفة بالأشياء الميدانية أكثر من كافية لإتقان هذا الفصل. في تطوير قاعدة بيانات دلفي، أحد الكائنات الرئيسية هو كائن TField. مكونات الحقل هي كائنات غير مرئية تمثل حقول مجموعة البيانات في وقت التشغيل (أو التصميم). يوفر TADOTable (وفئات TDataSet الفرعية الأخرى) إمكانية الوصول في وقت التصميم إلى محرر الحقول. يمكّنك محرر الحقول من تحديد الحقول التي تريد تضمينها في مجموعة البيانات. والأهم من ذلك، أنه يقوم بإنشاء قائمة قوية من المكونات الميدانية المستخدمة في مجموعة بيانات التطبيق. لاستدعاء محرر الحقول، انقر نقرًا مزدوجًا فوق مكون TADOTable. بشكل افتراضي، قائمة الحقول فارغة. انقر فوق الزر "إضافة" لفتح مربع حوار يسرد حقول جدول التطبيقات. بشكل افتراضي، يتم تحديد كافة الحقول، ثم حدد موافق.
ستعطي دلفي الاسم الافتراضي للحقل كما يلي: اسم الجدول (الجدول) + اسم الحقل (الحقل). وهذا يعني أن حقل الصورة الخاص بنا يسمى: ADOTable1Picture.
تقوم طريقة الإنشاء الخاصة بـ TADOblobStream بإنشاء مثيل لقراءة أو كتابة كائن حقل BLOB محدد، في هذه الحالة حقل ADOTable1Picture.
نكتب كود البرنامج في حدث OnClick لزر btnShowImage. سيقوم هذا الرمز بقراءة الصورة من حقل الصورة للصف المحدد حاليًا. كود المصدر هو كما يلي:
يستخدم الحياة السياسية في فرنسا.
...
PROcedure TForm1.btnShowImageClick(Sender: TObject);
var bS: TADOblobStream;
الموافقة المسبقة عن علم: TJpegImage؛
يبدأ
bS := TADOblobStream.Create
(AdoTable1Picture، bmRead)؛
يحاول
الموافقة المسبقة عن علم:=TJpegImage.Create;
يحاول
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
أخيراً
Pic.Free;
نهاية ؛
أخيراً
مجاني
نهاية ؛
نهاية ؛
حسنًا، لندير هذا المشروع. بالطبع، قم بتعيين الخاصية ADOTable1.Active إلى True. بعد عرض النموذج، انقر فوق الزر وستظهر الشاشة التالية:
اه، ماذا يحدث؟ الكود صحيح 100% ولكن لماذا لا تظهر الصورة؟ تذكر "لا تستسلم أبدًا، لا تستسلم أبدًا"! دعنا ننتقل إلى مستوى البايت ونرى ما يحدث!