क्लायंट सर्व्हर ऍप्लिकेशन डेल्फीचे स्त्रोत. डेटाबेस तयार करणे. प्रत्येक क्लायंटसाठी अद्वितीय डेटा संचयित करणे

Symbian साठी 03.04.2019
चेरचर

तर प्रथम सर्व्हर घटकाबद्दल आयडीटीसीपीएससर्व्हर(बुकमार्क इंडी सर्व्हर). सर्व्हरची क्षमता वापरण्यासाठी, हा घटक फॉर्मवर (नॉन-डिस्पलेबल घटक) ठेवला जाणे आवश्यक आहे. घटक कॉन्फिगर करताना, खालील गुणधर्म उपयुक्त आहेत:

  • सक्रिय - सर्व्हर सक्रिय किंवा निष्क्रिय करते (डिफॉल्ट असत्य);
  • बाइंडिंग्ज - सर्व्हर सॉकेट्स कॉन्फिगर करते (त्यांना एका विशिष्ट संगणक पोर्टशी कनेक्ट करते, तुम्हाला प्रॉपर्टी सेटिंग्ज डायलॉग बॉक्स वापरून IP पत्ते आणि क्लायंट पोर्ट्सची श्रेणी सेट करण्याची परवानगी देते. बंधनकारक;
  • ListenQueue - एक संख्यात्मक मूल्य जे मर्यादित करते जास्तीत जास्त प्रमाणरांगेत उभे असलेल्या ग्राहकांकडून कनेक्शन विनंत्या;
  • मॅक्सकनेक्शन्स - तुम्हाला सर्व्हरशी कनेक्ट केलेल्या क्लायंटची कमाल संख्या मर्यादित करण्याची परवानगी देते;

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

तांदूळ. 1. मालमत्ता सेट करणे बंधनकारक.

या टप्प्यावर, तुम्ही सर्व्हर कॉन्फिगरेशन पूर्ण करू शकता (जरी IdTCPServer घटकाच्या सर्व क्षमता येथे वापरल्या जात नाहीत). क्लायंट विनंत्यांची प्रक्रिया करताना सर्व्हरचे मुख्य कार्य OneExecute इव्हेंट हँडलरमध्ये लागू केले जाऊ शकते. या हँडलरला TIdContext ऑब्जेक्ट - सर्व्हरशी कनेक्ट केलेल्या क्लायंटशी संबंधित थ्रेडचा संदर्भ दिला जातो.

या ऑब्जेक्टद्वारे (अधिक तंतोतंत, त्याची कनेक्शन गुणधर्म), आपण डेटा प्राप्त आणि पाठवू शकता, तसेच अनेक उपयुक्त कनेक्शन पॅरामीटर्स प्राप्त आणि सेट करू शकता. क्लायंट विनंतीवर प्रक्रिया करताना TIdContext ऑब्जेक्ट वापरण्याचे पहिले उदाहरण सूची 1 मध्ये दाखवले आहे. आता क्लायंट कसे कॉन्फिगर करायचे ते पाहू (IdTCPClient - टॅबइंडी क्लायंट

) जेणेकरून ते आमच्या सर्व्हरशी संवाद साधण्यास सक्षम असेल. TCP क्लायंट घटक वापरण्यासाठी, फक्त फॉर्मवर ठेवा (घटक देखील प्रदर्शित केला जात नाही).

  • यानंतर, कमीतकमी, तुम्हाला खालील गुणधर्म कॉन्फिगर करावे लागतील (खालील उदाहरणांमध्ये आवश्यकतेनुसार उर्वरित नमूद केले आहेत):
  • होस्ट - ज्या संगणकावर सर्व्हर चालू आहे त्याचे नाव किंवा IP पत्ता;

पोर्ट - सर्व्हर सॉकेट कनेक्ट केलेल्या पोर्टची संख्या.

सर्वसाधारणपणे, फॉर्म डेव्हलपमेंट स्टेजवर हे गुणधर्म देखील कॉन्फिगर करणे आवश्यक नाही. जर, उदाहरणार्थ, वापरकर्त्याला सर्व्हरचे नाव किंवा पत्ता निवडण्याची (किंवा प्रविष्ट करण्याची) संधी दिली गेली तर अनुप्रयोग अधिक लवचिक आहे.

मागील विभागात वर्णन केलेल्या घटकांसह कार्य करण्यास प्रारंभ करताना आयडीटीसीपीएससर्व्हरआणि आयडीटीसीपीक्लायंटचला एक साधा क्लायंट तयार करण्याचा विचार करूया- सर्व्हर अनुप्रयोग, ज्याचे क्लायंट आणि सर्व्हर भाग खालील कार्ये करतात.

  • क्लायंट ऍप्लिकेशन सर्व्हरशी कनेक्ट होते आणि वापरकर्त्याने प्रविष्ट केलेली स्ट्रिंग पाठवते, प्रतिसादाची प्रतीक्षा करते, सर्व्हरकडून प्राप्त केलेला मजकूर प्रदर्शित करते आणि सर्व्हरवरून डिस्कनेक्ट होते.
  • सर्व्हर ऍप्लिकेशनला क्लायंट ऍप्लिकेशनकडून एक स्ट्रिंग प्राप्त होते आणि प्रतिसाद (मजकूर देखील) पाठवते, त्यानंतर ते कनेक्शन बंद करते. तसेच, सेवा दिलेल्या ग्राहकांची संख्या मोजली जाते आणि ज्या संगणकावरून शेवटची विनंती आली होती त्याचा IP पत्ता लक्षात ठेवला जातो.

आमच्या बाबतीत सर्व्हर आणि क्लायंट दोन्ही अनुप्रयोगांची अंमलबजावणी अत्यंत सोपी आहे. सर्व्हर अनुप्रयोग प्रकल्प म्हणतात सिंपल सर्व्हर. सर्व्हर फॉर्मचे स्वरूप (अनुप्रयोग चालू असताना) अंजीर मध्ये दर्शविले आहे. 2.

तांदूळ. 2. साध्या सर्व्हरचे स्वरूप

मजकूर फील्ड ( संपादित करा) प्रक्रिया केलेल्या विनंत्यांच्या संख्येसह txtCount असे नाव दिले जाते आणि शेवटच्या सर्व्ह केलेल्या संगणकाच्या पत्त्यासह मजकूर फील्डला txtFrom असे नाव दिले जाते. सर्व्हरचे संपूर्ण कार्य घटकासाठी एक्झिक्युट इव्हेंटवर प्रक्रिया करणे आहे आयडीटीसीपीएससर्व्हरफॉर्मवर ठेवले (हा घटक पोर्ट 12340 ला संलग्न करा आणि सक्रिय गुणधर्म ट्रूवर सेट करा) (सूची 1).

सूची 1. साधी सर्व्हर अंमलबजावणी

प्रक्रिया TForm1.FormCreate(प्रेषक: TObject); प्रारंभ विभाग:= TCriticalSection.Create; शेवट प्रक्रिया TForm1.IdTCPServer1Execute(AContext: TIdContext); var strText: स्ट्रिंग; प्रारंभ करा // क्लायंट कडून एक स्ट्रिंग प्राप्त करा strText:= AContext.Connection.Socket.ReadLn;

// प्रतिसाद द्या AContext.Connection.Socket.WriteLn("ओळ घेतली: " + strText); //सर्व्हर फॉर्मवरील माहिती अपडेट करा (सर्व्हर मल्टी-थ्रेडेड आहे, // म्हणून आम्ही सिंक्रोनाइझेशन विभाग वापरतो. एंटर; Inc(प्रक्रिया केलेले, 1); txtCount.Text:= IntToStr(प्रक्रिया केलेले); txtFrom.Text:= AContext .Connection.Socket.Binding.PeerIP;//उपयोगकर्ता सोबत कनेक्शन बंद करा.क्लायंटला प्रतिसाद देताना, सर्व्हर केवळ मजकूर जोडून प्राप्त केलेल्या ओळीची पुनरावृत्ती करतो

"स्वीकारले:" ओळीच्या सुरूवातीस.विश्लेषण करत आहे

सूची 1 , तुम्ही लक्षात घेऊ शकता की प्रश्नातील सर्वात सोप्या सर्व्हरमध्ये देखील, आम्हाला गंभीर विभाग वापरून फॉर्मचे स्वरूप अद्यतनित करताना सिंक्रोनाइझेशन लागू करावे लागले (तुम्ही वापर विभागामध्ये SyncObjs मॉड्यूलचे नाव देखील जोडणे आवश्यक आहे).आता क्लायंट भाग (प्रोजेक्ट.) ची अंमलबजावणी पाहू

तांदूळ. 2. क्लायंटचे स्वरूप

साहजिकच, क्लायंट ऍप्लिकेशनने कार्य करण्यासाठी, फॉर्मवर घटकाचा एक उदाहरण ठेवला आहे आयडीटीसीपीक्लायंट(त्याचे नाव IDTCPClient1 आहे). या घटकाची पोर्ट प्रॉपर्टी १२३४० वर सेट करावी. मजकूर फील्ड ( संपादित करा) txtMessage नावाच्या नॉन-सर्व्हरला पाठवायची स्ट्रिंग प्रविष्ट करण्यासाठी. मजकूर फील्ड ( संपादित करा) ज्यामध्ये सर्व्हरचे नाव किंवा पत्ता प्रविष्ट केला जातो त्याला txtServer म्हणतात. उत्तर ओळींसह फील्ड ( मेमो) चे नाव txtResults आहे.

सर्व क्लायंट ऍप्लिकेशनचे काम एका बटणाच्या क्लिकवर केले जाते प्रक्रिया. संबंधित हँडलरचा मजकूर यात दिला आहे सूची 2.

सूची 2. साधे क्लायंट अंमलबजावणी

प्रक्रिया TForm1.Button1Click(प्रेषक: TObject); सुरू करा //सर्व्हरशी कनेक्ट करा आणि प्रविष्ट केलेला आदेश पाठवा IdTCPClient1.Host:= txtServer.Text;

IDTCPClient1.Connect;

IdTCPClient1.Socket.WriteLn(txtMessage.Text); txtMessage.Text:= "";

// प्रतिसादाची प्रतीक्षा करा आणि कनेक्शन बंद करा txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn);

IdTCPClient1.डिस्कनेक्ट करा; शेवट तेच आहे, आता तुम्ही सर्व्हर आणि क्लायंट (संगणकांच्या अनियंत्रित संख्येवर) चालवू शकता आणि त्यांच्या कामाचे परिणाम पाहू शकता.क्लायंट प्रोग्राम वापरून प्रवेश करण्यापूर्वी सर्व्हर सुरू करण्याचे लक्षात ठेवा. स्त्रोत कोड आयडीटीसीपीएससर्व्हरआणि . डेल्फी XE वर बनवलेले.नेटवर्कवर संगणकाचे निरीक्षण करणे (IdTCPServer, IdTCPClient)

आता अधिक पाहू

  • मनोरंजक उदाहरण
  • वापर
  • नेटवर्क घटक
  • IDTCPCLient

, जे नेटवर्क संगणकांच्या प्रशासनात गुंतलेल्या लोकांसाठी उपयुक्त असू शकते. सर्व्हर प्रोग्राम मॉनिटर केलेल्या संगणकावर प्री-लाँच केला जातो. या उदाहरणात, सर्व्हर प्रोग्राम क्लायंट प्रोग्रामला ज्या संगणकावर (सर्व्हर प्रोग्राम) चालू आहे त्याबद्दल खालील माहिती मिळविण्याची परवानगी देतो::

  • मॉनिटर रिझोल्यूशन;मॉनिटरसाठी रंग खोली; स्क्रीनची पूर्ण-आकाराची प्रत;स्क्रीनची एक प्रत, निर्दिष्ट आकारात कमी केली (किंवा मोठी).
  • निर्दिष्ट माहिती प्राप्त करण्यासाठी, क्लायंट प्रोग्रामने सर्व्हरला खालील पाठवणे आवश्यक आहे:स्ट्रिंग मूल्ये
  • get_screen_width- रुंदी मिळविण्यासाठी आणि
  • मिळवा_स्क्रीन_उंचीस्क्रीनची उंची पिक्सेलमध्ये मिळवण्यासाठी; मिळवा_स्क्रीन_रंग.

- मॉनिटरसाठी रंग खोलीचे मूल्य प्राप्त करण्यासाठी (बिट्स प्रति बिंदू); get_screen- स्क्रीनची पूर्ण-आकाराची प्रत मिळविण्यासाठी; get_screen: X, Y- आकारात कमी केलेली स्क्रीन कॉपी मिळवण्यासाठी X x Y.

क्लायंट विनंती हँडलर, सर्व्हरची मुख्य प्रक्रिया, सूची 3 मध्ये दर्शविली आहे.

सूची 3. क्लायंट विनंती हँडलर

प्रक्रिया TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var strText: स्ट्रिंग;

रुंदी, उंची, i: पूर्णांक;

dc:HDC; strText:= AThread.Connection.ReadLn; //जर strText = "get_screen_height" असेल तर //स्क्रीनची उंची AThread.Connection.WriteInteger(Screen.Height) परत करा, अन्यथा strText = "get_screen_width" असल्यास //स्क्रीनची रुंदी AThread.Connection.Ingerte.Integer परत करा. (स्क्रीन. रुंदी) अन्यथा strText = "get_screen_colors" असल्यास प्रारंभ करा // प्रति बिंदू बिट्सची संख्या परत करा dc:= GetDC(0); AThread.Connection.WriteInteger(GetDeviceCaps(dc, BITSPIXEL)); ReleaseDC(0, dc) end else if strText = "get_screen" नंतर //स्क्रीनची पूर्ण-आकाराची प्रत परत करा SendScreen(Screen.Width, Screen.Height, AThread.Connection) अन्यथा सुरू करा //a स्ट्रिंग जसे "get_screen: x, y" // वापरकर्त्याने उत्तीर्ण केलेली उंची आणि रुंदीची मूल्ये निश्चित करूया strText:= कॉपी(strText, 12, लांबी(strText) - 11); i:= Pos(", strText); //स्वल्पविराम स्थान रुंदी:= StrToInt(कॉपी(strText, 1, i - 1));

जसे आपण पाहू शकता, प्रश्नातील सर्व्हरचे सर्वात जटिल ऑपरेशन - प्रतिमेची कॉपी करणे - अशा मानक वर्गाच्या उपस्थितीमुळे अगदी सोप्या पद्धतीने अंमलात आणले जाते. TMemoryStream.

घटक आयडीटीसीपीएससर्व्हर(IdTCPServer1 नावाचे) या उदाहरणात पोर्ट 12341 शी संलग्न केले आहे (लक्षात ठेवा Active = True देखील सेट करा).

आता क्लायंट ऍप्लिकेशनच्या अंमलबजावणीबद्दल (प्रकल्प स्पायक्लायंट). ऑपरेशन दरम्यान क्लायंट फॉर्म (फॉर्म 1) चे स्वरूप अंजीर मध्ये दर्शविले आहे. 3 (हे स्पष्ट आहे की परीक्षण केलेल्या संगणकाच्या वापरकर्त्याने नुकताच माइनस्वीपर गेम गमावला आहे).

तांदूळ. 3

सर्वात व्यक्तिचलितपणे कॉन्फिगर केलेल्या गुणधर्मांचे वर्णन, नावे आणि मूल्ये महत्वाचे घटकक्लायंट फॉर्म तक्ता 1 मध्ये दर्शविले आहेत.

तक्ता 1.ट्रॅकिंग क्लायंट फॉर्मचे मुख्य घटक आणि त्यांचे गुणधर्म

क्लायंट ऍप्लिकेशन सर्व्हरच्या कनेक्शनसह सुरू होते. या ऑपरेशनसाठी कोड सूची 5 मध्ये दर्शविला आहे.

सूची 5. सर्व्हरशी कनेक्ट करत आहे

प्रक्रिया TForm1.cmbConnectClick(प्रेषक: TObject); सुरुवात करा cmbConnect.Caption = "कनेक्ट करा" नंतर txtServer.Text = "" असल्यास सुरू करा, नंतर //कोणतेही सर्व्हर नाव प्रविष्ट केले नाही MessageDlg("मजकूर फील्डमध्ये सर्व्हर मशीनचे नाव प्रविष्ट करा", mtInformation, , 0) अन्यथा प्रारंभ करा // सर्व्हरशी कनेक्ट करा IdTCPClient1.Host:= txtServer.Text;

IdTCPClient1.Connect वापरून पहा;

MessageDlg ("निर्दिष्ट सर्व्हरशी कनेक्ट करू शकत नाही", mtError, , 0) वगळता;

बाहेर पडणे;

शेवट end end else //सर्व्हर IdTCPClient1 वरून डिस्कनेक्ट करा. डिस्कनेक्ट करा; शेवटसर्व्हरशी कनेक्शन यशस्वी झाल्यास, TForm1.IdTCPClient1कनेक्टेड हँडलर कार्यान्वित केला जातो, सर्व्हरकडून नियतकालिक डेटा विनंत्यांसाठी क्लायंट अनुप्रयोग तयार करतो (सूची 6).

सूची 6. सर्व्हरशी कनेक्ट करताना केलेल्या क्रिया

प्रक्रिया TForm1.IdTCPClient1Connected(प्रेषक: TObject); start txtServer.Enabled:= False;

क्लायंट ऍप्लिकेशनचा सर्वात कठीण भाग म्हणजे सर्व्हरद्वारे पाठवलेल्या डेटावर प्रक्रिया करणे. क्लायंट ऍप्लिकेशन टाइमर डेटाची विनंती करतो आणि सूची 8 मध्ये दर्शविल्याप्रमाणे प्राप्त डेटावर प्रक्रिया करतो.

प्रक्रिया TForm1.Timer1Timer(प्रेषक: TObject); var प्रवाह: TMemoryStream; प्रारंभ करा // (IdTCPClient1) सह मॉनिटर केलेल्या संगणकाबद्दल सर्व्हरकडून डेटाची विनंती करा //...परवानगी लिहा ("get_screen_width");

WriteLn("get_screen_height"); lblResolution.Caption:= IntToStr(ReadInteger) + "x" + IntToStr(ReadInteger);//...रंग खोली WriteLn("get_screen_colors");

lblColors.Caption:= IntToStr(ReadInteger); //...स्क्रीन कॉपी //.....पहिला पर्याय - कॉम्प्रेशनशिवाय स्क्रीन कॉपी करणे //WriteLn("get_screen");//.....दुसरा पर्याय - सर्व्हरच्या बाजूने कॉम्प्रेशन WriteLn("get_screen:" + IntToStr(imgScreen.Width) + "," + IntToStr(imgScreen.Height)); //....डेटा प्रवाह मिळवा:= TMemoryStream.Create;रीडस्ट्रीम(प्रवाह);

प्रवाह. स्थान: = 0; //....प्रतिमा imgScreen.Picture.Bitmap.LoadFromStream(stream);प्रवाह.साफ;

प्रवाह.मुक्त; शेवट शेवटतुम्ही सर्व्हरच्या बाजूने इमेज स्केलिंगसह ट्रॅकिंग सर्व्हरकडून डेटा विनंत्यांदरम्यान मोठ्या कालावधीचा वापर करण्याचे सुचवू शकता (सर्व्हर मशीन खूप कमी-शक्ती असल्याशिवाय).

स्त्रोत कोड. डेल्फी 7 वर बनवले.

परिचय

हा लेख सॉकेट्स ("सॉकेट्स" - वर आधारित बोरलँड डेल्फीमध्ये क्लायंट/सर्व्हर आर्किटेक्चर ऍप्लिकेशन्स तयार करण्यासाठी समर्पित आहे. घरटे). सॉकेट्सच्या विषयावरील मागील लेखाच्या विपरीत, येथे आपण सर्व्हर ऍप्लिकेशन्स तयार करण्याकडे पाहू.

सहअस्तित्वासाठी हे लगेच लक्षात घेतले पाहिजे वैयक्तिक अनुप्रयोगक्लायंट आणि सर्व्हरला एकाधिक संगणक असण्याची आवश्यकता नाही. फक्त एक असणे पुरेसे आहे ज्यावर आपण एकाच वेळी सर्व्हर आणि क्लायंट दोन्ही चालवू शकता. या प्रकरणात, आपण ज्या संगणकाशी कनेक्ट करू इच्छिता त्या संगणकाचे नाव म्हणून आपल्याला होस्ट नाव वापरण्याची आवश्यकता आहेलोकलहोस्ट 127.0.0.1 .

किंवा IP पत्ता -

तर, सिद्धांतासह प्रारंभ करूया. जर तुम्ही खात्रीपूर्वक अभ्यासक असाल (आणि तुमच्या डोळ्यांनी कोणतेही अल्गोरिदम पाहू शकत नाही), तर तुम्ही हा विभाग वगळला पाहिजे.

सॉकेट सर्व्हर ऑपरेशन अल्गोरिदम

सॉकेट सर्व्हर तुम्हाला काय करण्याची परवानगी देतो?.. ते कोणत्या तत्त्वावर कार्य करते?.. सॉकेट प्रोटोकॉलवर आधारित सर्व्हर तुम्हाला एकाच वेळी अनेक क्लायंटना सेवा देण्याची परवानगी देतो. शिवाय, तुम्ही त्यांच्या नंबरची मर्यादा स्वतः निर्दिष्ट करू शकता (किंवा ही मर्यादा पूर्णपणे काढून टाकू शकता, जसे की डीफॉल्टनुसार केली जाते). प्रत्येक कनेक्ट केलेल्या क्लायंटसाठी, सर्व्हर एक स्वतंत्र सॉकेट उघडतो ज्याद्वारे आपण क्लायंटसह डेटाची देवाणघेवाण करू शकता.

  • दुसरा उत्तम उपाय म्हणजे प्रत्येक कनेक्शनसाठी स्वतंत्र प्रक्रिया (थ्रेड) तयार करणे. चला आकृती अधिक तपशीलवार पाहू:
  • पोर्ट आणि सर्व्हरटाइप गुणधर्मांची व्याख्या - क्लायंट सामान्यपणे सर्व्हरशी कनेक्ट होण्यासाठी सक्षम होण्यासाठी, सर्व्हरद्वारे वापरलेले पोर्ट क्लायंटने वापरलेल्या पोर्टशी (आणि उलट) तंतोतंत जुळणे आवश्यक आहे. सर्व्हरटाइप गुणधर्म कनेक्शन प्रकार निर्धारित करते (अधिक तपशीलांसाठी खाली पहा););
  • सॉकेट उघडत आहे - सॉकेट आणि निर्दिष्ट पोर्ट उघडणे.
  • येथेच आम्ही आपोआप क्लायंट कनेक्ट होण्याची प्रतीक्षा करू लागतो ( ऐका
  • क्लायंट कनेक्ट करणे आणि त्याच्याशी डेटाची देवाणघेवाण करणे - येथे क्लायंट त्याच्याशी डेटा कनेक्ट आणि एक्सचेंज करतो. आपण या लेखात आणि सॉकेट्स (क्लायंट भाग) बद्दलच्या लेखात या स्टेजबद्दल अधिक जाणून घेऊ शकता;

हे नोंद घ्यावे की गुण 3-4 अनेक वेळा पुनरावृत्ती होते, म्हणजे. हे चरण प्रत्येक नवीन क्लायंट कनेक्शनसाठी केले जातात.

नोंद : सध्या डेल्फीमधील सॉकेट्सवर फारच कमी दस्तऐवजीकरण आहे, त्यामुळे जर तुम्हाला या विषयाचा शक्य तितका खोलवर अभ्यास करायचा असेल, तर मी तुम्हाला युनिक्स/लिनक्स सिस्टीमवरील साहित्य आणि इलेक्ट्रॉनिक दस्तऐवजीकरण पाहण्याचा सल्ला देतो - तेथे खूपसॉकेट्ससह काम करण्याच्या सिद्धांताचे चांगले वर्णन केले आहे. याव्यतिरिक्त, या OS साठी सॉकेट ऍप्लिकेशन्सची अनेक उदाहरणे आहेत (जरी मुख्यतः C/C++ आणि Perl मध्ये).

TServerSocket घटकाचे संक्षिप्त वर्णन

येथे आपण परिचित होऊ मुख्यघटकाचे गुणधर्म, पद्धती आणि घटना TSserverSocket.

गुणधर्म पद्धती कार्यक्रम
सॉकेट - TServerWinSocket वर्ग, ज्याद्वारे तुम्हाला सॉकेट चॅनेल उघडण्यासाठी प्रवेश आहे. पुढे आम्ही या मालमत्तेचा अधिक तपशीलवार विचार करू, कारण खरं तर, ते मुख्यांपैकी एक आहे. प्रकार: TSserverWinSocket ;
सर्व्हर प्रकार - सर्व्हर प्रकार. दोन मूल्यांपैकी एक घेऊ शकता: stNonBlocking - समकालिक कार्यक्लायंट सॉकेटसह. या प्रकारच्या सर्व्हरसह आपण इव्हेंटद्वारे क्लायंटसह कार्य करू शकता OnClientReadआणि OnClientWrite. stThreadBlocking- असिंक्रोनस प्रकार. प्रत्येक क्लायंट सॉकेट चॅनेलसाठी स्वतंत्र प्रक्रिया (थ्रेड) तयार केली जाते. प्रकार: TSserverType ;
ThreadCacheSize - क्लायंट प्रक्रियांची संख्या (थ्रेड) जी सर्व्हरद्वारे कॅश केली जाईल. येथे तुम्हाला तुमच्या सर्व्हरवरील लोडवर अवलंबून सरासरी मूल्य निवडण्याची आवश्यकता आहे. कॅशिंग प्रत्येक वेळी एक वेगळी प्रक्रिया तयार करू नये आणि बंद सॉकेट नष्ट करू नये, परंतु नंतरच्या वापरासाठी त्यांना सोडण्यासाठी होते. प्रकार: पूर्णांक ;
सक्रिय - दिलेल्या क्षणी सर्व्हर सक्रिय आहे की नाही याचे सूचक. ते खरे तर मूल्य आहे खरेसूचित करते की सर्व्हर चालू आहे आणि क्लायंट प्राप्त करण्यासाठी तयार आहे, आणि खोटे- सर्व्हर बंद आहे. सर्व्हर सुरू करण्यासाठी, तुम्हाला फक्त ही मालमत्ता सेट करण्याची आवश्यकता आहे खरे. प्रकार: बुलियन ;
बंदर - क्लायंटसह कनेक्शन स्थापित करण्यासाठी पोर्ट क्रमांक. सर्व्हर आणि क्लायंट पोर्ट समान असणे आवश्यक आहे. 1025 ते 65535 पर्यंतच्या मूल्यांची शिफारस केली जाते, कारण 1 ते 1024 पर्यंत - सिस्टमद्वारे व्यापले जाऊ शकते. प्रकार: पूर्णांक ;
सेवा - सेवा परिभाषित करणारी स्ट्रिंग ( एफटीपी, http, पॉप, इ.) ज्याचे पोर्ट वापरले जाईल. विविध मानक प्रोटोकॉलशी संबंधित पोर्ट क्रमांकांची ही एक प्रकारची निर्देशिका आहे. प्रकार: स्ट्रिंग ;
उघडा - सर्व्हर सुरू करतो. मूलत: ही आज्ञा मूल्य नियुक्त करण्यासारखीच आहे खरेमालमत्ता सक्रिय;
बंद करा - सर्व्हर थांबवतो. मूलत: ही आज्ञा मूल्य नियुक्त करण्यासारखीच आहे खोटेमालमत्ता सक्रिय.
OnClientConnect - जेव्हा क्लायंटने सॉकेट कनेक्शन स्थापित केले असेल आणि सर्व्हरकडून प्रतिसादाची वाट पाहत असेल तेव्हा उद्भवते ( OnAccept);
OnClientDisconnect - जेव्हा क्लायंट सॉकेट चॅनेलवरून डिस्कनेक्ट होतो तेव्हा उद्भवते;
OnClientError - जेव्हा वर्तमान ऑपरेशन अयशस्वी होते तेव्हा उद्भवते, म्हणजे
OnClientRead एक त्रुटी आली; - जेव्हा क्लायंटने सर्व्हरला काही डेटा पास केला तेव्हा उद्भवते. हा डेटा पास करण्यायोग्य पॅरामीटरद्वारे प्रवेश केला जाऊ शकतो;
OnClientWrite सॉकेट: TCustomWinSocket
- जेव्हा सर्व्हर क्लायंटला सॉकेटवर डेटा पाठवू शकतो तेव्हा उद्भवते; OnGetSocket - या कार्यक्रमाच्या हँडलरमध्ये तुम्ही पॅरामीटर संपादित करू शकता;
क्लायंटसॉकेट OnGetThread - या इव्हेंटच्या हँडलरमध्ये तुम्ही पॅरामीटर नियुक्त करून प्रत्येक वैयक्तिक क्लायंट चॅनेलसाठी एक अद्वितीय प्रक्रिया (थ्रेड) परिभाषित करू शकता.सॉकेटथ्रेड
इच्छित सबटास्क TServerClientThread; , OnThreadStart OnThreadEnd
OnAccept - जेव्हा उपकार्य (प्रक्रिया, थ्रेड) अनुक्रमे सुरू किंवा थांबवले जाते तेव्हा उद्भवते;
- जेव्हा सर्व्हर क्लायंटला स्वीकारतो किंवा त्याला कनेक्शन नाकारतो तेव्हा उद्भवते; ऐका

- जेव्हा सर्व्हर क्लायंट कनेक्ट होण्यासाठी प्रतीक्षा मोडमध्ये जातो तेव्हा उद्भवते.

TSserverSocket.Socket(TSServerWinSocket) OnClientReadतर सर्व्हर क्लायंटला डेटा कसा पाठवू शकतो? डेटा प्राप्त करण्याबद्दल काय? OnClientWriteमुख्यतः जर तुम्ही इव्हेंटद्वारे काम करत असाल

  • आणि (पूर्णांक, नंतर तुम्ही ClientSocket (TCustomWinSocket) पॅरामीटरद्वारे क्लायंटशी संवाद साधू शकता. क्लायंट सॉकेट्सबद्दलच्या लेखात आपण या वर्गासह काम करण्याबद्दल वाचू शकता, कारण या वर्गाद्वारे डेटा पाठवणे/पाठवणे समान आहे - पद्धती (पाठवा/प्राप्त करा)(मजकूर, बफर, प्रवाह). TServerSocket.Socket सह काम करताना हेच लागू होते. तथापि, कारण येथे आम्ही सर्व्हरचा विचार करत आहोत, आम्ही काही उपयुक्त गुणधर्म आणि पद्धती हायलाइट केल्या पाहिजेत:
  • सक्रिय कनेक्शन () - कनेक्ट केलेल्या क्लायंटची संख्या; ActiveThreads पूर्णांक () - चालू असलेल्या प्रक्रियेची संख्या;जोडण्या
    ॲरे
    ) - प्रत्येक कनेक्ट केलेल्या क्लायंटसाठी स्वतंत्र TClientWinSocket वर्गांचा समावेश असलेला ॲरे. उदाहरणार्थ, ही आज्ञा:
  • ServerSocket1.Socket.Connections.SendText("हॅलो!"); (पूर्णांकपहिल्या कनेक्ट केलेल्या क्लायंटला "हॅलो!" संदेश पाठवते. या ॲरेच्या घटकांसह कार्य करण्यासाठी कमांड - देखील (पाठवा/प्राप्त करा)(मजकूर, बफर, प्रवाह); ThreadCacheSize);
  • IdleThreads, ) - विनामूल्य प्रक्रियांची संख्या. अशा प्रक्रिया सर्व्हरद्वारे कॅश केल्या जातात (पहा, स्थानिक पत्ता LocalHost लोकलपोर्ट- अनुक्रमे -
  • स्थानिक IP पत्ता, , होस्टनाव, पोर्ट;, दूरस्थ पत्ता LocalHost रिमोटहोस्ट- अनुक्रमे -
  • रिमोटपोर्ट दूरस्थ IP पत्ताआणि पद्धतीकुलूप

अनलॉक करा

आता विशिष्ट उदाहरण वापरून वरील गोष्टी पाहू. तुम्ही क्लिक करून तयार स्रोत डाउनलोड करू शकता.

तर, TServerSocket सह काम करण्याचे एक चांगले उदाहरण पाहूया (हे उदाहरण सर्वात जास्त आहे व्हिज्युअल मदतया घटकाचा अभ्यास करण्यासाठी). खालील स्रोत सर्व महत्त्वाच्या सर्व्हर इव्हेंटचे लॉगिंग प्रदर्शित करतात, तसेच मजकूर संदेश प्राप्त करण्याची आणि पाठवण्याची क्षमता दर्शवतात:

उदाहरण १.लॉगिंग आणि सर्व्हरच्या ऑपरेशनचा अभ्यास करणे, सॉकेटद्वारे संदेश पाठवणे/प्राप्त करणे.

(...येथे फाईल हेडर आणि TForm1 ची व्याख्या आणि त्याचे उदाहरण Form1 आहे) (संपूर्ण स्त्रोत पहा) प्रक्रिया TForm1.Button1Click(प्रेषक: TObject); सुरू (पोर्ट निश्चित करा आणि सर्व्हर सुरू करा) सर्व्हरसॉकेट1.पोर्ट:= 1025; (इन्सर्ट पद्धत निर्दिष्ट स्थानावर ॲरेमध्ये स्ट्रिंग घालते) Memo2.Lines.Insert(0,"सर्व्हर सुरू होत आहे"); सर्व्हरसॉकेट1.ओपन; शेवट प्रक्रिया TForm1.Button2Click(प्रेषक: TObject); सुरू (सर्व्हर थांबवा) ServerSocket1.Active:= False; Memo2.Lines.Insert(0,"सर्व्हर थांबला"); शेवट प्रक्रिया TForm1.ServerSocket1Listen(प्रेषक: TObject; सॉकेट: TCustomWinSocket); सुरू (येथे सर्व्हर क्लायंटसाठी सॉकेटवर "ऐकत" आहे) Memo2.Lines.Insert(0,"पोर्टवर ऐकत आहे"+IntToStr(ServerSocket1.Port)); शेवट प्रक्रिया TForm1.ServerSocket1Accept(प्रेषक: TObject; सॉकेट: TCustomWinSocket); Memo2.Lines.Insert(0,"आता सॉकेटवर लिहू शकतो"); शेवट प्रक्रिया TForm1.ServerSocket1GetSocket(प्रेषक: TObject; सॉकेट: पूर्णांक; var ClientSocket: TServerClientWinSocket);< "+Edit1.Text); end;

Memo2.Lines.Insert(0,"Get socket");

शेवट

प्रक्रिया TForm1.ServerSocket1GetThread(प्रेषक: TObject; क्लायंटसॉकेट: TServerClientWinSocket; var SocketThread: TServerClientThread); Memo2.Lines.Insert(0,"Get Thread");शेवट प्रक्रिया TForm1.ServerSocket1ThreadEnd(प्रेषक: TObject; थ्रेड: TServerClientThread); start Memo2.Lines.Insert(0,"थ्रेड एंड");

शेवट

प्रक्रिया TForm1.ServerSocket1ThreadStart(प्रेषक: TObject; थ्रेड: TServerClientThread);

start Memo2.Lines.Insert(0,"थ्रेड स्टार्ट"); शेवटप्रक्रिया TForm1.Button3Click(प्रेषक: TObject); var i: पूर्णांक;)

