إنشاء وتخصيص أزرار مع DBNavigator

"حسنًا ، تقوم DBNavigator بمهمة التنقل في البيانات وإدارة السجلات. لسوء الحظ ، يريد عملائي تجربة أكثر سهولة في الاستخدام ، مثل الرسومات والتعليقات التوضيحية للزر المخصص ،... "

جاء هذا الاستفسار من دلفي المطور البحث عن وسيلة لتعزيز قوة مكون DBNavigator.

يعد DBNavigator مكونًا رائعًا — فهو يوفر واجهة تشبه VCR للتنقل في البيانات وإدارة السجلات في تطبيقات قواعد البيانات. يتم توفير التنقل في السجلات من خلال الأزرار الأولى والتالية والأولى والأخيرة. يتم توفير إدارة السجل من خلال أزرار التحرير والنشر والإلغاء والحذف والإدراج والتحديث. في مكون واحد ، توفر دلفي كل ما تحتاجه ، لتعمل على بياناتك.

ومع ذلك ، كما ذكر مؤلف استفسار البريد الإلكتروني أيضًا ، يفتقر DBNavigator إلى بعض الميزات مثل الحروف الرسومية المخصصة والتعليقات التوضيحية على الأزرار وغيرها.

أقوى DBNavigator

العديد من مكونات Delphi لها خصائص وأساليب مفيدة يتم تمييزها غير مرئية ("محمية") لمطور Delphi. نأمل أن يتم استخدام تقنية بسيطة تسمى "الاختراق المحمي" للوصول إلى هؤلاء الأعضاء المحميين في أحد المكونات.

أولاً ، ستضيف تسمية توضيحية إلى كل زر DBNavigator ، ثم ستضيف رسومات مخصصة ، وأخيراً ، ستقوم OnMouseUp بتمكين كل زر.

instagram viewer

من DBNavigator "الممل" إلى أي من:

  • الرسومات القياسية والتسميات التوضيحية المخصصة
  • فقط تعليق
  • رسومات مخصصة والتعليقات التوضيحية المخصصة

دعونا ن لفة الصخرة

يحتوي DBNavigator على خاصية أزرار محمية. هذا العضو عبارة عن صفيف من TNavButton ، سليل TSpeedButton.

نظرًا لأن كل زر في هذه الخاصية المحمية يرث من TSpeedButton ، إذا تمكنت من التعامل معه ، فستتمكن من العمل مع خصائص TSpeedButton "القياسية" مثل: تسمية توضيحية (سلسلة تحدد عنصر التحكم للمستخدم) ، Glyph (الصورة النقطية التي تظهر على الزر) ، Layout (يحدد مكان ظهور الصورة أو النص على زر)...

من وحدة DBCtrls (حيث يتم تعريف DBNavigator) ، "تقرأ" تعلن أن خاصية الأزرار المحمية هي:

أزرار: مجموعة مصفوفة[TNavigateBtn] من TNavButton

حيث يرث TNavButton من TSpeedButton و TNavigateBtn عبارة عن تعداد ، يُعرّف بأنه:

TNavigateBtn = 
(nbFirst ، nbPrior ، nbNext ، nbLast ، nbInsert ،
nbDelete، nbEdit، nbPost، nbCancel، nbRefresh)؛

لاحظ أن TNavigateBtn يحتوي على 10 قيم ، كل زر تعريف مختلف على كائن TDBNavigator. الآن ، دعونا نرى كيفية اختراق DBNavigator:

تعزيز DBNavigator

أولاً ، قم بإعداد نموذج تحرير بيانات دلفي بسيط عن طريق وضع DBNavigator على الأقل ، DBGridو DataSoure و كائن مجموعة البيانات من اختيارك (ADO ، BDE ، dbExpres ، ...). تأكد من أن جميع المكونات "متصلة".

ثانياً ، اخترق DBNavigator بتعريف فئة "وهمية" موروثة ، أعلى إعلان النموذج ، مثل:

اكتب THackDBNavigator = صف دراسي(TDBNavigator) ؛
اكتب
TForm1 = صف دراسي(TForm)
...

بعد ذلك ، لتتمكن من عرض التسميات التوضيحية والرسومات المخصصة على كل زر DBNavigator ، ستحتاج إلى إعداد بعض الحروف الرسومية. يمكنك استخدام مكون TImageList وتعيين 10 صور (.bmp أو .ico) ، يمثل كل منها إجراءً لزر معين من DBNavigator.

الثالث ، في حدث OnCreate بالنسبة إلى Form1 ، أضف مكالمة مثل:

إجراء TForm1.FormCreate (المرسل: TObject) ؛
SetupHackedNavigator (DBNavigator1، ImageList1)؛
النهاية;

