डेल्फीमध्ये वापरकर्ता इंटरफेस तयार करण्यासाठी शिफारसी. डेल्फी डेल्फी इंटरफेस वर्णनात इंटरफेससह कार्य करण्याची वैशिष्ट्ये

व्हायबर डाउनलोड करा 23.01.2022
व्हायबर डाउनलोड करा

डेल्फी प्रोग्रामिंग वातावरणाची सर्वात मोठी ताकद म्हणजे त्याचे ओपन आर्किटेक्चर, जे डेल्फीला एक प्रकारचे मेटाप्रोग्रामिंग करण्याची परवानगी देते, ज्यामुळे तुम्हाला "प्रोग्रामिंग वातावरणाचा कार्यक्रम" करता येतो. हा दृष्टिकोन डेल्फीला अॅप्लिकेशन डेव्हलपमेंट सिस्टमच्या गुणात्मकरीत्या नवीन स्तरावर आणतो आणि तुम्हाला या उत्पादनामध्ये अतिरिक्त साधने एम्बेड करण्याची परवानगी देतो जी अॅप्लिकेशन सिस्टम तयार करण्याच्या जवळजवळ सर्व टप्प्यांना समर्थन देतात. डेल्फीमध्ये लागू केलेल्या तथाकथित ओपन इंटरफेसच्या संकल्पनेमुळे शक्यतांची अशी विस्तृत श्रेणी उघडते, जे IDE (इंटिग्रेटेड डेव्हलपमेंट एन्व्हायर्नमेंट) आणि बाह्य साधनांमधील दुवा आहेत.

हा लेख डेल्फीच्या खुल्या इंटरफेसवर लक्ष केंद्रित करतो आणि त्यांनी प्रदान केलेल्या वैशिष्ट्यांचे विहंगावलोकन प्रदान करतो. डेल्फी सहा सार्वजनिक इंटरफेस परिभाषित करते: टूल इंटरफेस, डिझाइन इंटरफेस, एक्सपर्ट इंटरफेस, फाइल इंटरफेस, एडिट इंटरफेस आणि व्हर्जन कंट्रोल इंटरफेस. या लेखाच्या चौकटीत आम्ही त्या प्रत्येकाच्या शक्यता तपशीलवार कव्हर करू शकू आणि स्पष्ट करू शकू अशी शक्यता नाही. डेल्फीचे स्त्रोत मजकूर तुम्हाला विचाराधीन मुद्दे अधिक सखोलपणे समजून घेण्यास मदत करतील, कारण विकसकांनी त्यांना तपशीलवार टिप्पण्या दिल्या आहेत. सार्वजनिक इंटरफेसचे प्रतिनिधित्व करणारे वर्ग घोषणा ...\Delphi\Source\ToolsAPI निर्देशिकेतील संबंधित मॉड्यूल्समध्ये असतात. डिझाईन इंटरफेस (मॉड्यूल DsgnIntf.pas) मालमत्ता संपादक आणि घटक संपादक तयार करण्याचे साधन प्रदान करते.