सुरू

हे JINX च्या विनंतीनुसार देखील आहे :-). त्याबद्दल त्यांचे खूप खूप आभार! म्हणून, सर्वप्रथम, हे लक्षात घेतले पाहिजे की सॉकेटद्वारे पाठविलेला डेटा केवळ एका ब्लॉकमध्ये एकत्र केला जाऊ शकत नाही तर अनेक ब्लॉक्समध्ये विभक्त देखील केला जाऊ शकतो.
वस्तुस्थिती अशी आहे की सॉकेट हा एक नियमित प्रवाह आहे, परंतु फाइल स्ट्रीम (TFileStream) च्या विपरीत, तो डेटा अधिक हळू हस्तांतरित करतो (आपल्याला समजते - नेटवर्क, मर्यादित रहदारी इ.). म्हणूनच दोन आज्ञा:
ServerSocket1.Socket.Connections.SendText("हॅलो,");
ServerSocket1.Socket.Connections.SendText("world!");
एका आदेशाशी पूर्णपणे समान:

ServerSocket1.Socket.Connections.SendText("हॅलो, वर्ल्ड!"); आणि म्हणूनच, जर तुम्ही सॉकेटद्वारे 100 KB ची फाईल पाठवली, तर तुम्ही ज्या व्यक्तीला हा ब्लॉक पाठवला आहे त्या व्यक्तीला अनेक ब्लॉक्स मिळतील जे ट्रॅफिक आणि लाईन कंजेशनवर अवलंबून असतात. शिवाय, आकार समान असणे आवश्यक नाही. फाइल किंवा इतर कोणताही डेटा स्वीकारण्यासाठी ते खालीलप्रमाणे आहेमोठा आकार तुम्ही डेटाचे ब्लॉक्स स्वीकारले पाहिजेत आणि नंतर ते एका संपूर्ण मध्ये एकत्र करावेत (आणि ते फाइलमध्ये सेव्ह करा, उदाहरणार्थ).उत्तम उपाय हे कार्य समान फाइल प्रवाह आहे - TFileStream (किंवा मेमरीमधील प्रवाह - TMemoryStream). आपण वापरून ऑनरीड (ऑनक्लायंटरीड) इव्हेंटद्वारे सॉकेटमधून डेटाचे तुकडे प्राप्त करू शकता सार्वत्रिक पद्धतबफ प्राप्त करा . आपण पद्धत वापरून परिणामी ब्लॉकचा आकार निर्धारित करू शकताप्राप्तीची लांबी

