आज हम लिबरऑफिस बेस (ओपनऑफिस बेस) में डेटा को संपादित करते समय डायलॉग बॉक्स के उपयोग को देखते हैं। जैसा कि हमने पिछले पोस्टों में पाया है, लिबरऑफिस बेस (ओपनऑफिस बेस) फॉर्म वास्तव में लिब्रे ऑफिस (ओपनऑफिस) राइटर टेक्स्ट एडिटर का एक उदाहरण है। प्रपत्र के अंदर विंडो इंटरफ़ेस को व्यवस्थित करने के लिए, डायलॉग्स का उपयोग किया जाता है - जो आसानी से अंतर्निहित विज़ुअल इंटरफ़ेस में बनाए जाते हैं, लेकिन डेटाबेस तालिकाओं के साथ संचार के लिए समर्थन नहीं है। हम इस कनेक्शन को OO बेसिक मैक्रोज़ के साथ व्यवस्थित करेंगे।
चलिए शुरू करते हैं। डेटाबेस में दो तालिकाएँ बनाएँ:
उत्पादों
- आईडी (पूर्णांक, प्राथमिक कुंजी)
- नाम (स्ट्रिंग)
आदेश
- आईडी (पूर्णांक, प्राथमिक कुंजी)
- productId (पूर्णांक)
- गिनती (पूर्णांक)
- दिनांक (डेटा प्रकार दिनांक)
ऑर्डर फॉर्म बनाएँ, फॉर्म एलिमेंट्स को फॉर्म के साथ जोड़ें। साथ ही आदेश डेटा स्रोत के साथ तालिका नियंत्रण। यह कैसे करें संदेशों
की एक श्रृंखला के
भाग 2 में चर्चा की गई थी।
दिनांक कॉलम के गुणों को सेट करते समय, कृपया तीर के साथ चित्र में चिह्नित गुणों पर ध्यान दें जो आपको वांछित प्रारूप में डेटा प्रदर्शित करने की अनुमति देते हैं और एक विशिष्ट तिथि का चयन करने के लिए ड्रॉप-डाउन कैलेंडर का उपयोग करते हैं।
अब, सही तालिका में, आप डेटा जोड़ और संशोधित कर सकते हैं। एक निश्चित बिंदु तक, यह सुविधाजनक है, टेबल प्रोसेसर वाले क्लाइंट के सामान्य कार्य के समान। लेकिन कुछ बिंदु पर, समस्याएं शुरू होती हैं जो टेबल प्रोसेसर के साथ काम करने की विशेषता भी हैं। डेटा को बेतरतीब ढंग से बदला जा सकता है वह भी बिना सूचना के। और देखा कि यह सब कुछ वापस करना असंभव है जैसा कि यह था। नए स्पीकर के लिए बहुत कम जगह है, और अप्रिय क्षैतिज स्क्रॉलिंग हो सकती है। स्तंभ शीर्षों की आकार सीमा भी होती है (अन्यथा वे क्षैतिज रूप से फिट नहीं होंगे), और यह डेटा का विस्तृत विवरण नहीं देता है।
एक आधे उपाय के रूप में, आप तालिका (पाठ नियंत्रण, संख्यात्मक नियंत्रण, आदि) के बगल में डेटा प्रविष्टि के लिए नियमित फ़ील्ड रख सकते हैं। आदेश तालिका के संबंधित फ़ील्ड को डेटा स्रोत के रूप में सेट करें और सब कुछ काम करेगा। किसी डेटासेट को नेविगेट करते समय, इनपुट फ़ील्ड का डेटा बदल जाएगा। इनपुट फ़ील्ड में डेटा बदलते समय, डेटाबेस तालिका में डेटा बदल जाएगा। लेकिन यह समाधान बहुत सुंदर नहीं लगेगा।
इसलिए, हम डायलॉग्स का उपयोग करके ऐसी कार्यक्षमता को लागू करते हैं। संवादों में एक महत्वपूर्ण सीमा होती है। डायलॉग प्रविष्टि फ़ील्ड डेटाबेस तालिका से संबंधित नहीं हैं। इसलिए, डेटाबेस तालिका से डायलॉग प्रविष्टि फ़ील्ड भरना, और इनपुट फ़ील्ड को डेटाबेस तालिका में सहेजना ओओ बेसिक मैक्रो के साथ करना होगा। हालांकि, यह अच्छा है, क्योंकि आपको OO बेसिक प्रोग्रामिंग विकल्पों पर विचार करने की अनुमति देता है (इससे पहले, मेरे संदेश केवल पर्यावरण के साथ काम करने का वर्णन करते थे, लेकिन यह सब आज की पोस्ट के लिए तैयारी था)।
डायलॉग एडिटर को लाने के लिए, आपको टूल्स-> मैक्रोज़-> ऑर्गनाइज करें मैक्रोज़-> लिबरऑफिस बेसिक-> ऑर्गनाइजर-> डायलॉग-> न्यू | एडिट | मेन्यू से डिलीट करें। मैं इस संपादक को पाने के लिए एक तेज़ तरीका चाहता हूँ। उसके बाद, संवाद संपादक (अफसोस, सबसे सुविधाजनक नहीं) खुल जाएगा, जिसमें हम डेटाबेस तालिका में फ़ील्ड के नाम के साथ फ़ील्ड बनाएंगे। जैसा कि आप याद करते हैं, संवाद स्वचालित रूप से डेटाबेस तालिकाओं से नहीं जुड़ता है, इसलिए हम ऐसा करने के लिए एक मैक्रो लिखेंगे। और एक नामकरण सम्मेलन के रूप में, चलो डेटाबेस तालिका के इनपुट फ़ील्ड और फ़ील्ड के नामों को समान करते हैं।
समाप्त रूप वाला एक संपादक कुछ इस तरह दिखेगा:
इसके बाद, डायलॉग में दो बटन जोड़ें। हम बटन को मनमाने ढंग से नाम देंगे, लेकिन डेटाबेस फ़ील्ड से उन्हें अलग करने के लिए एक अंडरस्कोर के साथ शुरू करना। गुण पैलेट में प्रत्येक बटन को एक कार्रवाई सौंपी जा सकती है। हम बटन पर कार्रवाई ठीक करते हैं - यह कार्रवाई की पुष्टि के साथ संवाद बंद कर देता है। और दूसरा - रद्द करें - यह कार्रवाई की पुष्टि किए बिना संवाद को बंद कर देता है।
संवाद संपादक को बंद करें, और प्रपत्र संपादक पर लौटें। एक बटन बनाएं जो डायलॉग को कॉल करता है और ऑर्डर_एडिट हैंडलर प्रक्रिया को असाइन करता है, जिसमें हम डेटाबेस टेबल FromBaseToDialog (oForm, oDialog) से डायलॉग को पॉप्युलेट करते हैं और डायलॉग डेटाबेस टेबल FromDialogToBase (oDialog, oForm) से डेटा को सेव करते हैं।
Sub Order_Edit(Event) Dim oDialog As Object Dim orders As Object orders = Thiscomponent.DrawPage.Forms.GetByName("orders") DialogLibraries.LoadLibrary("Standard") oDialog = CreateUnoDialog(DialogLibraries.Standard.dialogOrder) FromBaseToDialog(orders, oDialog) If oDialog.Execute() = 1 Then FromDialogToBase(oDialog, orders) orders.UpdateRow() End If End Sub Sub FromBaseToDialog(oForm, oDialog) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then ODialog.GetControl(sName).SetText(oForm.Columns.GetByName(sName).String) End If Next I End Sub Sub FromDialogToBase(oDialog, oForm) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then oForm.Columns.GetByName(sName).UpdateString(Trim(oDialog.GetControl(sName).GetText())) End If Next I End Sub
यह माना जाता है कि डायलॉग को मानक पुस्तकालय में डायलॉगऑर्डर के रूप में सहेजा गया था। स्वाभाविक रूप से, आप अन्य नाम चुन सकते हैं। अंडरस्कोर से शुरू होने वाले नियंत्रणों के नामों को छोड़ दिया जाता है और संसाधित नहीं किया जाता है। इसके अलावा, लेबल के साथ शुरू होने वाले नाम, जो टेक्स्ट फ़ील्ड हेडर के लिए उपयोग किए जाते हैं, संसाधित नहीं होते हैं।
ODialog.Execute () = 1 को कॉल करना फ़ॉर्म विंडो के अंदर डायलॉग प्रदर्शित करता है और मैक्रो को तब तक रोकता है जब तक कि ओके या रद्द बटन पर क्लिक न कर दिया जाए। जब आप ओके पर क्लिक करते हैं, तो रिटर्न वैल्यू एक के बराबर होती है।