मालमत्ता आणि घटक संपादक हे वेगळ्या चर्चेसाठी योग्य विषय आहेत, म्हणून आम्ही फक्त लक्षात ठेवतो की जेव्हा तुम्ही संबंधित मालमत्तेचे मूल्य बदलण्याचा प्रयत्न करता तेव्हा मालमत्ता संपादक ऑब्जेक्ट इन्स्पेक्टरच्या वर्तनावर नियंत्रण ठेवतो आणि जेव्हा तुम्ही दुप्पट करता तेव्हा घटक संपादक सक्रिय होतो. फॉर्मवर ठेवलेल्या घटकाच्या प्रतिमेवर माऊसचे डावे बटण क्लिक करा. आवृत्ती नियंत्रण इंटरफेस (VCSIntf.pas मॉड्यूल) आवृत्ती नियंत्रण प्रणाली तयार करण्यासाठी डिझाइन केले आहे. आवृत्ती 2.0 पासून सुरू होणारी, डेल्फी इंटरसोलव्ह PVCS एकात्मिक आवृत्ती नियंत्रण प्रणालीला समर्थन देते, त्यामुळे बहुतेक प्रकरणांमध्ये आपली स्वतःची प्रणाली विकसित करणे आवश्यक नसते. या कारणास्तव, आम्ही आवृत्ती नियंत्रण इंटरफेसचा विचार देखील वगळू. फाइल इंटरफेस (FileIntf.pas मॉड्यूल) तुम्हाला IDE ची कार्यरत फाइल प्रणाली पुन्हा परिभाषित करण्याची परवानगी देते, ज्यामुळे फाइल्स संग्रहित करण्याचा तुमचा स्वतःचा मार्ग निवडणे शक्य होते (उदाहरणार्थ, डेटाबेस सर्व्हरवरील मेमो फील्डमध्ये). एडिट इंटरफेस (मॉड्यूल EditIntf.pas) स्त्रोत मजकूर बफरमध्ये प्रवेश प्रदान करते, जे तुम्हाला कोडचे विश्लेषण आणि व्युत्पन्न करण्यास, कोड एडिटर विंडोमध्ये कर्सरची स्थिती निर्धारित आणि बदलण्यास आणि स्त्रोत मजकूर वाक्यरचना हायलाइटिंग नियंत्रित करण्यास अनुमती देते.

विशेष वर्ग फॉर्मवर ठेवलेल्या घटकांना इंटरफेस प्रदान करतात (घटकाचा प्रकार परिभाषित करणे, पालक आणि मूल घटकांचे संदर्भ मिळवणे, गुणधर्मांमध्ये प्रवेश करणे, फोकस पास करणे, हटवणे इ.), फॉर्म स्वतःला आणि प्रकल्पाच्या संसाधन फाइलला. एडिट इंटरफेस तुम्हाला मॉड्यूलचा सोर्स कोड बदलणे, फॉर्ममध्ये बदल करणे, घटकाचे नाव बदलणे, सेव्ह करणे, नाव बदलणे किंवा हटवणे, प्रोजेक्ट रिसोर्स बदलणे यासारख्या घटनांना प्रतिसाद निर्धारित करणारे मॉड्यूल नोटिफायर्स ओळखण्याची परवानगी देते. फाईल, इ. टूल इंटरफेस (मॉड्यूल टूलइंटफ. पास) विकासकांना IDE च्या स्थितीबद्दल सामान्य माहिती मिळविण्याचे साधन प्रदान करते आणि प्रकल्प आणि वैयक्तिक फाइल्स उघडणे, जतन करणे आणि बंद करणे, मॉड्यूल तयार करणे, माहिती मिळवणे यासारख्या क्रिया करणे. वर्तमान प्रकल्प (मॉड्यूल आणि फॉर्मची संख्या, त्यांची नावे इ.), फाइल सिस्टमची नोंदणी करणे, वैयक्तिक मॉड्यूल्ससाठी इंटरफेस आयोजित करणे इ. मॉड्यूल नोटिफायर्स व्यतिरिक्त, टूल इंटरफेस अॅड-इन नोटिफायर्स परिभाषित करतो जे फायली आणि प्रकल्प उघडणे/बंद करणे, प्रोजेक्ट डेस्कटॉप फाइल लोड करणे आणि सेव्ह करणे, प्रोजेक्ट मॉड्यूल जोडणे/वगळणे, पॅकेजेस स्थापित करणे/अनइंस्टॉल करणे, प्रकल्प संकलित करणे, यांसारख्या घटनांबद्दल सूचित करतात. आणि मॉड्यूलर नोटिफायर्सच्या विपरीत, अॅड-इन नोटिफायर्स तुम्हाला काही इव्हेंट्सची अंमलबजावणी रद्द करण्याची परवानगी देतात.