. तुम्ही सॉकेट स्ट्रीम देखील वापरू शकता (TClientSocket बद्दल लेख पहा). आणि येथे एक लहान उदाहरण आहे (अंदाजे):

सॉकेटचे निरीक्षण कसे करावे

हा मुद्दा गुंतागुंतीचा आहे आणि दीर्घ विचार करणे आवश्यक आहे. आत्तासाठी, मी फक्त लक्षात ठेवेन की आपण नेहमी आपल्या प्रोग्रामद्वारे तयार केलेल्या सॉकेटचे निरीक्षण करू शकता :-).

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

सामान्य प्रश्न ) जेणेकरून इतर वापरकर्ते तुमचा प्रश्न पाहू शकतील आणि त्याचे उत्तर देण्याचा प्रयत्न करू शकतील!करिख निकोले (

नायट्रो ). मॉस्को प्रदेश, झुकोव्स्कीचला उघडूया प्रकल्प फाइल/जतन करा... ज्या फोल्डरमध्ये डेटाबेस सेव्ह केला आहे त्याच फोल्डरमध्ये प्रोजेक्ट सेव्ह करू. फोल्डर पत्ता C:\DBIBEतज्ञ . चला वाचवूया पास फाइलनावाखाली TelSprav1.pas , ए डीपीआरफाइल TelSprav.dpr . मालमत्तेत या विंडोमध्ये मथळाचला लिहू « टेलिफोन निर्देशिका», मालमत्तेत नावआम्ही लिहितो "TelefonSprav". फॉर्मवर एक घटक टाका मुख्य मेनूआणि त्यावर डबल-क्लिक करा, एक विंडो दिसेल (चित्र 50).