تأكد من إضافة إعلان هذا الإجراء في الجزء الخاص من نموذج الإعلان ، مثل:

اكتب
TForm1 = صف دراسي(TForm)
...
privateprocedure SetupHackedNavigator (مقدار ثابت المستكشف: TDBNavigator ؛
مقدار ثابت رموزًا: TImageList) ؛
...

رابعًا ، أضف الإجراء SetupHackedNavigator. يضيف الإجراء SetupHackedNavigator رسومات مخصصة لكل زر ويعين تسمية توضيحية مخصصة لكل زر.

الاستخدامات أزرار؛ //!!! لا تنسى
إجراء TForm1.SetupHackedNavigator
(مقدار ثابت المستكشف: TDBNavigator ؛
مقدار ثابت رموزًا: TImageList) ؛
مقدار ثابت
التسميات التوضيحية: مجموعة مصفوفة[TNavigateBtn] من السلسلة =
("الأولي" ، "السابق" ، "لاحقًا" ، "النهائي" ، "إضافة" ،
"محو" ، "تصحيح" ، "إرسال" ، "سحب" ، "إحياء") ؛
(*
تسميات توضيحية: صفيف [TNavigateBtn] من السلسلة =
("أولاً" ، "سابق" ، "التالي" ، "آخر" ، "إدراج" ،
"حذف" ، "تحرير" ، "نشر" ، "إلغاء" ، "تحديث") ؛

في كرواتيا (محلية):
تسميات توضيحية: صفيف [TNavigateBtn] من السلسلة =
("Prvi" ، "Prethodni" ، "Slijedeci" ، "Zadnji" ، "Dodaj" ،
"Obrisi" ، "Promjeni" ، "Spremi" ، "Odustani" ، "Osvjezi") ؛
*)
فار
btn: TNavigateBtn؛
startfor btn: = منخفض (TNavigateBtn) إلى عالية (TNavigateBtn) دوويث THackDBNavigator (المستكشف). أزرار [BT] dobegin// من مجموعة const Captions
التسمية التوضيحية: = التسميات التوضيحية [btn] ؛
// عدد الصور في خاصية الحروف الرسومية
NumGlyphs: = 1؛
/ / إزالة الصورة الرمزية القديمة.
الصورة الرمزية: = لا شيء;
/ / تخصيص واحد مخصص
الحروف الرسومية. GetBitmap (عدد صحيح (btn) ، Glyph) ؛
// gylph فوق النص
تخطيط: = blGlyphTop ؛
// شرح لاحقا
OnMouseUp: = HackNavMouseUp؛
النهاية;
النهاية; (* SetupHackedNavigator *)

حسنا ، دعنا نفسر. تقوم بالتكرار من خلال جميع الأزرار الموجودة في DBNavigator. تذكر أن كل زر يمكن الوصول إليه من خاصية صفيف Buttons المحمية - وبالتالي الحاجة لفئة THackDBNavigator. لأن نوع صفيف الأزرار هو TNavigateBtn ، تذهب من "الأول" (باستخدام منخفض وظيفة) الزر إلى "الأخير" (باستخدام عالي وظيفة) واحد. لكل زر ، يمكنك ببساطة إزالة الصورة الرمزية "القديمة" ، وتعيين الجديد (من المعلمة Glyphs) ، وإضافة التسمية التوضيحية من مجموعة Captions ووضع علامة على تخطيط الصورة الرمزية.

لاحظ أنه يمكنك التحكم في الأزرار التي يتم عرضها بواسطة DBNavigator (وليس الأزرار التي تم اختراقها) من خلال خاصية VisibleButtons الخاصة به. هناك خاصية أخرى قد ترغب في تغيير قيمتها الافتراضية وهي تلميحات — استخدمها لتوفير تلميحات التعليمات التي تختارها لزر التنقل الفردي. يمكنك التحكم في عرض التلميحات عن طريق تحرير خاصية ShowHints.

هذا هو. هذا هو السبب في أنك قد اخترت دلفي!

أعطنى المزيد!

لماذا توقف هنا؟ تعلم أنه عند النقر فوق الزر "nbNext" ، يتم تطوير موضع مجموعة البيانات الحالي إلى السجل التالي. ماذا لو كنت تريد الانتقال ، دعنا نقول ، 5 سجلات للأمام إذا كان المستخدم يحتفظ بمفتاح CTRL أثناء الضغط على الزر؟ ماذا عن ذلك؟