याव्यतिरिक्त, टूल इंटरफेस डेल्फी आयडीईच्या मुख्य मेनूमध्ये प्रवेश करण्याचे एक साधन प्रदान करते, जे तुम्हाला त्यात अतिरिक्त आयटम एम्बेड करण्याची परवानगी देते. एक्सपर्ट इंटरफेस (मॉड्यूल ExptIntf.pas) हा तज्ञ तयार करण्यासाठी आधार आहे - सॉफ्टवेअर मॉड्यूल जे त्याची कार्यक्षमता वाढवण्यासाठी IDE मध्ये तयार केले जातात. डेल्फी डेटाबेस फॉर्म विझार्ड हे तज्ञांचे उदाहरण आहे, जे डेटाबेस टेबलमधील सामग्री पाहण्यासाठी आणि सुधारण्यासाठी एक फॉर्म तयार करते. तज्ञ वर्गाची व्याख्या केल्यावर, डेल्फीला आमच्या तज्ञाबद्दल "शिकते" याची खात्री करणे आवश्यक आहे. हे करण्यासाठी, RegisterLibraryExpert प्रक्रियेला कॉल करून, ते पॅरामीटर म्हणून तज्ञ वर्गाचे उदाहरण देऊन नोंदणी करणे आवश्यक आहे. उदाहरण म्हणून, esStandard शैलीमध्ये एक साधा तज्ञ तयार करूया, जो संबंधित डेल्फी मेनू आयटम निवडल्यावर, तो चालू असल्याचा संदेश दाखवतो. जसे तुम्ही वरील सारणीवरून पाहू शकता, esStandard शैलीला ओव्हरराइड करण्यासाठी सहा पद्धती आवश्यक आहेत:

तज्ञ "सक्रिय" होण्यासाठी, तुम्ही घटक/घटक स्थापित करा मेनू आयटम निवडणे आवश्यक आहे ... , ब्राउझ डायलॉगमध्ये तज्ञ असलेले मॉड्यूल (आमच्या बाबतीत exmpl_01.pas) निवडा, ओके क्लिक करा आणि संकलित केल्यानंतर मदत विभागातील डेल्फी मुख्य मेनूमधील dclusr30.dpk पॅकेज, सिंपल एक्सपर्ट 1 आयटम दिसला पाहिजे, निवडल्यावर, "स्टँडर्ड एक्सपर्ट सुरु झाले!" असा माहितीपूर्ण संदेश दिसेल. डेल्फी तज्ञ मेनू आयटम मदत विभागात का ठेवतो हे एक रहस्य आहे. मेन्यू आयटम डेल्फीमध्ये कुठेही दिसतो हे तुम्हाला आवडत नसल्यास, आणि तुम्हाला पाहिजे तेथे नाही, तर खालील पर्याय शक्य आहे: अॅड-इन शैलीमध्ये तज्ञ तयार करा, जे मेनू आयटमची स्वयंचलित निर्मिती काढून टाकते आणि टूल इंटरफेस वापरून मेनू आयटम "स्वतः" जोडा. हे तुम्हाला मुख्य मेनूमध्ये नवीन आयटमचे स्थान अनियंत्रित मार्गाने सेट करण्यास अनुमती देईल.

मेनू आयटम जोडण्यासाठी, TIToolServices वर्ग वापरला जातो - टूल इंटरफेसचा आधार - आणि TIMainMenuIntf, TIMenuItemIntf वर्ग जे IDE मुख्य मेनू आणि त्याच्या आयटमवर इंटरफेस लागू करतात. TIToolServices क्लासचा ToolServices इन्स्टँस IDE द्वारे स्वतः तयार केला जातो जेव्हा तो आरंभ केला जातो. लक्षात घ्या की डेल्फी मुख्य मेनू आणि त्यातील आयटमवर इंटरफेस सोडणे ही विकासकाची जबाबदारी आहे. वाटेत, तज्ञ सल्लागाराचा कार्यात्मक भार किंचित क्लिष्ट करूया: जेव्हा त्याचा मेनू आयटम सक्रिय केला जाईल, तेव्हा ते सध्या वातावरणात उघडलेल्या प्रकल्पाच्या नावाची माहिती जारी करेल: पॅरामीटर्स म्हणून, ते नवीन मेनू आयटमचा मजकूर, त्याचा अभिज्ञापक, नवीन आयटम समाविष्ट केलेल्या आयटमचा आयडेंटिफायर, कीचे प्रतीकात्मक प्रतिनिधित्व, जे Ctrl की सह एकत्रितपणे द्रुतपणे ऍक्सेस करण्यासाठी वापरले जाऊ शकते. नवीन आयटम, आणि नवीन आयटमच्या निवडीशी संबंधित इव्हेंट हँडलर. आम्ही घड्याळे आयटमच्या आधी दृश्य विभागात एक नवीन मेनू आयटम जोडला आहे.

