DBNavigator के साथ बटन बनाएं और कस्टमाइज़ करें

“ठीक है, DBNavigator डेटा नेविगेट करने और रिकॉर्ड प्रबंधित करने का अपना काम करता है। दुर्भाग्य से, मेरे ग्राहक कस्टम बटन ग्राफिक्स और कैप्शन की तरह अधिक उपयोगकर्ता के अनुकूल अनुभव चाहते हैं,... "

यह पूछताछ ए डेल्फी डेवलपर DBNavigator घटक की शक्ति को बढ़ाने के लिए एक रास्ता खोज रहा है।

DBNavigator एक महान घटक है- यह डेटा को नेविगेट करने और डेटाबेस अनुप्रयोगों में रिकॉर्ड को प्रबंधित करने के लिए VCR जैसा इंटरफ़ेस प्रदान करता है। रिकॉर्ड नेविगेशन फर्स्ट, नेक्स्ट, प्रायर और लास्ट बटन द्वारा दिया जाता है। रिकॉर्ड प्रबंधन संपादित करें, पोस्ट, रद्द करें, हटाएं, सम्मिलित करें और ताज़ा करें बटन द्वारा प्रदान किया जाता है। एक घटक में डेल्फी आपको अपने डेटा पर काम करने के लिए आवश्यक सभी चीजें प्रदान करता है।

हालाँकि, जैसा कि ई-मेल पूछताछ के लेखक ने भी कहा, DBNavigator में कस्टम ग्लिफ़, बटन कैप्शन और अन्य जैसी कुछ विशेषताओं का अभाव है।

एक अधिक शक्तिशाली DBNavigator

कई डेल्फी घटकों में उपयोगी गुण और विधियां हैं जो एक डेल्फी डेवलपर के लिए अदृश्य ("संरक्षित") चिह्नित हैं। उम्मीद है, घटक के ऐसे संरक्षित सदस्यों तक पहुंचने के लिए, "संरक्षित हैक" नामक एक सरल तकनीक का उपयोग किया जा सकता है।

instagram viewer

सबसे पहले, आप प्रत्येक DBNavigator बटन पर एक कैप्शन जोड़ेंगे, फिर आप कस्टम ग्राफिक्स जोड़ेंगे, और अंत में, आप प्रत्येक बटन को OnMouseUp- सक्षम कर सकते हैं।

"बोरिंग" DBNavigator से या तो:

  • मानक ग्राफिक्स और कस्टम कैप्शन
  • केवल कैप्शन
  • कस्टम ग्राफिक्स और कस्टम कैप्शन

चलो रॉक 'एन' रोल

DBNavigator में एक संरक्षित बटन संपत्ति है। यह सदस्य TNpeedButton के वंशज TNavButton की एक सरणी है।

चूंकि इस संरक्षित संपत्ति में प्रत्येक बटन TSpeedButton से विरासत में मिला है, अगर आपको इस पर हमारे हाथ मिलते हैं, तो आप "मानक" TSpeedButton गुणों के साथ काम करने में सक्षम होंगे: कैप्शन (एक स्ट्रिंग जो उपयोगकर्ता को नियंत्रण की पहचान करता है), ग्लिफ़ (बटन पर दिखाई देने वाला बिटमैप), लेआउट (यह निर्धारित करता है कि छवि या पाठ कहां दिखाई देता है बटन) ...

DBCtrls इकाई (जहाँ DBNavigator परिभाषित है) से आप "पढ़ा" है कि संरक्षित बटन संपत्ति के रूप में घोषित किया गया है:

बटन: सरणी[TNavigateBtn] का TNavButton;

जहां TNavButton से TNavButton विरासत में मिली है और 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 घटना फ़ॉर्म 1 के लिए, जैसे कॉल जोड़ें:

प्रक्रिया TForm1.FormCreate (प्रेषक: Tobject);
SetupHackedNavigator (DBNavigator1, ImageList1);
समाप्त;

सुनिश्चित करें कि आप इस प्रक्रिया की घोषणा को फॉर्म घोषणा के निजी भाग में जोड़ते हैं, जैसे:

प्रकार
TForm1 = कक्षा(TForm)
...
privateprocedure SetupHackedNavigator (स्थिरांक नेविगेटर: TDBNavigator;
स्थिरांक ग्लिफ़्स: TImageList);
...

चौथा, SetupHackedNavigator प्रक्रिया जोड़ें। SetupHackedNavigator प्रक्रिया प्रत्येक बटन पर कस्टम ग्राफिक्स जोड़ती है और प्रत्येक बटन पर एक कस्टम कैप्शन असाइन करती है।