لا يحتوي DBNavigator "القياسي" على الحدث OnMouseUp —الذي يحمل المعلمة Shift الخاصة بـ TShiftState — مما يتيح لك اختبار حالة مفاتيح Alt و Ctrl و Shift. يوفر DBNavigator فقط حدث OnClick لك.

ومع ذلك ، يمكن لـ THackDBNavigator ببساطة كشف حدث OnMouseUp وتمكينك من "رؤية" حالة مفاتيح التحكم وحتى موضع المؤشر أعلى الزر المعين عند النقر عليه!

Ctrl + النقر: = 5 صفوف قبل

للكشف عن OnMouseUp ، يمكنك ببساطة تعيين إجراء معالجة الحدث المخصص الخاص بك إلى حدث OnMouseUp لزر DBNavigator الذي تم اختراقه. هذا بالضبط تم بالفعل في الإجراء SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp؛

الآن ، قد يبدو الإجراء HackNavMouseUp:

إجراء TForm1.HackNavMouseUp
(المرسل: TObject ؛ زر: TMouseButton.
التحول: TShiftState. س ، ص: عدد صحيح) ؛
مقدار ثابت MoveBy: integer = 5؛
startifليس (المرسل هو TNavButton) ثم خروج؛
قضية TNavButton (المرسل) من
nbPrior:
إذا (ssCtrl في Shift) ثم
TDBNavigator (TNavButton (Sender) .Parent).
مصدر البيانات. مجموعة البيانات. MoveBy (-MoveBy) ؛
نبسب التالي:
إذا (ssCtrl في Shift) ثم
TDBNavigator (TNavButton (Sender) .Parent).
مصدر البيانات. مجموعة البيانات. MoveBy (MoveBy) ؛
النهاية;
النهاية؛ (* HackNavMouseUp *)

لاحظ أنك تحتاج إلى إضافة توقيع الإجراء HackNavMouseUp داخل الجزء الخاص من إعلان النموذج (بالقرب من إعلان إجراء SetupHackedNavigator):

اكتب
TForm1 = صف دراسي(TForm)
...
privateprocedure SetupHackedNavigator (مقدار ثابت المستكشف: TDBNavigator ؛
مقدار ثابت رموزًا: TImageList) ؛
إجراء HackNavMouseUp (المرسل: TObject؛ زر: TMouseButton.
التحول: TShiftState. س ، ص: عدد صحيح) ؛
...

حسنا ، دعنا نفسر ، مرة أخرى. يعالج الإجراء HackNavMouseUp الحدث OnMouseUp لكل زر DBNavigator. إذا كان المستخدم يحتفظ بمفتاح CTRL أثناء النقر فوق الزر nbNext ، فسيتم نقل السجل الحالي لمجموعة البيانات المرتبطة "MoveBy" (المعرّف على أنه ثابت بقيمة 5) إلى الأمام.

ماذا؟ معقد؟

نعم. لا تحتاج إلى العبث بكل هذا إذا كنت بحاجة فقط إلى التحقق من حالة مفاتيح التحكم عند النقر فوق الزر. إليك كيفية القيام بالشيء نفسه في "العادي" حدث OnClick عن DBNavigator "العادي":

إجراء TForm1.DBNavigator1 انقر
(المرسل: TObject ؛ زر: TNavigateBtn) ؛
وظيفة CtrlDown: منطقية؛
فار
الحالة: TKeyboardState؛
ابدأ
GetKeyboardState (الولاية) ؛
النتيجة: = ((الحالة [vk_Control] و 128) 0) ؛
النهاية;
مقدار ثابت MoveBy: integer = 5؛
begincase زر من
nbPrior:
إذا CtrlDown ثم
DBNavigator1.DataSource. مجموعة البيانات. MoveBy (-MoveBy) ؛
نبسب التالي:
إذا CtrlDown ثم
DBNavigator1.DataSource. مجموعة البيانات. MoveBy (MoveBy) ؛
النهاية; //case
النهاية؛ (* DBNavigator2Click *)

هذا كل ما لدي أيها الناس

وأخيرا ، تم الانتهاء من المشروع. أو يمكنك الاستمرار. إليك سيناريو / مهمة / فكرة لك:

لنفترض أنك تريد زرًا واحدًا فقط لاستبدال أزرار nbFirst و nb Previous و nbNext و nbLast. يمكنك استخدام المعلمات X و Y داخل إجراء HackNavMouseUp للعثور على موضع المؤشر عند تحرير الزر. الآن ، إلى هذا الزر الواحد ("للحكم عليهم جميعًا") يمكنك إرفاق صورة بها 4 مناطق ، كل منطقة من المفترض أن تحاكي أحد الأزرار التي تقوم باستبدالها... حصلت على النقطة؟

instagram story viewer