आता नोटिफायर्सशी परिचित होऊ या. चला एक अॅड-इन नोटिफायर परिभाषित करू जे प्रकल्प बंद/उघडले जातात तेव्हा ट्रॅक करते आणि त्यानुसार सक्रिय प्रकल्पाचे नाव संचयित करणारे फील्ड समायोजित करते (आम्ही संक्षिप्ततेसाठी मागील उदाहरणाच्या तुलनेत बदललेल्या पद्धतींची अंमलबजावणी वगळतो): अंमलबजावणी करण्यासाठी अधिसूचक, आम्ही TAddInNotifier वर्ग परिभाषित केला आहे, जो TIAddInNotifier चा वंशज आहे आणि FileNotification ओव्हरराइड करतो. अॅड-इन नोटिफायर प्रतिसाद देऊ शकेल अशी एखादी घटना घडल्यावर प्रत्येक वेळी IDE या पद्धतीला कॉल करेल (अशी प्रत्येक घटना संबंधित TFileNotification प्रकार स्थिरांकाने दर्शविली जाते). TAddInNotifier वर्गातील तज्ञ फील्ड एखाद्या तज्ञाच्या अभिप्रायासाठी (TAddInNotifier.FileNotification पद्धत) सेवा देते. तज्ञांच्या डिस्ट्रक्टरमध्ये, नोटिफायरची नोंदणी रद्द केली जाते आणि नोटिफायर नष्ट केला जातो. आता मॉड्यूलर नोटिफायर्सचा वापर स्पष्ट करू. चला एक ऍड-इन तज्ञ तयार करूया जो प्रोजेक्ट फाइल सेव्ह करण्याच्या प्रत्येक कृतीबद्दल संदेश जारी करतो (संक्षिप्ततेसाठी, आम्हाला आधीच माहित असलेल्या पद्धतींची अंमलबजावणी दिली जात नाही): या उदाहरणात, ऍड-इन तज्ञ उघडण्याच्या अनुषंगाने इव्हेंट्सचे निरीक्षण करतो. / प्रकल्प बंद करणे.

प्रत्येक वेळी प्रोजेक्ट उघडल्यावर, प्रोजेक्ट फाइलशी संबंधित मॉड्यूल नोटिफायरची नोंदणी केली जाते. अंमलबजावणीच्या दृष्टीने, मॉड्युलर नोटिफायर्स अॅड-इन नोटिफायर्ससारखेच असतात: आम्ही TModuleNotifier वर्ग परिभाषित करतो जो TIModuleNotifier चा वंशज आहे आणि त्याच्या Notify आणि ComponentRenamed पद्धती ओव्हरराइड करतो. जेव्हा या मॉड्यूलशी संबंधित काही घटना घडतात तेव्हा IDE सूचित पद्धतीला कॉल करते; या पद्धतीमध्ये, एखाद्या विशिष्ट घटनेची प्रतिक्रिया निर्धारित केली जाते. जेव्हा मॉड्यूल फॉर्मवर असलेल्या घटकाचे नाव बदलते तेव्हा घटक पुनर्नामित पद्धत म्हणतात. कृपया लक्षात घ्या की आम्ही ही पद्धत वापरत नाही, परंतु आम्ही ती ओव्हरराइड केली पाहिजे, अन्यथा, जेव्हा घटकाचे नाव बदलते, तेव्हा बेस क्लासची अमूर्त पद्धत कॉल केली जाईल, ज्यामुळे अप्रत्याशित परिणाम होतात.