आकृती 50

मालमत्तेत मथळाचला लिहू " फाईल", मालमत्तेत नावआम्ही लिहितो " भरणे" निळ्या आयतावर क्लिक करा आणि दुसरा आयत खाली दिसेल (चित्र 51).

आकृती 51

चला ते निवडूया. मालमत्तेत मथळाचला लिहू " बंद करा", मालमत्तेत नावआम्ही लिहितो " झाक्रीत" उजवीकडील आयत निवडा. मालमत्तेत मथळाचला लिहू " संपादन", मालमत्तेत नावआम्ही लिहितो " रेडॅक्टिरोव्ह"आणि असेच. परिणामी, आम्हाला या सबमेनूसारखे काहीतरी मिळाले पाहिजे (चित्र 52, अंजीर 53, अंजीर 54).

आकृती 52

आकृती 53

आकृती 54

आता फॉर्मवर एक घटक टाकू टूलबार, टॅबमधून Win32. मालमत्ता संरेखित कराआम्ही ते टाकू alTop.मालमत्तेत EdgeBordersचला सर्वकाही टाकूया खरे.हा घटक आम्हाला त्यावर बटणे ठेवण्याची परवानगी देतो. ही त्याची मुख्य भूमिका आहे. चला त्यावर क्लिक करूया उजवे क्लिक करामाउस आणि दिसणाऱ्या सबमेनूमध्ये निवडा नवीन बटण(अंजीर 55).

आकृती 55

एक बटण दिसेल ज्यासाठी तुम्हाला एक चित्र निवडण्याची आवश्यकता असेल. पण प्रथम मालमत्तेत नावआम्ही लिहितो " डोब" प्रतिमा प्रदर्शित करण्यासाठी, तुम्हाला त्याच टॅबमधून एक घटक ड्रॉप करणे आवश्यक आहे इमेजलिस्टआणि त्यावर डबल क्लिक करा. एक डायलॉग बॉक्स दिसेल (Fig. 56), ज्यामध्ये बटण दाबून जोडा... आपल्याला 16x16 आकाराची योग्य चित्रे निवडण्याची आवश्यकता आहे. सर्व चित्रे निवडल्यानंतर, बटणावर क्लिक करा ठीक आहे.

आकृती 56

चला घटक निवडा टूलबार1आणि मालमत्तेत प्रतिमाड्रॉप-डाउन मेनूमधून निवडा इमेजलिस्ट1. बटणावर लगेच एक चित्र दिसेल. जर चित्र वेगळे असावे, तर तुम्हाला बटण आणि मालमत्तेमध्ये निवडण्याची आवश्यकता आहे इमेजइंडेक्सड्रॉप-डाउन मेनूमधून योग्य निवडा.

घटकावर उजवे-क्लिक करा टूलबार1आणि दिसणाऱ्या सबमेनूमध्ये, निवडा न्यूसेपरेटर(अंजीर 55). बटणाच्या पुढे एक विभाजक दिसेल. त्यासाठी आम्ही मालमत्ता बदलणार नाही नाव,कारण हे फक्त बटणांमधील विभाजक आहे. त्याची रुंदी बदलू रुंदी.चला ते 5 च्या बरोबरीने करू. आपण त्याच प्रकारे आणखी तीन बटणे तयार करू. मालमत्तेतील दुसऱ्या बटणावर नावआम्ही लिहितो " लाल" तिसऱ्या मध्ये " यडाळी" चौथ्या मध्ये " बाहेर पडा" बटणांमध्ये विभाजक ठेवा न्यूसेपरेटर. अंदाजे समान रुंदी असलेला दुसरा विभाजक ठेवू 50. विभाजक जवळ एक घटक टाकू लेबलआणि मालमत्तेत मथळाआम्ही आडनाव लिहितो. घटकाच्या पुढे लेबल1आम्ही घटक पुरवू संपादित करा,मालमत्तेत नावआम्ही लिहितो " कुटुंब" घटकांच्या दरम्यान लेबलआणि संपादित करा, विभाजकाची भूमिका टाइप केलेल्या शब्दातील स्पेसद्वारे खेळली जाते आडनाव.चला आणखी काही घटक टाकूया लेबलआणि संपादित करा.नंतरचे मालमत्ता मध्ये आहे नावसेट " दूरध्वनी" दोन्ही घटक संपादित करामालमत्ता साफ करणे आवश्यक आहे मजकूर.फोन इनपुट घटकाच्या पुढे (संपादित करा)घटक स्थान बटणमालमत्तेत नावओळख करून देऊ नैती.