का उपयोग करता है बटन; //!!! मत भूलना
प्रक्रिया TForm1.SetupHackedNavigator
(स्थिरांक नेविगेटर: TDBNavigator;
स्थिरांक ग्लिफ़्स: TImageList);
स्थिरांक
कैप्शन: सरणी[TNavigateBtn] स्ट्रिंग का =
('आरंभिक', 'पिछला', 'बाद में', 'अंतिम', 'जोड़ें')
'मिटा', 'सही', 'भेजें', 'वापस ले', 'पुनर्जीवित');
(*
कैप्शन: सरणी [TNavigateBtn] का स्ट्रिंग =
('प्रथम', 'पूर्व', 'अगला', 'अंतिम', 'सम्मिलित करें')
'डिलीट', 'एडिट', 'पोस्ट', 'कैंसल', 'रिफ्रेश');

क्रोएशिया में (स्थानीयकृत):
कैप्शन: सरणी [TNavigateBtn] का स्ट्रिंग =
('प्रवी', 'प्रथोद्नी', 'स्लीजेडेकी', 'जद्दनजी', 'दोधज')
'ओब्रीसी', 'प्रोमजेनी', 'स्प्रेमी', 'ओडस्टानी', 'ओसवाजी');
*)
वर
btn: TNavigateBtn;
beginfor btn: = कम (TNavigateBtn) सेवा उच्च (TNavigateBtn) के साथ करते हैं THackDBNavigator (नेविगेटर) .Buttons [btn] dobegin// कैप्शन कॉन्स्ट ऐरे से
कैप्शन: = कैप्शन [बीटीएन];
// ग्लिफ़ संपत्ति में छवियों की संख्या
NumGlyphs: = 1;
// पुराने ग्लिफ़ को हटा दें।
ग्लिफ़: = शून्य;
// कस्टम को असाइन करें
ग्लिफ़। गेटबिटमैप (इंटेगर (बीटीएन), ग्लिफ़);
// टेक्स्ट के ऊपर गाइलफ़
लेआउट: = blGlyphTop;
// बाद में समझाया गया
OnMouseUp: = HackNavMouseUp;
समाप्त;
समाप्त; (* SetupHackedNavigator *)

ठीक है, चलो समझाते हैं। आप DBNavigator में सभी बटनों के माध्यम से पुनरावृति करते हैं। याद रखें कि प्रत्येक बटन संरक्षित बटन सरणी संपत्ति से सुलभ है - इसलिए THackDBNavigator वर्ग की आवश्यकता है। चूंकि बटन प्रकार की सरणी TNavigateBtn है, आप "पहले" (उपयोग करके) से जाते हैं कम समारोह) बटन "पिछले" (का उपयोग करके) उच्च समारोह) एक। प्रत्येक बटन के लिए, आप बस "पुराने" ग्लिफ़ को हटा दें, नए को (ग्लिफ़्स पैरामीटर से) असाइन करें, कैप्शन सरणी से कैप्शन जोड़ें और ग्लिफ़ के लेआउट को चिह्नित करें।

ध्यान दें कि आप देख सकते हैं कि कौन से बटन एक DBNavigator (हैक नहीं किया गया) द्वारा दिखाई देते हैं। एक अन्य संपत्ति जिसका डिफ़ॉल्ट मान आप बदलना चाह सकते हैं, वह है- व्यक्तिगत नाविक बटन के लिए अपने चयन में मदद के संकेत देने के लिए इसका उपयोग करें। आप ShowHints संपत्ति का संपादन करके संकेत के प्रदर्शन को नियंत्रित कर सकते हैं।

बस। यही कारण है कि आप डेल्फी उठाया है!

मुझे और दो!

यहाँ क्यों रुके? आप जानते हैं कि जब आप 'nbNext' बटन पर क्लिक करते हैं, तो डेटासेट की वर्तमान स्थिति अगले रिकॉर्ड के लिए उन्नत होती है। यदि आप स्थानांतरित करना चाहते हैं, तो मान लें कि बटन दबाते समय उपयोगकर्ता CTRL कुंजी दबाए रखता है, तो 5 रिकॉर्ड आगे बढ़ेंगे। उस के बारे में कैसा है?

"मानक" DBNavigator में OnMouseUp ईवेंट नहीं है - वह जो TShiftState के Shift पैरामीटर को वहन करता है — आपको Alt, Ctrl, और Shift कुंजियों के लिए परीक्षण करने में सक्षम करता है। DBNavigator केवल आपको हैंडल करने के लिए OnClick ईवेंट प्रदान करता है।

हालाँकि, THackDBNavigator बस ऑनमॉउसअप घटना को उजागर कर सकता है और आपको क्लिक करते समय नियंत्रण कुंजी की स्थिति और यहां तक ​​कि विशेष बटन के ऊपर कर्सर की स्थिति को "देखने" के लिए सक्षम कर सकता है!