मॉड्यूल नोटिफायरची नोंदणी करणे हे नोटिफायर अॅड-इन नोंदणी करण्यापेक्षा काहीसे अधिक क्लिष्ट आहे: प्रथम आम्हाला मॉड्यूल इंटरफेस (TIModuleInterface) मिळतो आणि नंतर मॉड्यूल इंटरफेस वापरून नोटिफायरची नोंदणी करतो. जेव्हा प्रकल्प बंद असतो, तेव्हा मॉड्यूल नोटिफायर नोंदणीकृत नसतो (पुन्हा TIModuleInterface वापरून) आणि नोटिफायर नष्ट होतो. शेवटी, कोड एडिटर विंडोमध्ये तुम्ही कर्सरची स्थिती कशी ठरवू शकता ते आम्ही दाखवू. चला एक तज्ञ सल्लागार तयार करूया, जेव्हा योग्य मेनू आयटम निवडला जाईल, तेव्हा सक्रिय फाइलचे नाव आणि त्यात कर्सरची स्थिती असलेला संदेश प्रदर्शित करेल (केवळ या उदाहरणासाठी आवश्यक असलेल्या पद्धतींची अंमलबजावणी दिली आहे): कर्सरची स्थिती निश्चित करण्यासाठी, आम्हाला इंटरफेसचा खालील क्रम प्राप्त झाला पाहिजे: मॉड्यूल इंटरफेस (TIModuleInterface); कोड एडिटर इंटरफेस (TIEditorInterface); एडिटर विंडोमध्ये मॉड्यूल व्ह्यू इंटरफेस (TIEditView).

तज्ञ मेनू आयटम निवडताना स्त्रोत मजकूर (*.pas) असलेली सक्रिय फाइल सक्रिय असल्यास, सक्रिय फाइलचे नाव आणि त्यात कर्सरची वर्तमान स्थिती असलेला संदेश प्रदर्शित केला जातो. सक्रिय फाइल पास फाइल नसल्यास, कोणताही संदेश जारी केला जात नाही. सक्रिय फाइलचे नाव मिळविण्यासाठी TIToolServices वर्गाची GetCurrentFile पद्धत वापरली जाते. हे सार्वजनिक इंटरफेस वापरण्याच्या मार्गांबद्दलची आमची चर्चा समाप्त करते. CD-ROM मध्ये दिलेल्या सर्व उदाहरणांसाठी सोर्स कोड आहे. CD-ROM मध्ये अॅड-इन तज्ञ असलेले अधिक जटिल आणि विस्तारित उदाहरण देखील आहे जे वापरकर्त्याला डेल्फी मॉड्यूल्सचा स्त्रोत कोड बुकमार्क करण्यास अनुमती देते. bkmrks97.htm फाईलमध्ये बुकमार्क एक्सपर्ट स्थापित करण्यासाठी आणि वापरण्यासाठी एक द्रुत मार्गदर्शक आहे. म्हणून, या लेखात, सार्वजनिक इंटरफेसची सामान्य अटींमध्ये चर्चा केली आहे आणि त्यांच्या वापराची उदाहरणे दिली आहेत. पुन्हा एकदा, खुल्या इंटरफेसच्या स्त्रोत कोडच्या उपलब्धतेबद्दल धन्यवाद, तुम्हाला स्वारस्य असलेले तपशील सहजपणे समजू शकतात. आम्ही आशा करतो की खुल्या इंटरफेसद्वारे प्रदान केलेल्या विविध शक्यतांमुळे तुम्हाला एकापेक्षा जास्त धाडसी आणि उपयुक्त कल्पना मिळतील.

फक्त परिणामांसाठी

मुदतींचे कठोर पालन

पारदर्शकता

प्रकल्प अंमलबजावणी

भेट म्हणून तांत्रिक समर्थन

1C वर प्रोग्रामिंग, सुधारणा, सल्लामसलत

आम्ही कसे काम करत आहोत

1. आम्ही फोनद्वारे समस्येवर चर्चा करतो. आपल्याकडे दूरस्थ प्रवेश असल्यास - आपल्या संगणकाच्या स्क्रीनवर दर्शवा.

2. प्रकल्प मोठा असल्यास आम्ही रुबलमध्ये कामाचे मूल्यांकन करतो, नसल्यास - तासांची अंदाजे संख्या.

3. आम्ही काम पूर्ण करतो.

4. तुम्ही तुमच्या प्रोग्राममध्ये काम स्वीकारतो, जर काही कमतरता असतील तर आम्ही त्या दुरुस्त करतो.

5. आम्ही एक बीजक जारी करतो, तुम्ही पैसे द्या.