आता टॅबवरून डेटा नियंत्रणे आपल्याला फॉर्मवर एक घटक टाकण्याची आवश्यकता आहे DBGrid.संपूर्ण खिडकी, मालमत्तेवर पसरवा संरेखित कराआम्ही ते टाकू alClient. आपण तत्सम काहीतरी शिकले पाहिजे (चित्र 57).

आकृती 57

मुख्य खिडकीचा देखावा बांधला आहे.

आम्ही डेटाबेसमध्ये प्रवेश करण्यासाठी घटक वेगळ्या मॉड्यूलमध्ये ठेवू. चला कमांड कार्यान्वित करू फाइल/नवीन/इतर… आणि दिसत असलेल्या विंडोमध्ये (चित्र 58) निवडा डेटामॉड्युलबटण दाबूया ठीक आहे.त्याच फोल्डरमध्ये त्याच नावाने सेव्ह करा DataModule1.pasआणि DataModule.dpr.

आकृती 58

मालमत्तेत नावनाव लहान लिहा डीएम . या विंडोमध्ये डेटाबेसमध्ये प्रवेश करण्यासाठी घटक ठेवले जातील. टॅबमधून इंटरबेस चला खालील घटक ठेवूया: IBDatabase, IBSstoredProc, IBQuery, IBTransaction.त्यांची नावे न बदलता ठेवूया, कारण... आम्ही त्यांना प्रथम खिडकीतून बाहेर फेकले. शेवटी 1 क्रमांकासह त्यांची व्यवस्था केली जाईल. डेटा ऍक्सेस टॅबमधून घटक ड्रॉप करा डेटास्रोतड्रॉप-डाउन सूचीमध्ये डेटासेटचला निवडू या IBQuery1.

आता प्रत्येक घटकाची भूमिका काय आहे याचे वर्णन करूया:

  • आयबीडेटाबेस- डेटाबेसशी कनेक्ट करण्यासाठी मध्यवर्ती घटक. एक घटक एका वेळी एकाच डेटाबेसशी संबद्ध केला जाऊ शकतो;
  • IBSstoredProc- घटक संग्रहित प्रक्रियेसह कार्य करण्यासाठी डिझाइन केले आहे. तुम्हाला ते कार्यान्वित करण्यास, इनपुट डेटा प्रदान करण्यास आणि अंमलबजावणीचा परिणाम (आउटपुट डेटा) प्राप्त करण्यास अनुमती देते;
  • IBQuery- आपल्याला डेटाबेसवर क्वेरी पाठविण्यास आणि त्यांच्या अंमलबजावणीचा परिणाम प्राप्त करण्यास अनुमती देते. घटक हा घटकाचा संपूर्ण ॲनालॉग आहे TQuery.मुख्य मालमत्ता एसक्यूएल;
  • IBTransaction- या घटकाशी संबंधित डेटाबेससाठी सर्व व्यवहारांच्या ऑपरेशनसाठी जबाबदार आहे;
  • डेटास्रोत- घटकांद्वारे दर्शविलेल्या डेटा सेटमधील दुवा आहे TIBQueryआणि TIBSstoredProc,आणि डेटा प्रदर्शित आणि व्यवस्थापित करण्यासाठी व्हिज्युअल घटक.
आम्ही या सर्व घटकांमधील प्रत्येक गुणधर्माचे वर्णन करणार नाही. डेटाबेस तयार करण्याच्या प्रक्रियेत, कोणत्याही परिस्थितीत, आम्ही वापरणार असलेल्या मालमत्तेशी परिचित व्हावे लागेल.

तर, घटकावर उजवे-क्लिक करूया आयबीडेटाबेसएक संदर्भ मेनू दिसेल (चित्र 59).

आकृती 59

ज्यामध्ये तुम्हाला एक आयटम निवडण्याची आवश्यकता आहे डेटाबेस संपादक… एक विंडो दिसेल डेटाबेस घटक संपादक(अंजीर 60).

आकृती 60

विभागात जोडणी चला निवडू या स्थानिक,कारण आम्ही अजूनही तयार करत आहोत स्थानिक डेटाबेसडेटा शेतात डेटाबेस तुम्हाला आमच्या डेटाबेसचे नाव प्रविष्ट करणे आवश्यक आहे. तुम्ही अर्थातच हाताने सर्वकाही टाइप करू शकता, परंतु बटण दाबणे अधिक सोयीचे आहे ब्राउझ करा.जर आपण आता आमच्या डेटाबेससह फोल्डरमध्ये गेलो (TELEFONSPRAVOCHNIK.FDB),नंतर ते या फोल्डरमध्ये दिसणार नाही. हा डेटाबेस निवडण्यासाठी, आपण ओळीत असणे आवश्यक आहे प्रकारफाइल्स निवडा AllFiles(*).आता या फोल्डरमधील सर्व फाईल्स प्रदर्शित होतील. डेटाबेस फाइल निवडा (TELEFONSPRAVOCHNIK.FDB)आणि क्लिक करा ठीक आहे.

विभागात डेटाबेस पॅरामीटर्स शेतात वापरकर्ता नावआपले लॉगिन प्रविष्ट करा - SYSDBA शेतात पासवर्डपासवर्ड टाका - मास्टरकी लॉगिन आणि पासवर्ड डेटाबेस तयार करताना एंटर केल्याप्रमाणेच असणे आवश्यक आहे IBEतज्ञ.अर्थात, आम्ही लिहिलेल्या प्रोग्रामचा वापर करून डेटाबेस व्यवस्थापित करू डेल्फी.

ड्रॉप-डाउन सूचीमध्ये वर्ण संच चला निवडू या Win1251.चला हा बॉक्स अनचेक करूया लॉगिन प्रॉम्प्ट त्यामुळे तुम्हाला प्रत्येक वेळी तुमचा पासवर्ड टाकण्याची गरज नाही. अगदी खिडकीत सेटिंग्जआम्ही नियुक्त केलेल्या आणि प्रविष्ट केलेल्या सर्व गोष्टी प्रदर्शित केल्या जातात.

आता तुम्हाला बटण दाबावे लागेल चाचणी.आपण बटण दाबण्यापूर्वी ठीक आहे,तुम्हाला डेटाबेस तपासण्याची आवश्यकता आहे. एक विंडो दिसेल (चित्र 61).

आकृती 61

जर ते एरर मेसेजसह दिसले, तर एक कारण प्रोग्रामशी विसंगतता असू शकते इंटरबेस.या त्रुटीचे निराकरण करण्यासाठी आपल्याला प्रोग्राम विस्थापित करणे आवश्यक आहे इंटरबेस,ते स्थापित केले असल्यास. आणि तुम्हाला लायब्ररी फाईल व्यक्तिचलितपणे हटवावी लागेल gds32.dllपत्त्यावर C:\WINDOWS\system32.

या हटविल्यानंतर तुम्हाला हटवावे लागेल आणि फायरबर्ड,कारण आम्ही लायब्ररी काढली, IBEतज्ञयापुढे सामान्यपणे काम करू शकणार नाही. या सर्व चरणांनंतर आपल्याला पुन्हा स्थापित करणे आवश्यक आहे फायरबर्ड.त्रुटीची अनेक कारणे आहेत, परंतु ही सर्वात सामान्य आहे.

चला घटक निवडा IBQuery1आणि मालमत्तेत डेटाबेसचला निवडू या IBDatabase1.मालमत्ता डेटाबेसघटक सूचित करते टीआयबीडेटाबेसदिलेल्या डेटा सेटशी संबंधित. मालमत्तेत व्यवहारनिवडा IBTransaction1.मालमत्ता व्यवहारव्यवहार निवडण्यासाठी जबाबदार आहे.

मुख्य घटक गुणधर्म TQuerySQLप्रकार असणे TStrings . असलेली स्ट्रिंगची ही यादी SQL क्वेरी,जे दाखवेल की कोणत्या टेबल किंवा टेबलवर काम केले जाईल. परंतु नंतर, अर्जाच्या अंमलबजावणीदरम्यान, मालमत्ता SQLवर्गासाठी सामान्य पद्धती वापरून प्रोग्रामॅटिकरित्या व्युत्पन्न केले जाऊ शकते TStrings : साफ- स्वच्छता, ॲड- एक ओळ जोडणे, इ.

तर मालमत्तेत SQLतीन ठिपके असलेल्या बटणावर क्लिक करा आणि दिसत असलेल्या विंडोमध्ये प्रविष्ट करा SQL क्वेरी(अंजीर 62).

आकृती 62

विनंती असे वाटते: सर्व फील्ड निवडा ( निवडा *) टेबलवरून TELEPHON_SPRAVOCCHNIK (TELEPHON_SPRAVOCCHNIK मधून)आणि फील्डनुसार (चढत्या) क्रमवारी लावा की (की द्वारे ऑर्डर).बटण दाबा ठीक आहे.

चला घटक निवडा IBTransaction1आणि मालमत्तेत डीफॉल्ट डेटाबेसचला निवडू या IBDatabase1 .

चला घटक निवडा IBSstoredProc1,मालमत्तेत डेटाबेसचला निवडू या IBDatabase1 . मालमत्तेत StoredProcNameड्रॉप-डाउन सूचीमधून आमची प्रक्रिया निवडा TEL_SPRAV_PROCमध्ये लिहिले आहे IBEतज्ञ.

चला हायलाइट करूया IBQuery1,मालमत्ता सक्रियआम्ही ते टाकू खरे .

चला या मॉड्यूलशी कनेक्ट करूया (DataModule1)मुख्य मॉड्यूल TelSprav1 कमांड चालवून फाइल/युनिट वापरा…, दिसत असलेल्या विंडोमध्ये (चित्र 63.)

आकृती 63

चला निवडू या TelSprav1 आणि बटण दाबा युनिट वापरा.शब्दानंतर अंमलबजावणीया मॉड्यूलमध्ये एक विभाग असेल वापरतेमुख्य मॉड्यूलच्या नावासह TelSprav1. आता हे मॉड्यूल आहे DataModule1मुख्य मॉड्यूलच्या अस्तित्वाबद्दल माहिती आहे TelSprav1.

चला मुख्य मॉड्यूलवर जाऊया TelSprav1आणि आता मॉड्यूल त्याला जोडू DataModule1.आता या दोन मॉड्यूल्सना एकमेकांच्या अस्तित्वाबद्दल माहिती आहे.

ग्रिड निवडा DBGrid1आणि गुणधर्म ड्रॉप डाउन मेनूमध्ये डेटास्रोतनिवडा DM.DataSource1 . डेटाबेस फील्डची नावे आमच्या ग्रिडमध्ये दिसतील.