Ctrl + Click: = 5 पंक्तियाँ आगे बढ़ें

OnMouseUp को बेनकाब करने के लिए आप बस हैक किए गए DBNavigator के बटन के लिए OnMouseUp इवेंट में अपने कस्टम इवेंट हैंडलिंग प्रक्रिया को असाइन करते हैं। यह बिल्कुल पहले से SetupHackedNavigator प्रक्रिया में किया गया है:
OnMouseUp: = HackNavMouseUp;

अब, HackNavMouseUp प्रक्रिया दिख सकती है:

प्रक्रिया TForm1.HackNavMouseUp
(प्रेषक: Tobject; बटन: TMouseButton;
शिफ्ट: TShiftState; एक्स, वाई: इंटेगर);
स्थिरांक MoveBy: पूर्णांक = 5;
beginifनहीं (प्रेषक TNavButton है) फिर बाहर जाएं;
मामला TNavButton (प्रेषक)। इंडेक्स का
nbPrior:
अगर (शिफ्ट में ssCtrl) फिर
TDBNavigator (TNavButton (प्रेषक) .Parent)।
डेटा स्रोत। डेटासेट। MoveBy (-MoveBy);
nbNext:
अगर (शिफ्ट में ssCtrl) फिर
TDBNavigator (TNavButton (प्रेषक) .Parent)।
डेटा स्रोत। डेटासेट। MoveBy (MoveBy);
समाप्त;
समाप्त; (* HackNavMouseUp *)

ध्यान दें कि आपको प्रपत्र घोषणा के निजी भाग (SetupHackedNavigator प्रक्रिया के घोषणा के पास) के अंदर HackNavMouseUp प्रक्रिया के हस्ताक्षर जोड़ने की आवश्यकता है:

प्रकार
TForm1 = कक्षा(TForm)
...
privateprocedure SetupHackedNavigator (स्थिरांक नेविगेटर: TDBNavigator;
स्थिरांक ग्लिफ़्स: TImageList);
प्रक्रिया HackNavMouseUp (प्रेषक: Tobject; बटन: TMouseButton;
शिफ्ट: TShiftState; एक्स, वाई: इंटेगर);
...

ठीक है, चलो समझाते हैं, एक बार और। HackNavMouseUp प्रक्रिया प्रत्येक DBNavigator बटन के लिए OnMouseUp घटना को संभालती है। यदि उपयोगकर्ता nNNext बटन पर क्लिक करते समय CTRL कुंजी को पकड़े हुए है, तो लिंक किए गए डेटासेट के लिए वर्तमान रिकॉर्ड "MoveBy" (5 के मान के साथ स्थिर के रूप में परिभाषित) को स्थानांतरित कर दिया गया है।

क्या? Overcomplicated?

हां। आपको यह सब गड़बड़ करने की आवश्यकता नहीं है यदि आपको केवल बटन क्लिक करने पर नियंत्रण कुंजी की स्थिति की जांच करने की आवश्यकता है। यहाँ "सामान्य" में समान करने का तरीका बताया गया है घटना पर क्लिक करें "साधारण" DBNavigator के:

प्रक्रिया TForm1.DBNavigator1Click
(प्रेषक: Tobject; बटन: TNavigateBtn);
समारोह CtrlDown: बूलियन;
वर
राज्य: TKeyboardState;
शुरू
GetKeyboardState (राज्य);
परिणाम: = ((राज्य [vk_Control] और 128) 0);
समाप्त;
स्थिरांक MoveBy: पूर्णांक = 5;
begincase बटन का
nbPrior:
अगर CtrlDown फिर
DBNavigator1.DataSource। डेटासेट। MoveBy (-MoveBy);
nbNext:
अगर CtrlDown फिर
DBNavigator1.DataSource। डेटासेट। MoveBy (MoveBy);
समाप्त; //case
समाप्त; (* DBNavigator2Click *)

बस आज के लिए इतना ही

और अंत में, परियोजना की जाती है। या आप चलते रह सकते हैं। यहाँ आपके लिए एक परिदृश्य / कार्य / विचार है:

मान लें कि आप nbFirst, nbPrepret, nbNext और nbLast बटन को बदलने के लिए केवल एक बटन चाहते हैं। बटन जारी होने पर कर्सर की स्थिति जानने के लिए आप HackNavMouseUp प्रक्रिया के अंदर X, और Y मापदंडों का उपयोग कर सकते हैं। अब, इस एक बटन पर ("उन सभी पर शासन करने के लिए") आप एक तस्वीर संलग्न कर सकते हैं जिसमें 4 क्षेत्र हैं, प्रत्येक क्षेत्र को आपके द्वारा प्रतिस्थापित किए जा रहे बटन में से एक की नकल करने के लिए माना जाता है... बात मिल गई?