कामाची किंमत

1. सर्व कामे 3 श्रेणींमध्ये विभागली आहेत: सल्लामसलत, विशिष्ट कॉन्फिगरेशन अद्यतनित करणे, नवीन अहवाल विकसित करणे किंवा प्रोग्राम करणे, प्रक्रिया करणे, बटणे इ.

3. 10 तासांपेक्षा जास्त कामासाठी, कामाचे वर्णन आणि खर्चासह एक तांत्रिक कार्य आगाऊ तयार केले जाते. तुमच्यासोबत TOR मंजूर झाल्यानंतर काम सुरू होते.

तांत्रिक समर्थन

1. पूर्वी स्वीकारलेल्या कामांमध्ये तुम्हाला काही त्रुटी आढळल्यास, 3 महिन्यांच्या आत, आम्ही त्या विनामूल्य दुरुस्त करू.

2. नियमित ग्राहकांसाठी, आम्ही आमच्या कामातील कोणत्याही त्रुटी एका वर्षाच्या आत विनामूल्य दूर करतो.

तुमचा व्यवसाय व्यवस्थापित करण्यासाठी कार्यक्रम.

1C खरेदी करा: एंटरप्राइज

आम्ही 1C चे अधिकृत डीलर आहोत, तुम्ही आमच्याकडून विविध सॉफ्टवेअर उत्पादने आणि परवाने खरेदी करू शकता. "बॉक्स" खरेदी करण्याव्यतिरिक्त, आम्ही तुम्हाला प्रोग्राम सेट करण्यात, सल्लामसलत करण्यात आणि मूलभूत सेटिंग्ज करण्यात मदत करू.

  • हिशेब
  • स्टोअर ऑटोमेशन
  • घाऊक
  • इंस्टॉलेशन आणि प्रारंभिक सेटअपसाठी मदत पॅकेजमध्ये समाविष्ट आहे!
  • ग्राहकाच्या गरजा पूर्ण करणे, मानक कॉन्फिगरेशनमध्ये आवश्यक फंक्शन्सच्या अनुपस्थितीत नवीन मॉड्यूल्सचा विकास.
1c लेखांकन 1C: व्यापार व्यवस्थापन 1C: किरकोळ 1C: वेतन आणि मानव संसाधन व्यवस्थापन
3300 घासणे पासून. 6700 घासणे पासून. 3300 घासणे पासून. 7400 घासणे पासून.

सर्व्हर प्रदान करणे.

झटपट सेटअप सर्व्हर + 1C.

सर्व्हर नाही? काही फरक पडत नाही, आम्ही "क्लाउड" मध्ये सर्व्हर निवडू आणि त्वरीत सेट करू. थोड्या शुल्कासाठी, तुम्हाला एक अतिशय विश्वासार्ह उपाय मिळेल.

  • उपलब्धता 24\7
  • तुमचा स्वतःचा सिस्टम प्रशासक ठेवण्याची गरज नाही (बचत तुमच्या सर्व्हरची किंमत कव्हर करेल).
  • सर्व्हरवर 1C चा त्वरित सेटअप आणि इंस्टॉलेशन, 3 दिवसात तुमच्याकडे आधीपासूनच पूर्णपणे कार्यरत प्रणाली असेल.
  • कोणत्याही वेळी, समाधान तुम्हाला अनुकूल नसल्यास तुम्ही स्थानिक सर्व्हरवर जाऊ शकता.

तुमच्या 1C वरून SMS

ग्राहकांनी वेळेत जाहिराती आणि सवलतींबद्दल जाणून घ्यावे असे तुम्हाला वाटते का? ग्राहक परत येत नाहीत? 1C वरून थेट एसएमएस पाठवणे सेट करा!