आता डेटा जोडण्यासाठी आणि संपादित करण्यासाठी विंडो तयार करू. चला कमांड कार्यान्वित करू फाइल/नवीन/फॉर्म. सर्व प्रथम, आज्ञानुसार आकार ठेवूया प्रकल्प फाइल/जतन करा... शेतात फाईलचे नावचला एक मॉड्यूल सादर करू AddavRedakt1.pas , ए फॉर्मचे नाव - AddavRedakt.dpr . मालमत्तेत नावफॉर्मचे नाव प्रविष्ट करा DobRed.डेटा प्रविष्ट करण्यासाठी आणि संपादित करण्यासाठी आवश्यक घटक फॉर्मवर टाकूया:

  1. TEdit- आडनाव प्रविष्ट करण्यासाठी. मालमत्तेत नावआम्ही लिहितो कुटुंबमालमत्तेत मजकूरइनपुट फील्ड साफ करा;
  2. TEdit- नाव प्रविष्ट करण्यासाठी. मालमत्तेत नावआम्ही लिहितो इम्या.मालमत्तेत मजकूरइनपुट फील्ड साफ करा;
  3. TDateTimePicker- तारीख प्रविष्ट करण्यासाठी. मालमत्तेत नावआम्ही लिहितो VData.गुणधर्म ड्रॉप-डाउन सूचीमध्ये डेटमोडचला निवडू या dmUpDown,आपण इच्छित असल्यास, आपण भिन्न मूल्य निवडू शकता;
  4. TEdit- फोन नंबर प्रविष्ट करण्यासाठी. मालमत्तेत नावआम्ही लिहितो NomerTelefona.मालमत्तेत मजकूरइनपुट फील्ड साफ करा;
  5. TEdit- इनपुटसाठी ईमेल पत्ता. मालमत्तेत नावआम्ही लिहितो ईमेल.मालमत्तेत मजकूरइनपुट फील्ड साफ करा;
  6. TCcheckBox- सेल फोनच्या मालकीचे चिन्ह. जर तुम्ही प्रोग्रामच्या अंमलबजावणीदरम्यान बॉक्स चेक केला असेल तर सेल फोनआहे ही व्यक्ती. मालमत्तेत मथळाआम्ही लिहितो मोबाईल फोन.मालमत्तेत नावआम्ही लिहितो मोबिल्निक;
  7. TComboBox- शहर निवडण्यासाठी ड्रॉप-डाउन सूची. मालमत्तेत नावआम्ही लिहितो गोरोड.मालमत्तेत मजकूरइनपुट फील्ड साफ करा;
  8. TButton- डेटा जोडण्याची पुष्टी करण्यासाठी बटण. मालमत्तेत नावआम्ही लिहितो ॲड.मालमत्तेत मथळाओके लिहा;
  9. TButton- डेटा संपादन पुष्टी करण्यासाठी बटण. मालमत्तेत नावआम्ही लिहितो रिडॅक्ट करा.मालमत्तेत मथळाआम्ही लिहितो ठीक आहे.
आम्ही फॉर्मवर 2 समान बटणे फेकली, कारण दाबली वेगळे बटण, आणि डेटावर कोणती क्रिया करावी हे निर्धारित करेल. अर्थात, ही एक तर्कहीन पद्धत आहे, परंतु ती प्रभावी आहे.

चला आकार जतन करूया. चला प्रकल्प बंद करू आणि तो पुन्हा उघडू. प्रकल्प उघडल्यानंतर आपल्याला टॅब पाहण्याची आवश्यकता आहे AddavRedakt1 (अंजीर 64).

आकृती 64

चला कमांड कार्यान्वित करू प्रकल्प/प्रोजेक्टमध्ये जोडा...आणि दिसत असलेल्या विंडोमध्ये (चित्र 65).

आकृती 65

चला एक फाईल निवडा AddavRedakt1.pas आणि बटण दाबा ठीक आहे.समान आदेश वापरून, फाइल निवडा DataModule1.pas आमच्याकडे टॅब नसल्यास DataModule1. ही आज्ञाविंडोमध्ये असतानाच लागू होते प्रकल्प व्यवस्थापकआम्हाला जे हवे आहे ते आमच्याकडे नाही पासआणि डीपीआरफाइल्स खिडकी प्रकल्प व्यवस्थापकआदेशानुसार बाहेर येईल पहा/प्रकल्प/व्यवस्थापक…

चला संपादन मॉड्यूल कनेक्ट करूया AddavRedakt1 मुख्य मॉड्यूलवर TelSprav1.आम्ही मुख्य मॉड्यूलला संपादन मॉड्यूलशी देखील जोडू आणि DataModule1.

बस्स! साठी आवश्यक आहे या टप्प्यावर, खिडक्या तयार केल्या आहेत. चला प्रोग्रामिंगकडे वळूया.

कार्यक्रम हँडलर मध्ये OnClick(मुख्य मॉड्यूल) बटणासाठी ॲडखालील कोड लिहा:

प्रक्रिया TTelefonSprav.DabavitClick(प्रेषक: TObject);
सुरू
   (जर "Addavit" बटण दाबले असेल, तर आम्ही करू
   व्हेरिएबल "ExiStsDobRed" सक्रिय)

     ExiStsDobRed:=true;
   // "दबावित" बटण दाबून - "टॅग=1"
     tag:=1;
   // करा प्रवेश करण्यायोग्य बटण"डॉब"
     DobRed.Dobav.Visible:=true;
   // दुर्गम "लाल" बटण
     DobRed.Redact.Visible:=false;
   // खिडकी उघडा
     DobRed.ShowModal;
शेवट

चला ग्लोबल व्हेरिएबल घोषित करू ExiStsDobRedविभागात वर . हे मॉड्यूलमध्ये असे दिसेल.

var
  TelefonSprav: TTelefonSprav;
  ExiStsDobRed: boolean=false;

हे व्हेरिएबल विंडो उघडली आहे की नाही हे दर्शवते डेटा जोडणे आणि संपादित करणे.हे चल बुलियन प्रकारआणि डीफॉल्टनुसार समान खोटे.तुम्ही बटण दाबाल तेव्हा "जोडा"चल ExiStsDobRedच्या समान खरे.

प्रत्येक घटकाचा गुणधर्म असतो टॅग करा,जे तुमच्या विवेकबुद्धीनुसार पूर्णांक प्रकाराचे जागतिक चल म्हणून वापरले जाऊ शकते. 1 मालमत्ता नियुक्त करा टॅग करा,या मूल्यानुसार आवश्यक असलेले बटण दिसेल. उदाहरणार्थ: आम्ही बटणावर क्लिक केले अडव,वर वर्णन केलेली घटना ट्रिगर केली जाईल.

मी आधीच नमूद केल्याप्रमाणे, डेटा जोडण्यासाठी आणि संपादित करण्यासाठी विंडोमध्ये 2 बटणे आहेत अडव, Redact(अंजीर 66).

आकृती 66

चित्र दोन बटणे दर्शविते, परंतु प्रत्यक्षात फक्त एकच प्रदर्शित होते. कोडच्या चौथ्या ओळीत आपल्याकडे एक बटण आहे रेडेक्ट कराते अदृश्य करा. तिसऱ्या ओळीत आम्ही बटण उपलब्ध करून देतो ॲड.या क्रियांसाठी मालमत्ता जबाबदार आहे दृश्यमान.शेवटच्या ओळीत आम्ही यासाठी विंडो दाखवतो डेटा जोडणे किंवा संपादित करणे.

या ट्युटोरियलमध्ये मी तुम्हाला दाखवेन की तुम्ही वेगळे कसे तयार करू शकता नेटवर्क अनुप्रयोगडेल्फीमध्ये TServerSocket आणि TClientSocket घटक वापरून. हा धडास्थानिक किंवा इंटरनेट नेटवर्कद्वारे संवाद साधू शकणारे तुमचे स्वतःचे प्रोग्राम किंवा संगणक गेम विकसित करण्यात मदत करेल.

प्रथम, आवश्यक TServerSocket आणि TClientSocket घटक शोधूया. बर्याचदा ते समाविष्ट नाहीत मानक पॅकेजडेल्फी स्थापना, परंतु ते अतिरिक्तपणे स्थापित केले जाऊ शकतात. हे करण्यासाठी, डेल्फी लाँच करा, "घटक/इंस्टॉल पॅकेजेस" वर जा, नंतर "जोडा" बटणावर क्लिक करा. उघडलेल्या डायलॉग बॉक्समध्ये, तुम्हाला "dclsocketsXX.bpl" फाइल शोधण्याची आवश्यकता आहे (ती बिन फोल्डरमध्ये स्थित आहे, जे डेल्फी फोल्डरमध्ये आहे), जिथे XX हा तुमच्या डेल्फीचा अंकीय आवृत्ती क्रमांक आहे. फाइल शोधा, "ओपन" वर क्लिक करा आणि नंतर "पॅकेज स्थापित करा" विंडोमध्ये "ओके" क्लिक करा.

आता, "इंटरनेट" टॅबमध्ये दोन घटक दिसू लागले आहेत - TServerSocket आणि TClientSocket, ज्यांच्याशी आपण या धड्यात काम करण्याचा विचार करू.

घटकांच्या नावांवरून हे अंदाज लावणे कठीण नाही की TClientSocket घटक नेटवर्कवरील क्लायंटची भूमिका बजावते जे TServerSocket घटकासह सर्व्हरशी कनेक्ट होते.

या लेखाच्या हेतूंसाठी, सर्व्हर म्हणून आम्ही सर्व्हरची भूमिका पार पाडणाऱ्या सर्व्हर प्रोग्रामचा विचार करू आणि सर्व्हरशी कनेक्ट होणाऱ्या क्लायंटला आम्ही क्लायंट प्रोग्राम म्हणू.

सर्व्हर सहसा सेवा देतो नेटवर्किंगग्राहक अशा प्रकारे, क्लायंट सर्व्हरला कोणतीही माहिती पाठवू शकतो आणि सर्व्हर ही माहिती इतर ग्राहकांना पाठवेल.

ऑनलाइन चॅट कसे कार्य करतात ते पाहू या. चला असे गृहीत धरू की चॅट सर्व्हरशी अनेक क्लायंट कनेक्ट केलेले आहेत. क्लायंटपैकी एक सर्व्हरला नवीन संदेश पाठवतो. सर्व्हरला संदेश प्राप्त होतो आणि तो उर्वरित क्लायंटना परत पाठवतो. उर्वरित क्लायंट सर्व्हरकडून संदेश प्राप्त करतात आणि अशा प्रकारे चॅट संदेश प्रसारित केले जातात.

अशा नेटवर्क ऍप्लिकेशन्स ज्यामध्ये क्लायंट आणि सर्व्हरचा समावेश असतो त्यांना क्लायंट-सर्व्हर ऍप्लिकेशन म्हणतात.

आता या घटकांसह कसे कार्य करावे हे शोधण्याचा प्रयत्न करूया. चला समान क्लायंट-सर्व्हर चॅट लागू करण्याचा प्रयत्न करूया.

प्रथम, एक सर्व्हर तयार करू ज्याला संदेश प्राप्त झाला पाहिजे आणि तो सर्व क्लायंटना परत पाठवा.

डेल्फीमध्ये एक नवीन ऍप्लिकेशन तयार करू, त्यावर TServerSocket घटक ठेवू आणि त्याच्या पॅरामीटर्समध्ये खालील मूल्ये निर्दिष्ट करू:

सक्रिय = असत्य
नाव = srv
पोर्ट = 22500
सर्व्हर प्रकार = stNonBlocking

