المكون المرئي هو في الواقع فئة لكتابة فئة، يمكنك كتابتها مباشرة في ملف *.pas. ولكن لكتابة عناصر التحكم، يجب عليك استخدام الحزم. حدد "جديد" من القائمة "ملف" لإنشاء حزمة جديدة. هذه هي الحزمة المستخدمة لتخزين عنصر التحكم وتثبيته. ثم انقر فوق الزر "إضافة" في نافذة الحزمة لإضافة مكون (وحدة).
حدد مكون جديد في الجزء العلوي من مربع الحوار المنبثق. نظرًا لأنه من المستحيل برمجة كافة الخصائص والأساليب والأحداث الخاصة بعنصر التحكم بنفسك، فأنت بحاجة إلى تحديد فئة الأصل (أو "الفئة الأصلية" أو "الفئة الأساسية")، ثم إضافة الخصائص والأساليب والعناصر الخاصة بك الأحداث إليها. حدد فئة السلف المطلوبة في المربع المنسدل بعد نوع السلف. نظرًا لأن كتابة عناصر التحكم المرئية تتطلب رسمًا، فقد تم تحديد TGraphicControl كفئة سلف. ثم أدخل اسم عنصر التحكم الجديد (الفئة) في مربع اسم الفئة، وعادةً ما يبدأ بحرف "T". تُستخدم صفحة اللوحة لتحديد اسم صفحة التحكم لعنصر التحكم الجديد في نافذة دلفي، مثل "قياسي". يمكنك اختيار هذا بنفسك. أضف المسار واسم الملف لملف التحكم الجديد في اسم ملف الوحدة وانقر فوق الزر موافق. تتم إضافة ضوابط جديدة. الآن حان الوقت لكتابة التعليمات البرمجية للتحكم.
فيما يلي نتناول كتابة شريط تمرير يمكنه تخصيص الصور كمثال لتوضيح طريقة كتابة عناصر التحكم المرئية.
اتبع الطريقة المذكورة أعلاه، وحدد TGraphicControl كفئة السلف، واسم عنصر التحكم الجديد هو TPigHorizontalScroller. بعد تحديد مسار الملف واسم الملف، انقر فوق الزر "موافق" لبدء كتابة التعليمات البرمجية.
سيتم إنشاء كل عنصر تحكم (إنشاء) وحذفه (تدمير)، لذا يجب كتابة هاتين العمليتين أولاً. بالنسبة لكل إجراء في عنصر التحكم، يجب تعريفه أولاً ثم كتابته لاحقًا. هناك ثلاثة أنواع من العمليات أو الخصائص المحددة: 1. يتم استخدام العمليات أو الخصائص المحددة بعد PRivate داخليًا بواسطة عنصر التحكم ولا يمكن رؤيتها بواسطة الأشخاص الذين يستخدمون عنصر التحكم 2. تكون العمليات أو الخصائص المحددة بعد الحماية غير مرئية بشكل عام ولا يمكن استخدامها إلا من قبل الآخرين عندما يستخدم الآخرون عنصر التحكم فقط عند كتابة عناصر التحكم الأخرى كفئة أسلاف؛ 3. لا يمكن استدعاء العناصر المحددة بعد النشر إلا من قبل الآخرين في البرنامج؛ مفتش). نظرًا لأن عملية الإنشاء والحذف لا يتم تنفيذها تلقائيًا فقط عند إنشاء عنصر التحكم أثناء عملية البرمجة، ولكن يمكن استدعاؤها أيضًا عندما يتم إنشاء عنصر التحكم ديناميكيًا أثناء تشغيل البرنامج، يتم تعريفها بعد عام (1). (يشير الرقم التسلسلي إلى موضع كود الخطوة الفرعية في البرنامج المصدر المرفق، وهو نفسه أدناه) ربما لا تزال لا تعرف ما الذي يجب تجميعه في هاتين العمليتين وكيفية تجميعه. سنتحدث عنها أدناه.
دعونا أولاً نضيف بعض الخصائص إلى عنصر التحكم هذا. نحدد خاصية Max لتعيين أو قراءة الحد الأقصى لقيمة شريط التمرير. نظرًا لأن السمات لا تُستخدم بشكل مباشر في البرامج، فيجب تعريف متغير ليتوافق مع السمة ويمكن تعديل قيمتها أو قراءتها. ولأنه يستخدم فقط داخل عنصر التحكم، فإننا نحدده بعد الخاص (2). (بشكل عام، تبدأ المتغيرات المرتبطة بالسمات بالحرف "F"، مثل FMax) بعد تعريف المتغيرات، قم بتعريف السمات. يجب أن تكون هذه الخاصية مرئية في نافذة Object Inspector، لذا قم بتعريفها ونشرها (3). بناء الجملة المحدد هو:
الخاصية <اسم الخاصية>:<النوع> اقرأ <المتغير المقابل عند قراءة هذه الخاصية> اكتب <المتغير أو الإجراء المقابل عند كتابة هذه الخاصية>
يتم أيضًا تعريف المتغيرات والسمات الأخرى بالمثل (مثل الحد الأدنى للقيمة، والقيمة الحالية للقيمة، وما إلى ذلك). بعد ذلك نحدد عدة خصائص ومتغيرات لتعيين صورة شريط التمرير (لأن متغير الصورة خاص، سنتحدث عنه بشكل منفصل). نحدد LeftButtonUpPicture (صورة الزر الأيسر)، LeftButtonDownPicture (صورة الضغط على الزر الأيسر)، وما إلى ذلك كأنواع TBitmap (يجب تحديد المتغيرات المقابلة).
لا بد أنك لاحظت أنه في البرنامج المصدر المرفق، عند تعريف هذه السمات، يكون المتغير المقابل للسمة المقروءة بعد القراءة هو F...، لكن المتغير المقابل للسمة المحددة بعد الكتابة ليس متغيرًا، ولكنه يشبه Set ... هذه عملية مخصصة. يتم تعريف العملية كوظيفة على النحو التالي:
الإجراء <اسم الإجراء>(القيمة: <نوع قيمة السمة التي يتم تعيينها>)
نظرًا لأنه يجب القيام بأشياء أخرى عند كتابة هذا النوع من السمات، فلا يمكنك استخدام متغير للتعامل معه فحسب، بل يجب عليك استخدام عملية للتعامل معه. يتم تعريف هذه العملية بشكل عام بعد الحماية. في هذا النوع من الإجراءات، يتم استخدام عبارة مثل ⑷ لتعيين قيمة لمتغير من النوع TBitmap ويتم اعتماد ذلك لأنه لا يمكن تعيين قيمة للمتغيرات من هذا النوع مباشرة.
بعد تحديد خصائص متغيرات نوع TBitmap هذه، ستحتاج إلى كتابة التعليمات البرمجية في عملية الإنشاء وعملية التدمير المذكورة أعلاه. نظرًا لأن TBitmap هي أيضًا فئة، فيجب إنشاؤها أثناء عملية الإنشاء (5) ويجب إصدارها (مجانًا) أثناء عملية التدمير (6). يُستخدم البيان الموروث المشار إليه في ⑺ هنا للإشارة إلى أن العملية موروثة من فئة السلف. (وهذا لا ينبغي إسقاطه).
لأننا نكتب عنصر تحكم مرئي، يجب علينا رسم صور على عنصر التحكم. فئة الأصل لعنصر التحكم الخاص بنا، TGraphicControl، تحتوي على كائن Canvas (قماش)، ويمكننا استخدامه مباشرة لرسم الصور. إذا لم تكن معتادًا على استخدام القماش بعد، فمن الجيد أن تجد كتابًا وتقرأه.
الشيء التالي الذي يجب فعله هو رسم الصورة. كيفية رسم الصور على السيطرة؟ يوجد حدث Paint في فئة السلف TGraphicControl، والذي يتم تشغيله تلقائيًا عندما يلزم إعادة رسم عنصر التحكم. ما علينا فعله الآن هو كتابة برنامج لهذا الحدث. قم أولاً بتعريف كائن Canvas بعد حمايته. نظرًا لأنه موجود بالفعل في فئة السلف، ليست هناك حاجة لإضافة أي تفسير⑻. سوف نستخدم هذا الكائن لرسم الصورة. بعد ذلك، تحتاج إلى تحديد عملية الرسام وكتابة الكود لرسم عنصر التحكم. حدد عملية الطلاء أولاً بعد العامة. نظرًا لأنه يتم تشغيله بواسطة الفئة الأصلية بدلاً من استدعائه من قبل المستخدم، فيجب إضافة التجاوز بعد ذلك، وإلا فإن عنصر التحكم لن يصبح تحكمًا مرئيًا لأنه لن يتم استدعاء عملية الرسام أبدًا. بعد ذلك سوف نكتب الكود الخاص بعملية الرسام⑽.
يتم استخدام T_Height والمتغيرات الأخرى في عملية الرسام للبرنامج المصدر المرفق بهذه المقالة لحفظ حجم الأزرار وشرائح التمرير وما إلى ذلك في شريط التمرير. لا يختلف هذا الجزء من البرنامج كثيرًا عن البرنامج في التطبيقات العادية معظمها مخصص للتشغيل على القماش، وأعتقد أن الجميع سوف يفهمونها في لمحة. تجدر الإشارة إلى الحكم التالي لمتغير FAutoSize وهو متغير منطقي مرتبط بالسمة AutoSize لعنصر التحكم. يتم استخدامه لتعيين ما إذا كان حجم عنصر التحكم يتغير مع حجم الصورة. لاحظ أنه في كود عنصر التحكم، لا يتم استدعاء الخصائص بشكل مباشر بشكل عام، ولكن يتم استخدام المتغيرات المقابلة.
في هذه المرحلة من البرنامج، تكون قد قمت أخيرًا بالظهور لعنصر التحكم الجديد الخاص بك، ولكن لا يمكن تمريره بعد. الآن دعونا نكتب أحداث الماوس التي ستسمح لنا بمعالجتها. تعريف عملية حدث الماوس مشابه جدًا لعملية الرسام، باستثناء أنه يجب إضافة أوصاف المعلمات في النهاية. وتنقسم أحداث الماوس إلى ثلاثة أنواع: MouseDown، وMouseMove، وMouseUp يجب إضافتها بعد التعريف. بعد ذلك، قم بكتابة الكود الخاص به خلفه. ملاحظة: حدث الماوس هنا هو Mouse...، وليس OnMouse المعتاد.... ولكن ما هو التعريف في - يستخدم ل؟ تعريفات الحدث هنا كلها للمستخدمين، أي أنه عند استخدام عنصر التحكم، سيتم عرضه على صفحة الحدث في Object Inspector.
كما أن رمز أحداث الماوس هذه بسيط جدًا أيضًا، فهو يحدد إحداثيات الماوس، ويرسم الصورة المقابلة على اللوحة القماشية، وما إلى ذلك، ويطلق الحدث المقابل في نفس الوقت. تجدر الإشارة إلى أنه عند استدعاء حدث مخصص، يجب عليك أولاً استخدام عبارة مثل ⒁ لتحديد ما إذا كان المستخدم قد كتب رمزًا للحدث. هذا مهم جدًا، وإلا سيحدث خطأ.
لقد لاحظ الجميع أن الأحداث التي تم استدعاؤها للتو كلها مخصصة، والطريقة المحددة أيضًا بسيطة جدًا وهي تشبه تعريف الخصائص، باستثناء أن النوع هو TNotifyEvent.
TNotifyEvent هو الحدث الافتراضي، والذي يتم تعريفه على النحو التالي:
TNotifyEvent = الإجراء (المرسل: TObject)
إذا كنت تريد تعريف شكل آخر من أشكال الحدث، فيجب عليك القيام بذلك: اكتبه أولاً ثم اكتبه
<اسم نوع الحدث> = الإجراء(<المعلمة>:<النوع>)
على سبيل المثال:
TCustomEvent = الإجراء(أ: عدد صحيح؛ ب:سلسلة)؛
ثم حدده بعد الجمهور:
<اسم الحدث>:<اسم نوع الحدث>
على سبيل المثال:
AnEvent: TCustomEvent;
بعد قراءة هذا، يجب أن تفهم الإجراء بأكمله. في حالة حدوث أخطاء في التجميع أو التشغيل، يرجى التحقق من النقاط التالية:
1. هل هناك عبارات موروثة في عمليات الإنشاء والتدمير؟
2. هل تم إنشاء وتحرير المتغيرات من النوع TBitmap؟
3. هل يوجد اسم تحكم قبل العملية مثلا: TPigHorizontalScroller.MoseMove
كيفية تحديد ما إذا كان الماوس يدخل أو يخرج من عنصر التحكم:
تحديد العملية التالية:
الإجراء MouseEnter(var Msg: TMessage message CM_MOUSEENTER);
إجراء MouseLeave(var Msg: TMessage message CM_MOUSELEAVE);