आमची कंपनी 1C वरून थेट तुमच्या ग्राहकांना एसएमएस पाठवण्याचे सेटअप करण्यास सक्षम असेल. इव्हेंटची उदाहरणे जी स्वयंचलित केली जाऊ शकतात:

  • पुढील खरेदीनंतर लगेचच खरेदी आणि बोनस जमा केल्याबद्दल कृतज्ञता.
  • वाढदिवस/दुसऱ्या महत्त्वाच्या किंवा सुट्टीच्या दिवशी भेट म्हणून कार्डवर बोनस जमा.
  • वेअरहाऊस सूचना.
  • गिफ्ट व्हाउचरची मुदत संपली.
  • प्रीपेमेंटची पावती आणि मालाचे आरक्षण.
  • स्टोअर/ऑफिसच्या दिशानिर्देशांसह पत्ता, फोन नंबर.
  • इ.

1C मध्ये सेट करणे आमचे विशेषज्ञ किंवा आमचे कर्मचारी करू शकतात. आपण एसएमएस-टॅरिफ पृष्ठावरील टॅरिफशी परिचित होऊ शकता.

  • एसएमएस वितरण हमी, पैसे फक्त वितरित एसएमएससाठी काढले जातात.
  • प्रत्येक एसएमएससाठी स्वतंत्र बिलिंग.
  • विविध मार्गांनी शिल्लक पुन्हा भरणे.
  • पाठवलेल्या सर्व एसएमएसचा इतिहास कधीही पहा.
  • प्राप्तकर्त्याच्या फोनवर संख्यात्मक क्रमांकाऐवजी प्रेषकाचे नाव.

मला C++ कोडवरून डेल्फी क्लास वापरण्यात समस्या आहे. डेल्फी डीएलएल डेमो जे फंक्शन एक्सपोर्ट करते जे ऑब्जेक्ट रिटर्न करते.
माझा डेल्फी डीएल कोड यासारखा दिसतो:

लायब्ररी डेल्फी टेस्ट; // भाग वापरते.... टाइप करा IMyObject = इंटरफेस प्रक्रिया DoThis(n: Integer); फंक्शन DoThat: PWideChar; शेवट TMyObject = वर्ग(TInterfacedObject,IMyObject) प्रक्रिया DoThis(n: Integer); फंक्शन DoThat: PChar; शेवट // TMyObject अंमलबजावणी येथे जा ... प्रक्रिया TMyObject.DoThis(n: Integer); showmessage सुरू करा("तुम्ही DoThis मेथडला "+intToStr(n) +"पॅरामीटर" सह कॉल करत आहात); शेवट फंक्शन TMyObject.DoTat: PChar; showmessage सुरू करा("तुम्ही DoThat फंक्शनला कॉल करत आहात"); निकाल:= Pchar("Hello im Dothat"); शेवट

// निर्यात DLL कार्य:

फंक्शन CreateMyObject: IMyObject; stdcall;निर्यात; var txt: TextFile; असाइनफाइल सुरू करा(txt,"C:\log.log"); रीसेट (txt); लिहा(txt,"हॅलो"); परिणाम:= TMyObject.Create; शेवट निर्यात CreateMyObject;

माझ्या C++ प्रोजेक्टमध्ये मी IMyObject हा इंटरफेस याप्रमाणे घोषित केला आहे:

वर्ग IMyObject ( सार्वजनिक: IMyObject(); आभासी ~IMyObject(); आभासी शून्य DoThis(int n) = 0; आभासी char* DoThat() = 0; );

आणि माझे मुख्य कार्य खालीलप्रमाणे आहे:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); assert(hLib != NULL); // पास !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE,"hLibyCreate) "); जर (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // त्याला त्रुटी 127 मिळते ) इतर( printf("सक्सेस लोड\n");) IMyObject* objptr = pfnCreate(); objptr->हे करा(5); FreeLibrary(hLib); int in; scanf_s("%i", &in); परत करा 0; )

या उदाहरणात जेव्हा मी निर्यात केलेल्या फंक्शनमध्ये प्रवेश करण्याचा प्रयत्न केला तेव्हा मला रनटाइम त्रुटी आली. ओळ त्रुटी:
IMyObject* objptr = pfnCreate();

माझ्या उदाहरणात काय चूक आहे ते सांगू शकाल.
आणि शक्य असल्यास C++ कोडवरून डेल्फी क्लास (DLL मध्ये) ऍक्सेस करण्यासाठी कोणतेही कार्यरत उदाहरण.

उपाय