सक्रिय पॅरामीटर सर्व्हरच्या स्थितीसाठी जबाबदार आहे, ते सक्रिय आहे किंवा सक्रिय नाही. या क्षणी.

फॉर्मच्या OnCreate इव्हेंटमध्ये srv.active:=true जोडण्यास विसरू नका जेणेकरून सर्व्हर सुरू होईल.

IN पोर्ट पॅरामीटरपोर्ट निर्दिष्ट करणे आवश्यक आहे ज्याद्वारे माहिती असलेली पॅकेट क्लायंटकडून सर्व्हरवर आणि परत पाठविली जातील.

आम्ही फॉर्मवर Memo1 घटक देखील ठेवू (याला लॉग म्हणूया), ज्याची आम्हाला चॅटच्या ऑपरेशनचे निरीक्षण करण्यासाठी आवश्यक असेल.

आता आम्ही srv साठी एक onClientConnect इव्हेंट तयार करू, ज्यामध्ये आम्ही सर्व्हरशी क्लायंट कनेक्शन रेकॉर्ड करू शकतो. इव्हेंटच्या कोडमध्येच आम्ही लिहू:

प्रक्रिया TForm1.srvClientConnect(प्रेषक: TObject;
सॉकेट: TCustomWinSocket);
सुरू
log.Lines.Add('IP पत्ता असलेला क्लायंट' +Socket.RemoteAddress जोडला आहे);
शेवट

अशा प्रकारे आपण सर्व्हरशी कनेक्ट होणाऱ्या क्लायंटचा IP पत्ता शोधू शकतो.

इव्हेंटमधील सॉकेट व्हेरिएबल सर्व्हरशी कनेक्ट केलेल्या क्लायंटबद्दल सर्व आवश्यक माहिती संग्रहित करते.

onClientRead इव्हेंट हँडलर क्लायंटकडून प्राप्त माहिती प्राप्त करण्यासाठी आणि त्यावर प्रक्रिया करण्यासाठी वापरला जातो. चला एक उदाहरण पाहू:

प्रक्रिया TForm1.srvClientRead(प्रेषक: TObject; सॉकेट: TCustomWinSocket);
var
str:स्ट्रिंग;
i:पूर्णांक;
सुरू
str:=Socket.ReceiveText;
log.Lines.Add(str);
i साठी:= 0 ते srv.Socket.ActiveConnections -1 करू
srv.Socket.Connections[i].SendText(str);
शेवट

आम्ही क्लायंटकडून प्राप्त झालेल्या मजकूर संदेशाचे मूल्य str व्हेरिएबल नियुक्त करतो आणि प्राप्त संदेश लॉगमध्ये जोडतो. यानंतर आम्ही सर्व ग्राहकांना संदेश पाठवतो. कनेक्ट केलेल्या क्लायंटची संख्या srv.Socket.ActiveConnections मध्ये आढळू शकते.

समजा एखाद्या विशिष्ट क्लायंटला संदेश पाठवायचा असेल तर ते पुढीलप्रमाणे करता येईल.

srv.Socket.Connections[a].SendText('चाचणी संदेश');

या प्रकरणात, व्हेरिएबल a हा srv.Socket.Connections मधील अंकीय अभिज्ञापक आहे. हे आयडी 0 ते srv.Socket.ActiveConnections -1 पर्यंत आहेत. परंतु, उदाहरणार्थ, आम्हाला आगाऊ माहित असलेल्या विशिष्ट IP पत्त्यासह आम्ही क्लायंटला संदेश कसा पाठवू शकतो? हे असे केले जाते:

i साठी:= 0 ते srv.Socket.ActiveConnections -1 करू
जर srv.Socket.Connections[i].RemoteAddress= ‘123.123.123.123’ तर सुरू करा
srv.Socket.Connections[i].SendText('चाचणी संदेश');
खंडित;
शेवट

आम्ही सर्व्हरवरील सर्व कनेक्शनवर पुनरावृत्ती करतो. जर क्लायंटचा IP पत्ता “123.123.123.123” शी जुळत असेल (तो इतर कोणताही असू शकतो), तर आम्ही या क्लायंटला संदेश पाठवतो आणि सायकल पूर्ण करतो.

आणि शेवटी, TServerSocket - onClientDisconnect साठी दुसऱ्या इव्हेंटचा विचार करूया, जो क्लायंटला सर्व्हरवरून डिस्कनेक्ट करणे हाताळते.

प्रक्रिया TForm1.srvClientDisconnect(प्रेषक: TObject;
सॉकेट: TCustomWinSocket);
सुरू
log.Lines.Add('Client '+socket.RemoteAddress+' सर्व्हरवरून डिस्कनेक्ट झाला आहे.');
शेवट

आता क्लायंटकडे जाऊया. चला एक नवीन डेल्फी ऍप्लिकेशन तयार करू आणि त्यात TClientSocket घटक ठेवू आणि या घटकाला “क्लायंट” नाव देऊ. क्लायंट घटकाच्या पॅरामीटर्ससाठी खालील मूल्ये नियुक्त करूया:

सक्रिय = असत्य
पोर्ट = 25500
ClientType = ctNonBlocking
पत्ता = 127.0.0.1

ॲड्रेस पॅरामीटरमध्ये, ज्या कॉम्प्युटरवर सर्व्हर ऍप्लिकेशन चालू आहे त्याचा IP पत्ता निर्दिष्ट करा. जर तुम्ही आयपी ॲड्रेस “127.0.0.1” शी कनेक्ट केले, तर संगणक स्वतःशीच कनेक्ट होईल आणि सर्व्हर प्रोग्रामसह कार्य करेल, जो क्लायंट प्रोग्राम चालू आहे त्याच ठिकाणी चालू आहे. नेटवर्क अनुप्रयोगांची चाचणी घेण्यासाठी ही पद्धत अतिशय सोयीस्कर आहे.

क्लायंटसाठी पोर्ट व्हॅल्यू सर्व्हरप्रमाणेच सेट करणे आवश्यक आहे!

सर्व्हरकडून प्राप्त झालेले संदेश प्रदर्शित करण्यासाठी आम्ही लॉग नावाचा TMemo घटक देखील जोडू.

फॉर्मच्या OnCreate पॅरामीटरचा विचार करूया जिथे सर्व्हरशी कनेक्शन केले जाते.

प्रक्रिया TForm1.FormCreate(प्रेषक: TObject);
सुरू
(कनेक्शन स्थापित करण्याचा प्रयत्न करत आहे)
ClientSocket1.Open;
शेवट

आता क्लायंट फॉर्मवर ठेवू बटण 1 आणि एकल ओळ मजकूर फील्ड संपादन1. सर्व्हरवर संदेश पाठवण्यासाठी आम्हाला त्यांची आवश्यकता असेल. बटण1 घटकाच्या OnClick इव्हेंटमध्ये लिहा:

Client.Socket.SendText(Edit1.Text);

अशा प्रकारे Edit1 मध्ये प्रविष्ट केलेला संदेश सर्व्हरला पाठविला जाईल.

सर्व्हरवर संदेश पाठविल्यानंतर, सर्व्हर सर्व क्लायंटला संदेश पाठवतो, म्हणून तुम्हाला सर्व्हरकडून संदेश प्राप्त करणे आवश्यक आहे. यासाठी आम्हाला OnRead इव्हेंटची आवश्यकता आहे:

प्रक्रिया ClientRead(प्रेषक: TObject; सॉकेट: TCustomWinSocket);
सुरू
(एखादा संदेश आला असल्यास, तो लॉगमध्ये जोडा)
Log.Lines.Add(Socket.ReceiveText);
शेवट

सर्व्हरवरून डिस्कनेक्शन इव्हेंट लिहिणे बाकी आहे. हे करण्यासाठी, आम्ही दुसरे बटण तयार करू शकतो आणि त्याच्या OnClick इव्हेंटमध्ये निर्दिष्ट करू शकतो

क्लायंट.क्लोज;

क्लायंट आणि सर्व्हर सुरू करा. सर्व्हरला संदेश पाठवण्याचा प्रयत्न करा, सर्व्हरने प्रतिसादात तो तुम्हाला परत करावा. "असिंक्रोनस सॉकेट एरर 10061" ही त्रुटी आढळल्यास, हे बहुधा सर्व्हर अनुपलब्ध असल्यामुळे झाले आहे. पोर्ट, IP पत्ते आणि नेटवर्क कनेक्शनची कार्यक्षमता यांचे अनुपालन तपासा.

टेलिफोन डिरेक्टरी ऍप्लिकेशन विकसित करण्यासाठी, डेल्फी 7 व्हिज्युअल प्रोग्रामिंग वातावरण वापरले जाते प्रोग्राम प्रोजेक्टमध्ये तीन विंडो असतील:

  • 1. fMain - प्रोग्रामचा मुख्य प्रकार.
  • 2. fEditor - नोंदी जोडण्यासाठी/संपादित करण्यासाठी फॉर्म.
  • 3. fDM - डेटा मॉड्यूल.

fDM फॉर्मवर आम्ही ADOConnection घटक, 1 ADOTable प्रकार घटक, 1 डेटासोर्स प्रकार घटक जोडू. ADOConnection घटकाच्या ConnectionString गुणधर्मावर डबल-क्लिक करा. ADO ला घटक जोडण्यासाठी विंडो उघडेल (चित्र 2):

पु.क. 2. ADO शी कनेक्ट करण्यासाठी विंडो.

बिल्ड बटणावर क्लिक करा. कनेक्शन सेटिंग्ज असलेली एक नवीन विंडो उघडेल (चित्र 3.)

तांदूळ. 3.

डेटा प्रदाता निवडा - SQL सर्व्हरसाठी Microsoft OLE DB प्रदाता. कनेक्शन टॅबवर: तुमचा डेटाबेस ज्या सर्व्हरवर आहे त्याचे नाव निवडा. आता कनेक्टेड प्रॉपर्टी ट्रू वर सेट करूया. ADOTable चे खालील गुणधर्म बदलूया: ADOConnection1 चे कनेक्शन; सदस्यावरील टेबलनाव; सक्रिय ते सत्य. DataSource चे खालील गुणधर्म बदला (ही टेबलची लिंक असेल): DataSet to ADOTable.

चला मुख्य फॉर्मवर जाऊया. फाईल -> युनिट वापरा कमांड निवडा आणि डीएम मॉड्यूल त्यास कनेक्ट करा. आता आपण मुख्य स्वरूपातील तक्ते पाहू शकू.

मुख्य फॉर्मवर घटक ठेवूया. ते एकात्मिक वातावरणाच्या मुख्य विंडोच्या क्षेत्रामध्ये स्थित आहेत, ज्याला घटक पॅलेट म्हणतात (चित्र 4.).

तांदूळ. 4.

मुख्य स्वरूप fMain (चित्र 5) मध्ये तीन बटणे जोडू. ते वर्तमान एंट्री संपादित करण्यासाठी, नवीन जोडण्यासाठी आणि हटवण्याच्या उद्देशाने आहेत.

अंजीर.5.

