آلية القراءة والكتابة لمكونات دلفي (1)
1. مقدمة إلى كائنات التدفق (Stream) وكائنات القراءة والكتابة (Filer)
في البرمجة كائنية التوجه، تلعب إدارة البيانات القائمة على الكائنات دورًا مهمًا. في دلفي، يعد دعم إدارة البيانات المستندة إلى الكائنات ميزة رئيسية.
دلفي هي بيئة تطوير متكاملة تجمع بين التصميم المرئي الموجه للكائنات واللغة الموجهة للكائنات. جوهر دلفي هو المكونات. المكون هو نوع من الكائنات. يتم إنشاء تطبيقات دلفي بالكامل من مكونات، لذا فإن تطوير تطبيقات دلفي عالية الأداء سيتضمن حتماً تكنولوجيا إدارة البيانات القائمة على الكائنات.
تتضمن إدارة بيانات الكائن جانبين:
● استخدام الكائنات لإدارة البيانات
● إدارة كائنات البيانات المختلفة (بما في ذلك الكائنات والمكونات)
تلخص دلفي فئات إدارة البيانات القائمة على الكائنات في كائنات الدفق (الدفق) وكائنات الملف (المصنف)، وتطبقها على جميع جوانب مكتبة فئة المكونات المرئية (VCL). أنها توفر وظائف غنية لإدارة الكائنات في الذاكرة والتخزين الخارجي وموارد Windows.
كائن الدفق، المعروف أيضًا باسم كائن الدفق، هو الاسم الجماعي لـ TStream وTHandleStream وTFileStream وTMemoryStream وTResourceStream وTBlobStream. وهي تمثل على التوالي القدرة على تخزين البيانات على وسائط مختلفة، فهي تلخص عمليات إدارة أنواع البيانات المختلفة (بما في ذلك الكائنات والمكونات) في الذاكرة والذاكرة الخارجية وحقول قاعدة البيانات في أساليب الكائنات، وتستفيد بشكل كامل من التكنولوجيا الموجهة للكائنات الميزة هي أن التطبيقات يمكنها نسخ البيانات في كائنات الدفق المختلفة بسهولة إلى حد ما.
تتضمن كائنات القراءة والكتابة (Filer) كائنات TFiler وكائنات TReader وكائنات TWriter. كائن TFiler هو الكائن الأساسي لقراءة الملفات وكتابتها، ويستخدم TReader وTWriter بشكل أساسي في التطبيقات. ترث كل من كائنات TReader وTWriter مباشرة من كائنات TFiler. يحدد كائن TFiler الخصائص والأساليب الأساسية لكائن Filer.
يقوم كائن Filer بشكل أساسي بوظيفتين رئيسيتين:
● الوصول إلى ملفات النموذج والمكونات الموجودة في ملفات النموذج
● توفير التخزين المؤقت للبيانات لتسريع عمليات قراءة وكتابة البيانات
من أجل الحصول على فهم إدراكي للكائنات المتدفقة وكائنات القراءة والكتابة، دعونا نلقي نظرة أولاً على مثال.
أ) كتابة ملف
PROcedure TFomr1.WriteData (المرسل: TObject r)؛
فار
FileStream:TFilestream;
Mywriter:TWriter;
ط: عدد صحيح
يبدأ
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);// إنشاء كائن دفق ملف
Mywriter:=TWriter.create(FileStream,1024); // ربط Mywriter مع FileStream
Mywriter.writelistbegin; // علامة بداية قائمة الكتابة
بالنسبة إلى i:=0 إلى Memo1.lines.count-1، قم بذلك
Mywriter.writestring(memo1.lines[i]); // احفظ المعلومات النصية في مكون المذكرة في الملف
Mywriter.writelistend; // علامة نهاية قائمة الكتابة
FileStream.seek(0,sofrombeginning); // يتحرك مؤشر كائن دفق الملف إلى بداية الدفق
Mywriter.free; // حرر كائن Mywriter
FileStream.free; // حرر كائن FileStream
نهاية؛
ب) قراءة الملفات
الإجراء TForm1.ReadData(Sender: TObject);
فار
FileStream:TFilestream;
Myreader:TReader;
يبدأ
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); // ربط Myreader بـ FileStream
Myreader.readlistbegin; // اقرأ علامة بداية القائمة المكتوبة
Memo1.lines.clear; // امسح محتوى النص لمكون Memo1
على الرغم من عدم قيام myreader.endoflist بذلك // انتبه إلى طريقة TReader: endoflist
يبدأ
Memo1.lines.add(myreader.readstring); // أضف سلسلة القراءة إلى مكون Memo1
نهاية؛
Myreader.readlistend; // اقرأ علامة نهاية القائمة المكتوبة
Myreader.free; // حرر كائن Myreader
FileStream.free; // حرر كائن FileStream
نهاية؛
العمليتان السابقتان، إحداهما عملية كتابة والأخرى عملية قراءة. تمر عملية الكتابة عبر TWriter وتستخدم TFilestream لحفظ المحتوى (المعلومات النصية) في مذكرة كملف ثنائي محفوظ على القرص. عملية القراءة هي عكس عملية الكتابة تمامًا، حيث يتم استخدام TFilestream من خلال TReader لتحويل محتويات الملف الثنائي إلى معلومات نصية وعرضها في مذكرة. عند تشغيل البرنامج، يمكنك أن ترى أن عملية القراءة تستعيد بأمانة المعلومات المحفوظة بواسطة عملية الكتابة.
يصف الرسم التخطيطي التالي العلاقة بين كائنات البيانات (بما في ذلك الكائنات والمكونات)، وكائنات التدفق، وكائنات القراءة والكتابة.
الشكل (1)
تجدر الإشارة إلى أن كائنات القراءة والكتابة مثل كائنات TFiler وكائنات TReader وكائنات TWriter نادرًا ما يتم استدعاؤها مباشرةً بواسطة كاتب التطبيق، وعادة ما يتم استخدامها لقراءة حالة المكونات وكتابتها -كتابة آلية المكون دورا هاما.
بالنسبة لتدفق الكائنات المتدفقة، تحتوي العديد من المواد المرجعية على مقدمات مفصلة للغاية، في حين أن المواد المرجعية لكائنات TFiler وكائنات TReader وكائنات TWriter، وخاصة آليات قراءة المكونات وكتابتها، ستتتبع كود VCL الأصلي وآلية الكتابة .
2. قراءة وكتابة الأشياء (الفلر) وآليات القراءة والكتابة المكونة لها
يتم استخدام كائن Filer بشكل أساسي للوصول إلى ملفات نموذج دلفي والمكونات الموجودة في ملف النموذج، لذلك لفهم كائن Filer بوضوح، يجب أن تعرف بنية ملف نموذج دلفي (ملف DFM).
تُستخدم ملفات DFM لنماذج تخزين دلفي. النموذج هو جوهر البرمجة المرئية في دلفي. يتوافق النموذج مع النافذة في تطبيق دلفي، والمكونات المرئية في النموذج تتوافق مع عناصر الواجهة في النافذة، والمكونات غير المرئية مثل TTimer وTOpenDialog تتوافق مع وظيفة معينة في تطبيق دلفي. يتمحور تصميم تطبيقات دلفي في الواقع حول تصميم النموذج. لذلك، تحتل ملفات DFM أيضًا مكانة مهمة جدًا في تصميم تطبيقات دلفي. يتم تضمين كافة العناصر الموجودة في النموذج، بما في ذلك خصائص النموذج نفسه، في ملف DFM.
في نافذة تطبيق دلفي، ترتبط عناصر الواجهة ببعضها البعض وفقًا لعلاقة الملكية، وبالتالي فإن بنية الشجرة هي الشكل الأكثر طبيعية للتعبير، وبالتالي يتم تنظيم المكونات الموجودة في النموذج أيضًا وفقًا لبنية الشجرة؛ ملف DFM، أيضًا للتعبير عن هذه العلاقة. يتم تخزين ملفات DFM فعليًا في تنسيق نصي (قبل إصدار Delphi2.0، تم تخزينها كملفات ثنائية)، ومن المنطقي أن يتم ترتيب العلاقة بين المكونات في بنية شجرة. يمكن رؤية البنية الشجرية للنموذج بوضوح من هذا النص. فيما يلي محتوى ملف DFM:
كائن Form1: TForm1
اليسار = 197
الأعلى = 124
…
بكسل لكل بوصة = 96
ارتفاع النص = 13
كائن Button1: TButton
اليسار = 272
…
تسمية توضيحية = 'Button1'
ترتيب الجدول = 0
نهاية
لوحة الكائن 1: TPanel
اليسار = 120
…
التسمية التوضيحية = 'اللوحة1'
ترتيب الجدول = 1
كائن CheckBox1: TCheckBox
اليسار = 104
…
تسمية توضيحية = 'CheckBox1'
ترتيب الجدول = 0
نهاية
نهاية
نهاية
يتم إنشاء ملف DFM هذا بواسطة TWriter من خلال دفق كائن التدفق. بالطبع، هناك أيضًا عملية تحويل من ملف ثنائي إلى ملف معلومات نصي. عملية التحويل هذه ليست موضوع هذه المقالة، لذلك يتم تجاهل هذه العملية.
عندما يبدأ تشغيل البرنامج، يقرأ TReader النماذج والمكونات من خلال كائن التدفق Stream، لأنه عندما تقوم دلفي بتجميع البرنامج، فإنها تقوم بتجميع معلومات ملف DFM في الملف القابل للتنفيذ باستخدام تعليمات التجميع {$R *.dfm}، فماذا في ذلك؟ ما يقرأه TReader هو في الواقع معلومات حول النماذج والمكونات التي يتم تجميعها في الملف القابل للتنفيذ.
لا يستطيع TReader وTWriter قراءة وكتابة معظم أنواع البيانات القياسية في Object Pascal فحسب، بل يمكنهم أيضًا قراءة وكتابة الأنواع المتقدمة مثل List وVariant، وحتى قراءة وكتابة الخصائص والمكونات. ومع ذلك، فإن TReader وTWriter يقدمان في الواقع وظائف محدودة جدًا، ويتم تنفيذ معظم العمل الفعلي بواسطة فئة TStream القوية جدًا. بمعنى آخر، TReader وTWriter هما في الواقع مجرد أدوات، وهما مسؤولان فقط عن مكونات القراءة والكتابة التي يتم إكمالها بواسطة TStream.
نظرًا لأن TFiler هي فئة السلف المشترك لـ TReader وTWriter، لفهم TReader وTWriter، يجب أن تبدأ بـ TFiler أولاً.