पहिली समस्या म्हणजे मेथड कन्व्हेन्शन कॉल करणे. डेल्फी इंटरफेस रजिस्टर वापरते जे डेल्फी विशिष्ट कॉलिंग कन्व्हेन्शन आहे. stdcall वापरणे उदाहरणार्थ, इंटरफेस पद्धतींसाठी.

पुढील समस्या C++ मध्ये आहे. तुमचा C++ इंटरफेस IUnknown मधून आला पाहिजे. तसेच, तो कन्स्ट्रक्टर किंवा डिस्ट्रक्टर घोषित करू नये.

त्याशिवाय, तुमचा डेल्फी कोड PWideChar निर्यात करतो जो char* वर मॅप करत नाही. तो wchar_t* वर मॅप करतो.

पुढे पाहता, PChar परत करणे येथे चांगले कार्य करते कारण तुमची अंमलबजावणी अक्षरशः परत करते. परंतु अधिक गंभीर कोड कदाचित डायनॅमिकली वाटप केलेली स्ट्रिंग वापरू इच्छित असेल, ज्या ठिकाणी तुमची रचना सदोष आहे.

लक्षात घ्या की सिस्टम ड्राइव्हच्या रूटमध्ये फाइल तयार करण्यासाठी तुम्ही एलिव्हेटेड अॅडमिनिस्ट्रेटर असणे आवश्यक आहे. तर हा अपयशाचा आणखी एक संभाव्य मुद्दा आहे.

मला आशा आहे की इतर बग आहेत, परंतु मला आतापर्यंत इतकेच सापडले आहे.

हा लेख मंचांवरील प्रश्नांवर आधारित आहे: "मी DLL वरून स्ट्रिंग कशी परत करू?", "मी रेकॉर्डचे अॅरे कसे पास करू आणि परत कसे करू?", "मी DLL ला फॉर्म कसा पास करू?".

जेणेकरून तुम्ही तुमचे अर्धे आयुष्य हे शोधण्यात घालवू नका - या लेखात मी सर्व काही चांदीच्या ताटात आणीन.

या लेखाच्या विषयांवर, वेगवेगळ्या प्रमाणात, या ब्लॉगमध्ये याआधीच एकापेक्षा जास्त वेळा स्पर्श केला गेला आहे, परंतु या लेखात ते एका ढिगाऱ्यात एकत्रित केले आहेत, औचित्य दिले आहे. थोडक्यात, DLL विकसित करणाऱ्यांवर या लेखाची लिंक टाकली जाऊ शकते.

महत्वाची नोंद: लेख वाचला पाहिजे सलग. कोड उदाहरणे फक्त म्हणून दिली आहेत उदाहरणे, लेखाच्या प्रत्येक पायरीवर (बिंदू) नवीन तपशीलांसह उदाहरणांचा कोड जोडला जातो. उदाहरणार्थ, लेखाच्या अगदी सुरुवातीला कोणतीही त्रुटी हाताळणी नाही, "क्लासिक" पद्धती सूचित केल्या आहेत (जसे की GetLastError , sdtcall अधिवेशने इ. वापरणे), ज्या लेखाच्या ओघात अधिक पुरेशा पद्धतींनी बदलल्या जातात. "नवीन" ("असामान्य") डिझाईन्स प्रश्न निर्माण करत नाहीत या कारणासाठी हे केले जाते. अन्यथा, प्रत्येक उदाहरणासह, एखाद्याला फॉर्मची एक टीप घालावी लागेल: "याची चर्चा खाली त्या परिच्छेदात केली आहे, परंतु ते - येथे येथे." कोणत्याही परिस्थितीत, लेखाच्या शेवटी लेखात सांगितलेल्या सर्व गोष्टी लक्षात घेऊन लिहिलेल्या तयार कोडची लिंक आहे. तुम्ही फक्त ते घेऊ शकता आणि वापरू शकता. आणि लेख का आणि का स्पष्ट करतो. तुम्हाला "का आणि का" मध्ये स्वारस्य नसल्यास - निष्कर्षापर्यंत शेवटपर्यंत स्क्रोल करा आणि उदाहरण डाउनलोड करण्यासाठी लिंक करा.



आम्ही वाचण्याची शिफारस करतो

शीर्षस्थानी