डेटाकंट्रोल टॅब व्हिज्युअल ( वापरकर्त्यासाठी दृश्यमान) डेटा डिस्प्ले घटक, जसे की DBGrid (एक ग्रिड जो सारणीच्या स्वरूपात सर्व डेटा प्रदर्शित करतो आणि तुम्हाला तो संपादित करू देतो), DBEdit (डेटा संपादन फील्ड एक रेकॉर्ड फील्ड प्रविष्ट करण्यासाठी किंवा संपादित करण्यासाठी डिझाइन केलेले आहे, म्हणजे, टेबल सेल ), DBMemo (MEMO फील्ड संपादित करण्यासाठी), इ. DBNavigator घटक हा एकमेव अपवाद आहे. हा घटक डेटा प्रदर्शित करण्यासाठी नाही, परंतु डेटा सेटमधील रेकॉर्डमध्ये फिरण्यासाठी, नवीन रेकॉर्ड घालण्यासाठी किंवा जुना हटवण्यासाठी आहे. DBGrid जोडा आणि निवडा, त्याच्या DataSource प्रॉपर्टीमध्ये fDM.ADOTable निवडा. ग्रिडने प्रतिक्रिया दिली आहे आणि आम्ही फील्डची नावे पाहतो (चित्र 6.).

तांदूळ. 6.

आता विविध निकषांवर आधारित रेकॉर्डचे फिल्टर बनवू. हे करण्यासाठी, फॉर्ममध्ये दोन ग्रुपबॉक्स घटक जोडा. GroupBox1 घटकाच्या कॅप्शन गुणधर्मामध्ये ऑब्जेक्ट इन्स्पेक्टर (Fig. 7.) मध्ये, "एका फील्डद्वारे फिल्टर करा" आणि GroupBox2 घटकासाठी "अनेक फील्डद्वारे फिल्टर करा" प्रविष्ट करा.

अंजीर.7.

GroupBox1 वर आपण 3 लेबल, 1 कॉम्बोबॉक्स, 1 संपादन आणि 2 रेडिओ बटण जोडू. कॅप्शन प्रॉपर्टीमध्ये लेबल1 साठी आपण “सर्च इन”, लेबल2 साठी “डेटा एंटर”, लेबल3 साठी “पद्धत” लिहू. कॉम्बोबॉक्स घटकाच्या आयटम प्रॉपर्टीमध्ये, दोन ओळी प्रविष्ट करा: आडनाव, टेलिफोन (चित्र 8.).

अंजीर.8.

RadioButton मथळा गुणधर्म आहे “ओळीच्या सुरुवातीपासून” आणि “कोणतीही घटना”. दुसऱ्या ग्रुपबॉक्सवर, कॅप्शन प्रॉपर्टीसह तीन लेबल्स जोडा: आडनाव, नाव, फोन. "शोधा" या मथळ्यासह तीन घटक संपादित करा आणि एक बटण. आणि फिल्टर काढण्यासाठी फॉर्ममध्ये दुसरे बटण जोडा.

आता आपण डेटा एडिटर विंडो तयार करू. चला नवीन फॉर्म (फाइल -> नवीन -> फॉर्म) तयार करूया. चला त्याच्या नावाच्या गुणधर्माचे नाव बदलून fEditor करू. File -> Use Unit कमांड वापरून, आम्ही DM डेटा मॉड्यूलला फॉर्मशी जोडू. आता आपल्याला फॉर्मवर खालील घटक स्थापित करणे आवश्यक आहे: 8 लेबल, 7 DBEdit, 1 DBcomboBox.

चला DBcomboBox घटक अंतिम करूया. संपादक उघडण्यासाठी त्याच्या आयटम मालमत्तेवर डबल-क्लिक करा. आम्ही त्यात तीन ओळी टाकू:

गल्ली

लेन

अव्हेन्यू

ओके क्लिक करून मजकूर जतन करा.

चला नियंत्रण घटक कनेक्ट करूया. धारण करताना , सर्व नियंत्रण घटक निवडा (लेबल वगळता सर्व घटक). त्यांच्या डेटास्रोत मालमत्तेमध्ये, घटकांना कनेक्ट करून, fDM.DSLichData निवडा आवश्यक संचडेटा (टेबल). चला सामान्य निवड काढून टाकू आणि प्रथम DBEdit निवडा. त्याच्या DataField गुणधर्मामध्ये, "आडनाव" फील्ड निवडा. हा गुणधर्म निवडलेल्या घटकाला विशिष्ट टेबल फील्डशी जोडतो. त्याच प्रकारे, आपण उर्वरित घटक संबंधित फील्डशी जोडू.

खालच्या उजव्या भागात, डेटा नियंत्रण टॅबमधून नेव्हिगेशन घटक DBNavigator स्थापित करा. हा घटक रेकॉर्डद्वारे नेव्हिगेट करण्यासाठी, रेकॉर्ड संपादन मोड सक्षम करण्यासाठी, केलेले बदल जतन किंवा रद्द करण्यासाठी, नवीन रेकॉर्ड जोडण्यासाठी किंवा विद्यमान एक हटविण्यासाठी डिझाइन केले आहे. त्याच्या DataSource गुणधर्मामध्ये, घटकाला मुख्य टेबलशी जोडण्यासाठी fDM.DSLichData निवडा. आम्हाला फक्त या घटकाकडून टेबलच्या सुरुवातीस किंवा शेवटपर्यंत, पुढील किंवा मागील रेकॉर्डवर जाण्याची क्षमता आवश्यक आहे. म्हणून, त्याची व्हिजिबल बटन्स प्रॉपर्टी (घटकांच्या बटणांची दृश्यमानता) विस्तृत करू आणि nbFirst, nbPrior, nbNext आणि nbLast वगळता सर्व बटणे False वर सेट करू. या बटणांवर क्लिक केल्याने ADOTable घटकाच्या संबंधित पद्धती कॉल केल्या जातील. या पद्धती खालीलप्रमाणे करतात:

प्रथम - टेबलच्या पहिल्या रेकॉर्डवर जातो. पूर्वी - मागील रेकॉर्डवर जा. पुढील - पुढील रेकॉर्डवर जा. शेवटचे - शेवटच्या रेकॉर्डवर जा.

DBNavigator मध्ये फक्त चार बटणे शिल्लक असताना, ही बटणे वाढवली जातील. चला घटकाची रुंदी कमी करूया जेणेकरून बटणे अधिक परिचित स्वरूप घेतील.

fDM.TLichData.Append;

DBEdit1.SetFocus;

Append पद्धत वापरून आम्ही टेबलमध्ये जोडतो नवीन प्रवेश. पुढे, आम्ही इनपुट फोकस DBEdit1 वर हस्तांतरित करतो जेणेकरून वापरकर्त्याला हे स्वतः करावे लागणार नाही.

fDM.TLichData.Modified असल्यास

fDM.TLichData.Post;

येथे आपण टेबलमधील बदल सेव्ह करतो, जर असेल तर, आणि विंडो बंद करतो.

चला मुख्य फॉर्मकडे जाऊया. चला "नवीन सदस्य" बटणासह प्रारंभ करूया. तुम्हाला प्रत्येक टेबलवर एक नवीन रेकॉर्ड जोडणे आवश्यक आहे, आणि नंतर संपादक विंडो उघडा:

fDM.TLichData.Append;

fEditor.ShowModal;

चला "संपादित करा" बटणासाठी एक OnClick प्रक्रिया व्युत्पन्न करू. कोडची फक्त एक ओळ असेल:

fEditor.ShowModal;

परिणामी, एक संपादक विंडो उघडेल आणि घटक वर्तमान रेकॉर्डचा डेटा प्रदर्शित करतील.

"हटवा" बटणासाठी कोड:

fDM.TLichData.हटवा;

चला डेटा फिल्टरिंगकडे जाऊया. या फिल्टरमध्ये, आम्ही शोध फील्ड निवडतो, एक पद्धत निवडा आणि डेटा प्रविष्ट करतो.

Edit2 घटकासाठी OnChange इव्हेंट व्युत्पन्न करू.

जर ((लांबी(संपादन2. टेक्स्ट) > 0) आणि(लांबी(कॉम्बोबॉक्स1. टेक्स्ट) > 0)) तर

fDM.TLichData.Filtered:=false;

जर RadioButton1. तपासले तर

fDM.TLichData.Filter:=Combobox1.Text + "LIKE" + #39 + Edit2.Text + "%" + #39

fDM.TLichData.Filter:=Combobox1.Text + "LIKE" + #39+ "%" + Edit2.Text + "%" + #39;

fDM.TLichData.Filtered:=true;

अन्यथा fDM.TLichData.Filtered:=false;

फिल्टर कंडिशन लाइनचा अर्थ खालीलप्रमाणे आहे - स्तंभातून ते रेकॉर्ड निवडा जे Edit2.Text मध्ये टाइप केलेल्या समान वर्णांनी सुरू होतात.

LIKE कीवर्ड तुम्हाला दिलेल्या पॅटर्नचा वापर करून स्ट्रिंगची तुलना करू देतो. या प्रकरणात, आपल्याला खालील गोष्टी माहित असणे आवश्यक आहे:

चिन्ह "%" (टक्केवारी) - वर्णांचा कोणताही क्रम बदलतो.

चिन्ह #39 - म्हणजे कोडमधील " (एकल कोट) अक्षराची संख्या ASCII सारणी. वस्तुस्थिती अशी आहे की फिल्टरिंगचे मूल्य सिंगल कोट्समध्ये निर्दिष्ट केले जाणे आवश्यक आहे आणि डेल्फीमध्ये स्ट्रिंग मर्यादित करण्यासाठी सिंगल कोट्सचा वापर केला जात असल्याने, स्ट्रिंगमध्ये एकच कोट ठेवण्यासाठी, ते दोनदा ठेवले जाणे आवश्यक आहे.

एकाधिक फील्डद्वारे फिल्टर करा. शोधा बटणासाठी एक OnClick इव्हेंट व्युत्पन्न करू.

प्रक्रिया TfMain.Button3Click(प्रेषक: TObject);

fDM.TLichData.filtered:=false;

जर लांबी(edit4.text) > 0 असेल तर

filtr:= "SURNAME LIKE" + #39 + Edit4.Text + "%" + #39;

जर लांबी(edit5.text) > 0 असेल तर

जर लांबी(फिल्टर) >

filtr:=filtr + add + "NAME LIKE" + #39 + Edit5.Text + "%" + #39;

जर लांबी(edit6.text) > 0 असेल तर

जर length(filtr) > 0 असेल तर add:= " आणि " else add:="";

filtr:=filtr + add + "phone LIKE" + #39 + Edit6.Text + "%" + #39;

जर लांबी(फिल्टर) > 0 असेल तर

fDM.TLichData.Filter:= फिल्टर;

fDM.TLichData.filtered:=true;

शो मेसेज ("सर्व फील्ड रिक्त आहेत!");

फिल्टर अक्षम करण्यासाठी, "फिल्टर काढा" बटणावर क्लिक करा. तिचा कोड असा आहे:

fDM.TLichData.Filter:= "";

fDM.TLichData.Filtered:= false;



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

वर