إنشاء خادم عميل في دلفي. إنشاء تطبيق خادم عميل في دلفي

28.03.2019

لذا أولاً حول مكون الخادم معرفTCPServer(إشارة مرجعية خوادم إندي). لاستخدام إمكانيات الخادم، يجب وضع هذا المكون في النموذج (مكون غير قابل للعرض). عند تكوين مكون، تكون الخصائص التالية مفيدة:

  • نشط - يقوم بتنشيط الخادم أو إلغاء تنشيطه (خطأ افتراضي)؛
  • الروابط - تكوين مآخذ الخادم (توصيلها بمنفذ كمبيوتر معين، وتسمح لك بتعيين نطاق من عناوين IP ومنافذ العميل باستخدام مربع حوار إعدادات الخاصية ربط;
  • قائمة الانتظار - قيمة رقمية تحدد الحد الأقصى لعدد طلبات الاتصال من العملاء في قائمة الانتظار؛
  • MaxConnections - يسمح لك بتحديد الحد الأقصى لعدد العملاء المتصلين بالخادم؛

دعونا نلقي نظرة فاحصة على إعداد مآخذ الخادم باستخدام خاصية Bindings. لذلك، في الشكل. يوضح الشكل 1 كيفية استخدام مربع الحوار "خصائص". ربطقم بتكوين الخادم لخدمة العملاء بأي عناوين IP، مع توصيل مقبس الخادم بالمنفذ 12340.

أرز. 1. تحديد الممتلكات ربط.

عند هذه النقطة، يمكنك إكمال تكوين الخادم (على الرغم من عدم استخدام جميع إمكانيات مكون IdTCPServer هنا). يمكن تنفيذ العمل الرئيسي للخادم عند معالجة طلبات العميل في معالج الأحداث OnExecute. يتم تمرير مرجع إلى هذا المعالج إلى كائن TIdContext - الخيط المرتبط بالعميل المتصل بالخادم. من خلال هذا الكائن (بتعبير أدق، خاصية الاتصال الخاصة به)، يمكنك تلقي البيانات وإرسالها، بالإضافة إلى تلقي وتعيين العديد من معلمات الاتصال المفيدة. يظهر المثال الأول لاستخدام كائن TIdContext عند معالجة طلب العميل في القائمة 1.

الآن دعونا نلقي نظرة على كيفية تكوين العميل (IdTCPClient - tab عملاء إندي) حتى يتمكن من التفاعل مع خادمنا. لاستخدام مكون عميل TCP، ما عليك سوى وضعه في النموذج (لا يتم عرض المكون أيضًا).

بعد ذلك، على الأقل، تحتاج إلى تكوين الخصائص التالية (يتم ذكر الباقي حسب الحاجة في الأمثلة أدناه):

  • المضيف - اسم أو عنوان IP للكمبيوتر الذي يعمل عليه الخادم؛
  • المنفذ - رقم المنفذ الذي يتصل به مقبس الخادم.

بشكل عام، ليس من الضروري تكوين حتى هذه الخصائص في مرحلة تطوير النموذج. يكون التطبيق أكثر مرونة، على سبيل المثال، إذا تم منح المستخدم الفرصة لتحديد (أو إدخال) اسم أو عنوان الخادم.

سهولة تبادل البيانات

عند البدء في العمل مع المكونات الموضحة في القسم السابق معرفTCPServerو معرف TPCClientلنفكر في إنشاء تطبيق خادم عميل بسيط، حيث تؤدي أجزاء العميل والخادم الوظائف التالية.

  • يتصل تطبيق العميل بالخادم ويرسل إليه السلسلة التي أدخلها المستخدم، وينتظر الرد، ويعرض النص المستلم من الخادم، ثم ينقطع الاتصال بالخادم.
  • يتلقى تطبيق الخادم سلسلة من تطبيق العميل ويرسل استجابة (نصًا أيضًا)، وبعد ذلك يغلق الاتصال. بالإضافة إلى ذلك، يتم حساب عدد العملاء الذين يتم تقديم الخدمة لهم ويتم تذكر عنوان IP الخاص بالكمبيوتر الذي جاء منه الطلب الأخير.

إن تنفيذ تطبيقات الخادم والعميل في حالتنا بسيط للغاية. يسمى مشروع تطبيق الخادم خادم بسيط. يظهر مظهر نموذج الخادم (أثناء تشغيل التطبيق) في الشكل. 2.

أرز. 2. ظهور خادم بسيط

حقل النص ( يحرر) مع عدد الطلبات التي تمت معالجتها يسمى txtCount، ويسمى حقل النص الذي يحتوي على عنوان آخر جهاز كمبيوتر تم تقديمه باسم txtFrom. تتمثل مهمة الخادم بأكملها في معالجة حدث التنفيذ للمكون معرفTCPServerتم وضعها في النموذج (أرفق هذا المكون بالمنفذ 12340 واضبط الخاصية النشطة على True) (القائمة 1).

القائمة 1. تنفيذ خادم بسيط

الإجراء TForm1.FormCreate(Sender: TObject); قسم البدء:= TCriticalSection.Create; نهاية؛ الإجراء TForm1.IdTCCPServer1Execute(AContext: TIdContext); فار strText: سلسلة؛ تبدأ // تلقي سلسلة من العميل strText:= AContext.Connection.Socket.ReadLn; // الرد AContext.Connection.Socket.WriteLn("أخذ السطر:" + strText); // قم بتحديث المعلومات الموجودة في نموذج الخادم (الخادم متعدد الخيوط، // لذلك نستخدم قسم المزامنة.Enter; Inc(processed, 1); txtCount.Text:= IntToStr(processed); txtFrom.Text:= AContext .Connection.Socket.Binding. PeerIP; section.Leave; // أغلق الاتصال بالمستخدم AContext.Connection.Disconnect;

عند الرد على العميل، يقوم الخادم فقط بتكرار السطر المستلم منه مع إضافة النص "قبلت: "إلى بداية السطر.

تحليل القائمة 1، يمكنك أن ترى أنه حتى في أبسط خادم معني، كان علينا تطبيق المزامنة عند تحديث مظهر النموذج باستخدام القسم الحرج (يجب عليك أيضًا إضافة اسم وحدة SyncObjs إلى قسم الاستخدامات).

الآن دعونا نلقي نظرة على تنفيذ جزء العميل (project SimpleClient). يظهر مظهر تطبيق العميل في الشكل. 2.

أرز. 2. ظهور العميل

وبطبيعة الحال، لكي يعمل تطبيق العميل، يتم وضع مثيل للمكون في النموذج معرف TPCClient(اسمه هو IdTCPClient1). يجب تعيين خاصية المنفذ لهذا المكون على 12340. حقل النص ( يحرر) لإدخال سلسلة ليتم إرسالها إلى غير الخادم، تسمى txtMessage . حقل النص ( يحرر) الذي يتم إدخال اسم أو عنوان الخادم فيه يسمى txtServer. الحقل مع خطوط الإجابة ( مذكرة) يحمل الاسم txtResults.

تتم جميع أعمال تطبيق العميل بنقرة زر واحدة مقبض. ويرد نص المعالج المقابل في القائمة 2.

القائمة 2. تنفيذ العميل البسيط

الإجراء TForm1.Button1Click(Sender: TObject); ابدأ // اتصل بالخادم وأرسل إليه الأمر الذي تم إدخاله IdTCPClient1.Host:= txtServer.Text; IdTCPClient1.Connect; IdTCPClient1.Socket.WriteLn(txtMessage.Text); txtMessage.Text:= ""; // انتظر الرد وأغلق الاتصال txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Disconnect; نهاية؛

كل شيء، الآن يمكنك تشغيل الخادم والعملاء (على عدد تعسفي من أجهزة الكمبيوتر) ومراقبة نتائج عملهم. فقط تذكر أن تبدأ تشغيل الخادم قبل الوصول إليه باستخدام برنامج العميل.

مصدر . صنع على دلفي XE.

مراقبة جهاز كمبيوتر عبر الشبكة (IdTCPServer، IdTCPClient)

الآن دعونا نلقي نظرة على مثال أكثر إثارة للاهتمام لاستخدام مكونات الشبكة معرفTCPServerو معرف TCPCLient، والتي قد تكون مفيدة للأشخاص المشاركين في إدارة أجهزة كمبيوتر الشبكة.

يتم تشغيل برنامج الخادم مسبقًا على الكمبيوتر الذي يتم مراقبته. في هذا المثال، يسمح برنامج الخادم لبرنامج العميل بالحصول على المعلومات التالية حول الكمبيوتر الذي يعمل عليه (برنامج الخادم):

  • دقة المراقبة
  • عمق الألوان للشاشة؛
  • نسخة كاملة الحجم من الشاشة؛
  • نسخة من الشاشة، مصغرة (أو مكبرة) إلى الحجم المحدد.

للحصول على المعلومات المحددة، يجب على برنامج العميل إرسال قيم السلسلة التالية إلى الخادم:

  • get_screen_width- للحصول على العرض و get_screen_height-للحصول على ارتفاع الشاشة بالبكسل؛
  • get_screen_colors- للحصول على قيمة عمق اللون المحدد للشاشة (بت لكل نقطة)؛
  • get_screen- للحصول على نسخة كاملة الحجم من الشاشة؛
  • get_screen: X، Y- للحصول على نسخة شاشة بحجم مصغر س س ص.

أولاً، دعونا نلقي نظرة على تنفيذ الخادم (project SpyServer). يتم وضع كل التعليمات البرمجية التي تجعل الخادم يعمل في الوحدة Unit1.pasنماذج النموذج 1. يظهر معالج طلب العميل، وهو الإجراء الرئيسي للخادم، في القائمة 3.

القائمة 3. معالج طلب العميل

الإجراء TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); فار strText: سلسلة؛ العرض، الارتفاع، ط: عدد صحيح؛ العاصمة: هدك؛ ابدأ // تلقي سلسلة من العميل strText:= AThread.Connection.ReadLn; // تحديد ما يجب القيام به إذا كان strText = "get_screen_height" ثم // قم بإرجاع ارتفاع الشاشة AThread.Connection.WriteInteger(Screen.Height) وإلا إذا strText = "get_screen_width" ثم // قم بإرجاع عرض الشاشة AThread.Connection.WriteInteger (Screen.Width) وإلا إذا كانت 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) وإلا ابدأ // سلسلة مثل "get_screen: x, y" // لنحدد قيم الارتفاع والعرض التي يمررها المستخدم strText:= Copy(strText, 12, Length(strText) - 11); i:= Pos("،, strText); // عرض موضع الفاصلة:= StrToInt(Copy(strText, 1, i - 1)); height:= StrToInt(Copy(strText, i+1, Length(strText) - i)); // إرجاع نسخة من الشاشة SendScreen(width, height, AThread.Connection); نهاية؛ نهاية؛

يتم عرض إجراء SendScreen المستخدم في القائمة 3، والذي يرسل نسخة من الشاشة إلى العميل، في القائمة 4.

القائمة 4. التقاط لقطة شاشة

// يأخذ الإجراء نسخة من الشاشة، ويجلب الصورة // الناتجة إلى الحجم المحدد ويرسل الصورة // المحولة إلى إجراء برنامج العميل SendScreen(width1: Integer; height1: Integer; Connection: TIdTCCPServerConnection); فار ScreenCopy: TCanvas؛ غرام: TBitmap؛ الدفق: TMemoryStream؛ rcDest، rcSource: TRect؛ ابدأ rcDest:= Rect(0,0,width1,height1); // حجم الصورة النهائي rcSource:= Screen.DesktopRect; // الحجم الأولي للصورة // أنشئ لوحة قماشية وأرفقها بسياق سطح المكتب ScreenCopy:= TCanvas.Create; ScreenCopy.Handle:= GetDC(0); // أنشئ كائنًا لتخزين نسخة من الشاشة ونسخ الصورة gr:= TBitmap.Create; gr.Height:= height1; gr.Width:= width1; gr.Canvas.CopyRect(rcDest, ScreenCopy, rcSource); ReleaseDC(0, ScreenCopy.Handle); // احفظ الصورة في دفق البيانات:= TMemoryStream.Create; gr.SaveToStream(stream); // أرسل الصورة إلى العميل Connection.WriteStream(stream, true, true); Stream.Clear; Stream.Free; gr.Free; نهاية؛

كما ترون، حتى العملية الأكثر تعقيدًا للخادم المعني - نسخ الصورة - يتم تنفيذها بكل بساطة بفضل وجود فئة قياسية مثل TMemoryStream.

عنصر معرفTCPServer(المسمى IdTCPServer1 ) في هذا المثال متصل بالمنفذ 12341 (تذكر أيضًا تعيين الخاصية Active = True ).

الآن حول تنفيذ تطبيق العميل (project SpyClient). يظهر مظهر نموذج العميل (Form1) أثناء التشغيل في الشكل. 3 (من الواضح أن مستخدم الكمبيوتر المراقب قد فقد للتو لعبة كاسحة الألغام).

أرز. 3

يتم عرض أوصاف وأسماء وقيم الخصائص التي تم تكوينها يدويًا لأهم مكونات نموذج العميل في الجدول 1.

الجدول 1.المكونات الرئيسية لنموذج تتبع العميل وخصائصها

يبدأ تطبيق العميل بالاتصال بالخادم. يظهر رمز هذه العملية في القائمة 5.

القائمة 5. الاتصال بالخادم

الإجراء TForm1.cmbConnectClick(Sender: TObject); ابدأ إذا كان cmbConnect.Caption = "Connect" ثم ابدأ إذا كان txtServer.Text = "" ثم // لم يتم إدخال اسم خادم messageDlg("أدخل اسم جهاز الخادم في حقل النص"، mtInformation، ، 0) وإلا ابدأ // الاتصال بالخادم IdTCPClient1.Host:= txtServer.Text; حاول IdTCPClient1.Connect؛ باستثناء messageDlg("لا يمكن الاتصال بالخادم المحدد"، mtError، , 0); مخرج؛ نهاية؛ نهاية نهاية آخر // قطع الاتصال بالخادم IdTCPClient1.Disconnect؛ نهاية؛

إذا نجح الاتصال بالخادم، فسيتم تنفيذ معالج TForm1.IdTCPClient1Connected، وإعداد تطبيق العميل لطلبات البيانات الدورية من الخادم (القائمة 6).

القائمة 6. الإجراءات التي يتم تنفيذها عند الاتصال بالخادم

الإجراء TForm1.IdTCPClient1Connected(Sender: TObject); ابدأ txtServer.Enabled:= خطأ؛ cmbConnect.Caption:= "قطع الاتصال"; // ابدأ في طلب البيانات بشكل دوري من الخادم Timer1.Enabled:= True; // تنفيذ الطلب الأول دون انتظار تشغيل المؤقت Timer1Timer(nil); نهاية؛

عند قطع الاتصال بالخادم، يتم أيضًا تنفيذ الإجراءات التي توقف طلبات البيانات الدورية وتضع العميل في حالة انتظار الاتصال (الحالة الأولية للبرنامج) (القائمة 7).

القائمة 7. الإجراءات عند قطع الاتصال بالخادم

الإجراء TForm1.IdTCPClient1Disconnected(Sender: TObject); ابدأ txtServer.Enabled:= صحيح؛ cmbConnect.Caption:= "الاتصال"; Timer1.Enabled:= خطأ؛ نهاية؛

الجزء الأكثر صعوبة في تطبيق العميل هو معالجة البيانات التي يرسلها الخادم. يطلب تطبيق العميل بيانات المؤقت ويقوم بمعالجة البيانات المستلمة كما هو موضح في القائمة 8.

الإجراء TForm1.Timer1Timer(Sender: TObject); تيار فار: TMemoryStream؛ ابدأ // طلب بيانات من الخادم حول الكمبيوتر المراقب باستخدام (IdTCPClient1) ابدأ //... إذن WriteLn("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); Stream.Clear; Stream.Free; نهاية؛ نهاية؛

هناك الكثير من التعليقات في نص القائمة رقم 8، لذا لا داعي لشرحها أكثر. دعنا نتحدث فقط عن السبب الذي يجعل إجراء TForm1.Timer1Timer يوفر خيارين لتلقي صورة من الخادم.

الشيء هو أن الضغط (في مثالنا، دقة شاشة الكمبيوتر المراقب أكبر من حجم مكون imgScreen) على جانب الخادم يتطلب المزيد من وقت وحدة المعالجة المركزية من الكمبيوتر الذي يقوم بتشغيل تطبيق الخادم لالتقاط نسخة من الشاشة. يؤدي هذا إلى تقليل الحمل على الشبكة عند إرسال الصور، كما يوفر الموارد على جهاز الكمبيوتر العميل. لكن جودة الصورة المضغوطة في هذه الحالة أسوأ إلى حد ما مما كانت عليه عندما نقدم المكون صورةالقدرة على قياس الصورة بنفسك.

إذا لم تستخدم ضغط الصور على الخادم، فسيزداد حمل الشبكة عند إرسال نسخة كاملة الحجم من الشاشة، ويتم تعيين كل العمل على ضغط الصور إلى مكون imgScreen (أي، يتم إهدار وقت إضافي للمعالج على الشاشة) كمبيوتر العميل). إذا كانت دقة شاشة الكمبيوتر الخاضع للمراقبة عالية (أو عند مراقبة عدة أجهزة كمبيوتر في وقت واحد)، فإن جهاز العميل، إذا لم يكن قويًا بدرجة كافية، قد يبدأ في "التباطؤ" بشكل ملحوظ. جودة الصورة المضغوطة أعلى.

كحل أكثر أو أقل فعالية، يمكن اقتراح استخدام فترات زمنية كبيرة بين طلبات البيانات من خادم التتبع مع تحجيم الصورة على جانب الخادم (ما لم يكن جهاز الخادم منخفض الطاقة للغاية).

مصدر . تم صنعه على دلفي 7

دعونا فتح دلفيوعلى الأمر ملف/حفظ المشروع باسم... لنحفظ المشروع في نفس المجلد الذي حفظنا فيه قاعدة البيانات. عنوان المجلد C:\DBIBExpert . دعونا ننقذ ملف باستحت الاسم TelSprav1.pas ، أ dprملف TelSprav.dpr . في هذه النافذة في الممتلكات التسمية التوضيحيةدعنا نكتب « سجل الهاتف», في الممتلكات اسمنحن نكتب "تليفون سبراف". قم بإسقاط أحد المكونات على النموذج القائمة الرئيسيةوانقر عليه نقرًا مزدوجًا، ستظهر نافذة (الشكل 50).

الشكل 50

في الممتلكات التسمية التوضيحيةدعنا نكتب " ملف"، في الممتلكات اسمنحن نكتب " فيل" انقر على المستطيل الأزرق وسيظهر مستطيل آخر أدناه (الشكل 51).

الشكل 51

دعونا نختاره. في الممتلكات التسمية التوضيحيةدعنا نكتب " يغلق"، في الممتلكات اسمنحن نكتب " زكريت" حدد المستطيل على اليمين. في الممتلكات التسمية التوضيحيةدعنا نكتب " التحرير"، في الممتلكات اسمنحن نكتب " ريداكتيروف" وما إلى ذلك وهلم جرا. نتيجة لذلك، يجب أن نحصل على شيء مثل هذه القائمة الفرعية (الشكل 52، الشكل 53، الشكل 54).

الشكل 52

الشكل 53

الشكل 54

الآن دعونا نسقط مكونًا في النموذج شريط الأدوات، من علامة التبويب Win32. ملكية محاذاةسوف نضعها فيه alTop.في الممتلكات EdgeBordersدعونا نضع كل شيء فيه حقيقي.يتيح لنا هذا المكون وضع الأزرار عليه. وهذا هو دورها الرئيسي. انقر بزر الماوس الأيمن عليه واختر من القائمة الفرعية التي تظهر زر جديد(الشكل 55).

الشكل 55

سيظهر زر ستحتاج إلى تحديد صورة له. ولكن أولا في الممتلكات اسمنحن نكتب " دوب" لعرض الصورة، تحتاج إلى إسقاط مكون من نفس علامة التبويب قائمة الصوروانقر عليه مرتين. سيظهر مربع حوار (الشكل 56)، يتم فيه الضغط على الزر يضيف… تحتاج إلى تحديد الصور المناسبة بحجم 16x16. بعد تحديد كافة الصور، انقر فوق الزر نعم.

الشكل 56

دعونا نختار المكون شريط الأدوات1وفي الممتلكات الصوراختر من القائمة المنسدلة قائمة الصور1. ستظهر الصورة على الفور على الزر. إذا كانت الصورة يجب أن تكون مختلفة، فأنت بحاجة إلى تحديد الزر وفي الخاصية مؤشر الصورةحدد الخيار المناسب من القائمة المنسدلة.

انقر بزر الماوس الأيمن على المكون شريط الأدوات1وفي القائمة الفرعية التي تظهر، حدد NewSeparator(الشكل 55). سيظهر فاصل بجوار الزر. لن نقوم بتغيير الخاصية لذلك اسم،لأن إنه مجرد فاصل بين الأزرار. دعونا نغير عرضه عرض.لنجعلها تساوي 5. نقوم بإنشاء ثلاثة أزرار أخرى بنفس الطريقة. في الزر الثاني في الخاصية اسمنحن نكتب " أحمر" في المجموعة الثالثة " يدالي" في الرابع " مخرج" ضع فاصلاً بين الأزرار NewSeparator. لنضع فاصلًا آخر بعرض يساوي تقريبًا 50. دعونا نسقط مكونًا بالقرب من الفاصل ملصقوفي الممتلكات التسمية التوضيحيةنكتب الاسم الأخير. بجانب المكون التسمية1سنقوم بتوريد المكون يحرر،في الممتلكات اسمنحن نكتب " عائلة" بين المكونات ملصقو يحرر، يتم لعب دور الفاصل بواسطة مسافة في الكلمة المكتوبة اسم العائلة.دعونا نلقي بضعة مكونات أخرى ملصقو يحرر.هذا الأخير لديه في الممتلكات اسمتعيين " هاتف" كلا المكونين يحرربحاجة لمسح الممتلكات نص.بجوار مكون إدخال الهاتف (يحرر)ضع المكون زرفي الممتلكات اسمدعنا نقدم نيتي.

الآن من علامة التبويب ضوابط البيانات تحتاج إلى رمي مكون في النموذج DBGrid.قم بتمديده عبر النافذة بأكملها، الممتلكات محاذاةسوف نضعها فيه alClient. يجب أن نتعلم شيئًا مشابهًا (الشكل 57).

الشكل 57

تم بناء مظهر النافذة الرئيسية.

سنضع مكونات الوصول إلى قاعدة البيانات في وحدة منفصلة. لننفذ الأمر ملف/جديد/أخرى… وفي النافذة التي تظهر (الشكل 58) حدد DataModuleدعونا نضغط على الزر نعم.احفظه في نفس المجلد بنفس الاسم. DataModule1.pasو DataModule.dpr.

الشكل 58

في الممتلكات اسماكتب الاسم أقصر مارك ألماني . في هذه النافذة سيتم وضع مكونات الوصول إلى قاعدة البيانات. من علامة التبويب InterBase لنضع المكونات التالية: IBDatabase، IBStoredProc، IBQuery، IBTransaction.دعونا نترك أسمائهم دون تغيير، لأن... لقد ألقيناهم من النافذة أولاً. سيتم ترتيبها بالرقم 1 في النهاية. قم بإسقاط المكون من علامة التبويب "الوصول إلى البيانات". مصدر البياناتفي القائمة المنسدلة DataSetدعنا نختار IBQuery1.

الآن دعونا نصف الدور الذي يلعبه كل مكون:

  • IBDatabase- المكون المركزي للاتصال بقاعدة البيانات. لا يمكن ربط مكون واحد إلا بقاعدة بيانات واحدة في كل مرة؛
  • IBStoredProc- تم تصميم المكون للعمل مع الإجراءات المخزنة. يسمح لك بتنفيذها، وتوفير بيانات الإدخال وتلقي نتيجة التنفيذ (بيانات الإخراج)؛
  • IBQuery- يسمح لك بإرسال الاستعلامات إلى قاعدة البيانات والحصول على نتيجة تنفيذها. المكون هو التناظرية الكاملة للمكون TQuery.الملكية الرئيسية SQL؛
  • معاملة IB- مسؤول عن تشغيل جميع المعاملات الخاصة بقاعدة البيانات المرتبطة بهذا المكون؛
  • مصدر البيانات- عبارة عن رابط بين مجموعات البيانات الممثلة بالمكونات TIBQueryو تيبستوريدبروك,والمكونات المرئية لعرض البيانات وإدارتها.
لن نقوم بوصف كل من الخصائص في كل هذه المكونات. في عملية إنشاء قاعدة البيانات، في أي حال، سيتعين علينا التعرف على الخاصية التي سنستخدمها.

لذلك، دعونا ننقر بزر الماوس الأيمن على المكون IBDatabaseستظهر قائمة السياق (الشكل 59).

الشكل 59

حيث تحتاج إلى تحديد عنصر محرر قاعدة البيانات... ستظهر نافذة محرر مكونات قاعدة البيانات(الشكل 60).

الشكل 60

في الفصل اتصال دعنا نختار محلي،لأن نقوم حاليًا بإنشاء قاعدة بيانات محلية. في الميدان قاعدة البيانات تحتاج إلى إدخال اسم قاعدة البيانات الخاصة بنا. يمكنك، بالطبع، كتابة كل شيء يدويًا، ولكن من الأفضل الضغط على زر تصفح.إذا انتقلنا الآن إلى المجلد الذي يحتوي على قاعدة البيانات الخاصة بنا (TELEFONSPRAVOCHNIK.FDB)،ثم لن يظهر في هذا المجلد. من أجل تحديد قاعدة البيانات هذه، يجب عليك في السطر يكتباختر الملفات كل الملفات(*.*).سيتم الآن عرض جميع الملفات من هذا المجلد. حدد ملف قاعدة البيانات (TELEFONSPRAVOCHNIK.FDB)وانقر نعم.

في الفصل معلمات قاعدة البيانات في الميدان اسم المستخدمأدخل تسجيل الدخول الخاص بك - سيسدبا في الميدان كلمة المرورأدخل كلمة المرور - المفتاح الرئيسي. يجب أن يكون تسجيل الدخول وكلمة المرور هو نفسه الذي تم إدخاله عند إنشاء قاعدة البيانات IBExpert.وبطبيعة الحال، سوف نقوم بإدارة قاعدة البيانات باستخدام برنامج مكتوب فيه دلفي.

في القائمة المنسدلة مجموعة الأحرف دعنا نختار Win1251.دعونا نزيل علامة الاختيار موجه تسجيل الدخول لذلك ليس عليك إدخال كلمة المرور الخاصة بك في كل مرة. الحق في النافذة إعداداتيتم عرض كل ما قمنا بتعيينه وإدخاله.

الآن تحتاج إلى الضغط على الزر امتحان.قبل أن تضغط على الزر نعم،تحتاج إلى اختبار قاعدة البيانات. ستظهر نافذة (الشكل 61).

الشكل 61

إذا ظهرت مع رسالة خطأ، فقد يكون أحد الأسباب هو عدم التوافق مع البرنامج InterBase.لإصلاح هذا الخطأ، تحتاج إلى إلغاء تثبيت البرنامج إنتيربيس,إذا تم تثبيته. وتحتاج بالتأكيد إلى حذف ملف المكتبة يدويًا gds32.dllبواسطة العنوان جيم:\WINDOWS\system32.

بعد عمليات الحذف هذه، سيتعين عليك حذف و فايربيرد,لأن قمنا بإزالة المكتبة، IBExpertلن تكون قادرة على العمل بشكل طبيعي. بعد كل هذه الخطوات تحتاج إلى إعادة التثبيت فايربيرد.هناك عدة أسباب للخطأ، ولكن هذا هو الأكثر شيوعا.

دعونا نختار المكون IBQuery1وفي الممتلكات قاعدة البياناتدعنا نختار قاعدة بيانات IBD1.ملكية قاعدة البياناتيشير إلى مكون قاعدة بيانات TIBالمرتبطة بمجموعة بيانات معينة. في الممتلكات عمليةيختار معاملة IB1.ملكية عمليةهو المسؤول عن اختيار الصفقة.

خاصية المكون الرئيسي TQuerySQLوجود النوع سلاسل T . هذه القائمة من السلاسل التي تحتوي على استعلامات SQL،والتي سوف تظهر الجدول أو الجداول التي سيتم العمل معها. ولكن في وقت لاحق، أثناء تنفيذ التطبيق، الخاصية SQLيمكن إنشاؤها برمجياً باستخدام الطرق الشائعة في الفصل سلاسل T : واضح- التنظيف، يضيف- إضافة سطر، الخ.

لذلك في الممتلكات SQLانقر فوق الزر الذي يحتوي على ثلاث نقاط وفي النافذة التي تظهر، أدخل استعلام SQL(الشكل 62).

الشكل 62

يبدو الطلب كالتالي: حدد جميع الحقول ( يختار *) من الطاولة TELEPHON_SPRAVOCCHNIK (من TELEPHON_SPRAVOCCHNIK)والفرز (تصاعديًا) حسب الحقل المفتاح (الطلب حسب المفتاح).اضغط الزر نعم.

دعونا نختار المكون معاملة IB1وفي الممتلكات DefaultDatabaseدعنا نختار قاعدة بيانات IBD1 .

دعونا نختار المكون إي بيستوريدبروك1،في الممتلكات قاعدة البياناتدعنا نختار قاعدة بيانات IBD1 . في الممتلكات اسم المخزنةحدد الإجراء الخاص بنا من القائمة المنسدلة TEL_SPRAV_PROCكتبت في IBExpert.

دعونا نسلط الضوء إيبكويري1،ملكية نشيطسوف نضعها فيه حقيقي .

دعونا الاتصال بهذه الوحدة (وحدة البيانات 1)الوحدة الرئيسية تلسبراف1 عن طريق تشغيل الأمر وحدة الملف/الاستخدام..., في النافذة التي تظهر (الشكل 63.)

الشكل 63

دعنا نختار تلسبراف1 واضغط على الزر استخدام الوحدة.بعد الكلمة تطبيقفي هذه الوحدة سيكون هناك قسم الاستخداماتمع اسم الوحدة الرئيسية تلسبراف1. ها هي الوحدة الآن وحدة البيانات1يعرف عن وجود الوحدة الرئيسية تلسبراف1.

دعنا نذهب إلى الوحدة الرئيسية تلسبراف1والآن دعونا نربط الوحدة بها وحدة البيانات1.الآن تعرف هاتان الوحدتان عن وجود بعضهما البعض.

حدد الشبكة DBGrid1وفي القائمة المنسدلة للخصائص مصدر البياناتيختار DM.DataSource1 . ستظهر أسماء حقول قاعدة البيانات في شبكتنا.

لنقم الآن بإنشاء نافذة لإضافة البيانات وتحريرها. لننفذ الأمر ملف/جديد/نموذج. أولاً، دعونا نحتفظ بالنموذج عند الطلب ملف/حفظ المشروع باسم... في الميدان اسم الملفدعونا نقدم وحدة AddavRedakt1.pas ، أ اسم النموذج - AddavRedakt.dpr . في الممتلكات اسمأدخل اسم النموذج دوبريد.لنضع في النموذج المكونات اللازمة لإدخال البيانات وتحريرها:

  1. تحرير- لإدخال اللقب. في الممتلكات اسمنحن نكتب عائلةفي الممتلكات نصامسح حقل الإدخال؛
  2. تحرير- لإدخال اسم. في الممتلكات اسمنحن نكتب إيميا.في الممتلكات نصامسح حقل الإدخال؛
  3. TDateTimePicker- لإدخال التاريخ. في الممتلكات اسمنحن نكتب VData.في القائمة المنسدلة للخصائص وضع التاريخدعنا نختار دموبداون,إذا أردت، يمكنك اختيار قيمة مختلفة؛
  4. تحرير- لإدخال رقم الهاتف. في الممتلكات اسمنحن نكتب نوميرتليفونا.في الممتلكات نصامسح حقل الإدخال؛
  5. تحرير- لإدخال عنوان البريد الإلكتروني. في الممتلكات اسمنحن نكتب بريد إلكتروني.في الممتلكات نصامسح حقل الإدخال؛
  6. TCheckBox- علامة ملكية الهاتف الخليوي. إذا قمت بتحديد المربع أثناء تشغيل البرنامج، فهذا يعني أن هذا الشخص لديه هاتف خلوي. في الممتلكات التسمية التوضيحيةنحن نكتب تليفون محمول.في الممتلكات اسمنحن نكتب موبيلنيك.
  7. TComboBox- القائمة المنسدلة لاختيار المدينة. في الممتلكات اسمنحن نكتب جورود.في الممتلكات نصامسح حقل الإدخال؛
  8. زر– زر لتأكيد إضافة البيانات . في الممتلكات اسمنحن نكتب يضيف.في الممتلكات التسمية التوضيحيةاكتب موافق؛
  9. زر– زر لتأكيد تحرير البيانات. في الممتلكات اسمنحن نكتب تنقيح.في الممتلكات التسمية التوضيحيةنحن نكتب نعم.
لقد وضعنا زرين متطابقين في النموذج، لأن الضغط على زر منفصل سيحدد الإجراء الذي يجب تنفيذه على البيانات. بالطبع هذه طريقة غير عقلانية، لكنها فعالة.

دعونا نحفظ الشكل. دعونا نغلق المشروع ونفتحه مرة أخرى. بعد فتح المشروع نحتاج لرؤية علامة التبويب AddavRedakt1 (الشكل 64).

الشكل 64

لننفذ الأمر مشروع/إضافة إلى المشروع...وفي النافذة التي تظهر (الشكل 65).

الشكل 65

دعونا نختار ملفا AddavRedakt1.pas واضغط على الزر نعم.باستخدام نفس الأمر، حدد الملف DataModule1.pas إذا لم يكن لدينا علامة تبويب وحدة البيانات1.يتم استخدام هذا الأمر فقط عندما تكون النافذة مدير المشروعليس لدينا ما نحتاجه لاو dprملفات. نافذة او شباك مدير المشروعسوف يخرج على الأمر عرض/المشروع/المدير...

دعونا نربط وحدة التحرير AddavRedakt1 إلى الوحدة الرئيسية تلسبراف1.سنقوم أيضًا بتوصيل الوحدة الرئيسية بوحدة التحرير و وحدة البيانات1.

هذا كل شيء! تم إنشاء النوافذ اللازمة في هذه المرحلة. دعنا ننتقل إلى البرمجة.

في معالج الحدث عند النقر(الوحدة الرئيسية) للزر يضيفاكتب الكود التالي:

إجراء TTelefonSprav.DabavitClick(Sender: TObject);
يبدأ
   (إذا تم الضغط على زر "Addavit"، فإننا نفعل ذلك
   متغير "ExiStsDobRed" نشط)

     ExiStsDobRed:=true;
   // بالضغط على زر "Dabavit" - "العلامة = 1"
     tag:=1;
   // جعل زر "Dob" متاحًا
     DobRed.Dobav.Visible:=true;
   // الزر "الأحمر" الذي لا يمكن الوصول إليه
     DobRed.Redact.Visible:=false;
   //افتح النافذة
     DobRed.ShowModal;
نهاية؛

دعونا نعلن عن متغير عالمي ExiStsDobRedفي الفصل فار . سوف يبدو مثل هذا في الوحدة النمطية.

فار
  TelefonSprav: TTelefonSprav;
  ExiStsDobRed: boolean=false;

يشير هذا المتغير إلى ما إذا كانت النافذة مفتوحة أم لا إضافة وتحرير البيانات.هذا المتغير من النوع المنطقي وهو متساوٍ افتراضيًا خطأ شنيع.عندما تضغط على الزر "يضيف"عامل ExiStsDobRedيساوي حقيقي.

كل مكون له خاصية بطاقة شعار،والتي يمكن استخدامها كمتغير عام من النوع الصحيح حسب تقديرك. تعيين خاصية واحدة بطاقة شعار،وفقًا لهذه القيمة سيظهر الزر المطلوب. على سبيل المثال: نقرنا على الزر أداف،سيتم تشغيل الحدث الموصوف أعلاه.

كما ذكرت سابقًا، يوجد في نافذة إضافة البيانات وتحريرها زرين أداف، تنقيح(الشكل 66).

الشكل 66

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

لتطوير تطبيق دليل الهاتف، يتم استخدام بيئة البرمجة المرئية Delphi 7 وسيحتوي مشروع البرنامج على ثلاث نوافذ:

  • 1. fMain - الشكل الرئيسي للبرنامج.
  • 2. fEditor - نموذج لإضافة/تحرير الإدخالات.
  • 3. fDM - وحدة البيانات.

في نموذج fDM، سنضيف مكون ADOConnection، ومكون نوع ADOTable واحد، ومكون نوع DataSource واحد. انقر نقراً مزدوجاً فوق خاصية ConnectionString لمكون ADOConnection. سيتم فتح نافذة توصيل المكون بـ ADO (الشكل 2):

بوك. 2. نافذة للاتصال بـ ADO.

انقر فوق زر البناء. تفتح نافذة جديدة (الشكل 3.) تحتوي على إعدادات الاتصال:

أرز. 3.

حدد موفر البيانات - موفر Microsoft OLE DB لـ SQL Server. في علامة التبويب "الاتصال": حدد اسم الخادم الذي توجد عليه قاعدة البيانات الخاصة بك. الآن لنقم بتعيين الخاصية "متصل" على "صحيح". دعونا نغير خصائص ADOTable التالية: الاتصال بـ ADOConnection1؛ اسم الجدول على المشترك؛ نشط إلى صحيح. قم بتغيير الخصائص التالية لـ DataSource (سيكون هذا رابطًا للجدول): DataSet إلى ADOTable.

دعنا نذهب إلى النموذج الرئيسي. حدد ملف الأمر -> استخدم الوحدة وقم بتوصيل وحدة DM به. الآن سنكون قادرين على رؤية الجداول من النموذج الرئيسي.

دعونا نضع المكونات على النموذج الرئيسي. وهي تقع في منطقة النافذة الرئيسية للبيئة المتكاملة، والتي تسمى لوحة المكونات (الشكل 4.).

أرز. 4.

دعونا نضيف ثلاثة أزرار إلى النموذج الرئيسي fMain (الشكل 5). وهي مخصصة لتحرير الإدخال الحالي وإضافة إدخال جديد وحذفه.

الشكل 5.

تركز علامة التبويب DataControls على مكونات عرض البيانات المرئية (المرئية للمستخدم)، مثل DBGrid (شبكة تعرض جميع البيانات في جدول وتسمح لك بتحريرها)، وDBEdit (حقل تحرير بيانات مصمم لإدخال أو تحرير حقل واحد من جدول) السجل، أي خلايا الجدول)، DBMemo (لتحرير حقول MEMO)، وما إلى ذلك. الاستثناء الوحيد هو مكون DBNavigator. هذا المكون ليس مخصصًا لعرض البيانات، ولكن للتنقل عبر سجلات مجموعة البيانات أو إدراج سجل جديد أو حذف سجل قديم. قم بإضافة DBGrid وحدده، في خاصية DataSource الخاصة به، حدد fDM.ADOTable. يتم رد فعل الشبكة، ونرى أسماء الحقول (الشكل 6.).

أرز. 6.

لنقم الآن بإنشاء عامل تصفية للسجلات بناءً على معايير مختلفة. للقيام بذلك، قم بإضافة مكونين GroupBox إلى النموذج. في مفتش الكائنات (الشكل 7.) في خاصية التسمية التوضيحية لمكون GroupBox1، أدخل "تصفية بواسطة حقل واحد"، وبالنسبة لمكون GroupBox2 "تصفية حسب عدة حقول".

الشكل 7.

في GroupBox1، سنضيف 3 تسميات، و1 ComboBox، و1 تحرير، و2 أزرار اختيار. بالنسبة إلى Label1 في خاصية Caption، سنكتب "Search in"، ومن أجل Label2 "أدخل البيانات"، ومن أجل Label3 "Method". في خاصية العناصر الخاصة بمكون ComboBox، أدخل سطرين: الاسم الأخير، الهاتف (الشكل 8.).

الشكل 8.

يحتوي RadioButton على خاصية التسمية التوضيحية "من بداية السطر" و"أي حدث". في GroupBox الثاني، أضف ثلاث تسميات مع خاصية التسمية التوضيحية: اسم العائلة، الاسم الأول، الهاتف. ثلاثة مكونات تحرير وزر واحد مع خاصية التسمية التوضيحية "بحث". وأضف زرًا آخر إلى النموذج لإزالة عامل التصفية.

الآن سنقوم بإنشاء نافذة محرر البيانات. لنقم بإنشاء نموذج جديد (ملف -> جديد -> نموذج). دعونا نعيد تسمية خاصية الاسم إلى fEditor. باستخدام الأمر ملف -> استخدام الوحدة، سنقوم بتوصيل وحدة بيانات DM بالنموذج. نحن الآن بحاجة إلى تثبيت المكونات التالية في النموذج: 8 Label، 7 DBEdit، 1 DBComboBox.

دعونا نضع اللمسات الأخيرة على مكون DBComboBox. انقر نقرًا مزدوجًا فوق خاصية العناصر لفتح المحرر. وسندخل فيه ثلاثة أسطر:

شارع

خط

شارع

احفظ النص بالنقر فوق "موافق".

دعونا نربط مكونات التحكم. تحتجز ، حدد كافة مكونات التحكم (جميع المكونات باستثناء التسمية). في خاصية DataSource الخاصة بهم، حدد fDM.DSLichData، لتوصيل المكونات بمجموعة البيانات المطلوبة (الجدول). دعونا نزيل التحديد العام ونحدد DBEdit الأول. في خاصية DataField الخاصة به، حدد حقل "الاسم الأخير". تقوم هذه الخاصية بتوصيل المكون المحدد بحقل جدول محدد. بنفس الطريقة، سوف نقوم بتوصيل المكونات المتبقية إلى الحقول المقابلة.

في الجزء السفلي الأيمن، قم بتثبيت مكون التنقل DBNavigator من علامة التبويب Data Controls. تم تصميم هذا المكون للتنقل عبر السجلات، أو تمكين وضع تحرير السجل، أو حفظ التغييرات التي تم إجراؤها أو إلغاؤها، أو إضافة سجل جديد أو حذف سجل موجود. في الخاصية DataSource، حدد fDM.DSLichData لتوصيل المكون بالجدول الرئيسي. نحتاج فقط من هذا المكون إلى القدرة على الانتقال إلى بداية الجدول أو نهايته، إلى السجل التالي أو السابق. لذلك، دعونا نقوم بتوسيع خاصية VisibleButtons (إمكانية رؤية أزرار المكون) ونضبط جميع الأزرار على False باستثناء nbFirst وnbPrior وnbNext وnbLast. سيؤدي النقر فوق هذه الأزرار إلى استدعاء الطرق المقابلة لمكون ADOTable. تقوم هذه الطرق بما يلي:

أولاً - يذهب إلى السجل الأول للجدول. قبل - انتقل إلى السجل السابق. التالي - الانتقال إلى السجل التالي. الأخير - انتقل إلى السجل الأخير.

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

fDM.TLichData.Append;

DBEdit1.SetFocus;

باستخدام طريقة الإلحاق، نقوم بإضافة سجل جديد إلى الجدول. بعد ذلك، نقوم بنقل تركيز الإدخال إلى DBEdit1 بحيث لا يضطر المستخدم إلى القيام بذلك بنفسه.

إذا fDM.TLichData.Modified ثم

fDM.TLichData.Post;

وهنا نحفظ التغييرات في الجدول، إن وجدت، ونغلق النافذة.

دعنا ننتقل إلى النموذج الرئيسي. لنبدأ مع زر "مشترك جديد". ستحتاج إلى إضافة سجل جديد إلى كل جدول، ثم فتح نافذة المحرر:

fDM.TLichData.Append;

fEditor.ShowModal;

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

fEditor.ShowModal;

ونتيجة لذلك، سيتم فتح نافذة محرر وستعرض المكونات بيانات السجل الحالي.

كود الزر "حذف":

fDM.TLichData.Delete;

دعنا ننتقل إلى تصفية البيانات. في هذا الفلتر، نختار حقل بحث، ونحدد طريقة وندخل البيانات.

لنقم بإنشاء حدث OnChange لمكون Edit2.

إذا ((Length(Edit2.Text) > 0) و(Length(ComboBox1.Text) > 0)) ثم

fDM.TLichData.Filtered:=false;

إذا RadioButton1.Checked بعد ذلك

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

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

fDM.TLichData.Filtered:=true;

else fDM.TLichData.Filtered:=false;

يعني سطر شرط التصفية ما يلي - حدد تلك السجلات من العمود الذي يبدأ بنفس الأحرف المكتوبة في Edit2.Text.

تتيح لك الكلمة الأساسية LIKE مقارنة السلاسل باستخدام نمط معين. وفي هذه الحالة عليك معرفة ما يلي:

الرمز "%" (النسبة المئوية) - يستبدل أي تسلسل من الأحرف.

العلامة رقم 39 - تعني رقم الحرف " (علامة اقتباس مفردة) في جدول رموز ASCII. والحقيقة هي أن قيمة التصفية يجب تحديدها في علامات اقتباس مفردة، وبما أن علامات الاقتباس المفردة تستخدم في دلفي للحد من السلاسل، ثم إلى ضع اقتباسًا واحدًا داخل السلسلة، ويجب وضعه مرتين.

التصفية حسب حقول متعددة. لنقم بإنشاء حدث OnClick لزر البحث.

الإجراء TfMain.Button3Click(Sender: 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، أضف:= "و" else add:="";

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

إذا كان الطول (الفلتر) > 0 إذن

fDM.TLichData.Filter:= filtr;

fDM.TLichData.filtered:=true;

Showmessage("جميع الحقول فارغة!");

لتعطيل عامل التصفية، انقر فوق الزر "إزالة عامل التصفية". رمزها هو مثل هذا:

fDM.TLichData.Filter:= "";

fDM.TLichData.Filtered:= false;

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

خادم يعتمد على المقبس

يسمح لك الخادم الذي يعمل عبر بروتوكول المقبس بمعالجة الطلبات الواردة من عدد كبير من المستخدمين في وقت واحد. وفي الوقت نفسه، يمكن للمسؤول إجراء تعديلات على الإعدادات في أي وقت لإدخال حد لعدد المستخدمين الذين تتم خدمتهم في وقت واحد. بشكل افتراضي، هذا الإعداد ليس له أي قيود.

بعد اتصال العميل بالخادم، يتم فتح قناة منفصلة بمقبس يتم من خلالها تبادل البيانات. ومع ذلك، فإن الطريقة الأمثل والأكثر أمانًا هي نشر عملية منفصلة خاصة لكل اتصال جديد.

مخطط تشغيل بنية "العميل - الخادم".

دعونا نلقي نظرة فاحصة على مخطط تنفيذ البنية، ونحلل بشكل تسلسلي التعريفات المستخدمة بشكل متكرر:

1. خصائص نوع الخادم والمنفذ. لكي يتمكن المستخدم من الاتصال بالخادم، من المهم التأكد من أن المنفذ الذي يستخدمه كل من الخادم والعميل هو نفسه. تم إنشاء الغرض من هذه المعلمة في خاصية المنفذ. يتم تحديد نوع الاتصال بواسطة معلمة ServerType.

2. عملية فتح المقبس. لبدء جلسة خادم العميل، من المهم فتح المقبس والمنفذ. يتم استخدام خاصية الاستماع.

3. بعد ذلك، يتم تبادل البيانات مع المستخدم. عند اكتمال العمل، يتم قطع اتصال العميل. إذا كان ذلك مناسبًا، يتم إيقاف تشغيل الخادم، مما يؤدي إلى مقاطعة كافة الاتصالات القائمة وإيقاف عملية انتظار الاتصالات الجديدة.

استخدام TServerSocket في تطبيقات خادم العميل دلفي

يتم استخدام الأحداث OnClientWrite وOnClientRead لإرسال واستقبال المعلومات من المستخدم. في هذه الحالة، يمكنك التفاعل مع المستخدم من خلال معلمة مثل ClientSocket. غالبًا ما يتم استخدام الطرق والخصائص التالية عند العمل:

عدد المستخدمين المتصلين حاليًا؛

عدد العمليات النشطة

عدد العمليات المجانية

المنفذ واسم المضيف وعنوان IP المحلي؛

إلغاء حظر وحظر مأخذ توصيل.

في الختام، دعونا ننتبه إلى خاصية خاصة شائعة الاستخدام - البيانات. تنطبق هذه الخاصية في الحالة التالية. كقاعدة عامة، يتم استخدام الخادم لخدمة عدد كبير من المستخدمين، مما يعني أن هناك حاجة لتخزين معلومات حول كل عميل، ويجب ربط هذه المعلومات بمقبس محدد. في مثل هذه الحالات، يعد استخدام الربط اليدوي غير مريح للغاية، وبالتالي يتم استخدام خاصية البيانات على نطاق واسع. ومع ذلك، من المهم أن تتذكر أن البيانات هي مؤشر، وبالتالي من المهم التحقق من اتباع جميع قواعد العمل مع المؤشرات (مواصفات النوع، وتخصيص الذاكرة، وما إلى ذلك).

توثيق

حتى الآن، هناك القليل جدًا من الأدبيات حول تطوير تطبيقات خادم عميل دلفي المتعلقة بتطوير واستخدام المقابس. لذلك، للحصول على دراسة مفصلة لهذا الجانب، يمكنك الرجوع إلى الوثائق الخاصة بأنظمة Linux و Unix، لأن يناقش بشيء من التفصيل تقنية نشر التطبيقات باستخدام مآخذ التوصيل، ولكن كقاعدة عامة، في Perl أو C++.

نظرًا لأن التطبيق بسيط، فقد قررت استخدام قاعدة بيانات MS Jet 4.0 (وبعبارة أخرى، قاعدة بيانات MS Access). يرجع هذا القرار إلى حقيقة أن Jet (من فضلك لا تخلط بينه وبين MS Access) هو منتج مجاني ويأتي مع MS Windows (أي، لكي يعمل برنامجنا، ليس من الضروري تثبيت Access نفسه على جهاز الكمبيوتر الخاص بالعميل ). ومحرر قاعدة البيانات جيد جدًا، والنواة تدعم مجموعة من أنواع الحقول لتلبية الرغبات الأكثر انحرافًا عند تخزين البيانات.

لذلك دعونا ننشئ قاعدة بيانات جديدة، ونسميها اختبارًا ونحفظها في المجلد C:\ClientServer\Server\Data (لأسباب واضحة، قمت بحذف عملية إنشاء قاعدة بيانات جديدة في Access، وسأعطي فقط بنية الجداول المدرجة في قاعدة بياناتنا).

1. الطاولة الأولى، دعنا نسميها أولاً (حسنًا، أنا لست كاتبًا!)

2. الجدول الثاني، ولنسميه شيئًا ذكيًا - ثانيًا

حسنًا، هذا كل شيء، مع القاعدة وهذا كل شيء.

2. البرنامج
2.1. خادم التطبيق.

لنقم بإنشاء تطبيق جديد وحفظه تحت اسم Server في المجلد C:\ClientServer\Server. دعونا نضيف وحدة البيانات عن بعد إلى التطبيق من علامة التبويب Multitier في المستودع (الشكل 1).

عند إضافة RDM، سيطلب معالج الإضافة معلمات هذه الوحدة - حيث سندخل اسم خادمنا "اختبار".

سنترك كل شيء آخر دون تغيير. بعد النقر فوق الزر "موافق"، سيظهر في المشروع نموذج مشابه لوحدة البيانات العادية المسماة "اختبار". دعونا نحفظه تحت الاسم RDMFrm.pas.

لنضع عليها المكونات ADOConnection (قطعة واحدة)، ADOTable وDataSetProvider (قطعتان لكل منهما). لنستدعي مكونات ADOTable وDataSetProvider adotFirst، وadotSecond، وdspFirst، وdspSecond، على التوالي. بالنقر المزدوج على مكون ADOConnection، سيظهر معالج سلسلة الاتصال. حدد العنصر "استخدام سلسلة الاتصال" وانقر فوق الزر "إنشاء". في نافذة "خصائص اتصال البيانات" التي تظهر، حدد "Microsoft Jet 4.0 OLE DB Provider" وانقر فوق الزر "التالي". في علامة التبويب "الاتصال"، أدخل المسار إلى قاعدة البيانات، وانقر فوق الزر "التحقق من الاتصال" وتلقي رسالة تفيد بأن التحقق من الاتصال قد اكتمل. ثم أغلق المعالج بالنقر فوق الزر "موافق". يحتوي مكون ADOConnection أيضًا على خاصية تسمى LoginPrompt، والتي سنقوم بتعيينها على False و Connected to True. بالنسبة لمكونات ADOTable، قم بتعيين خاصية الاتصال على ADOConnection عن طريق التحديد من القائمة المنسدلة. قم بتعيين الخاصية TableName إلى الأول والثاني على التوالي. الخاصية CursorType هي ctDynamic، والخاصية TableDirect هي True. اتصل بـ FieldsEditor وأضف كافة الحقول هناك.

بالنسبة لمكونات DataSetProvider:

عند هذه النقطة، يمكن اعتبار عملية إنشاء خادم MIDAS البدائي كاملة. لتسجيل خادم في نظام DCOM الفرعي، تحتاج إلى تشغيل التطبيق باستخدام المعلمة /regserver - Server.exe /regserver.
واللمسة الأخيرة هي تطبيق SwitchServer من Borland، الموجود في المجلد Delphi?/Bin/scktsvr.exe. لكي يتمكن العميل من رؤية الخادم، تحتاج إلى تشغيل scktsvr.exe (إذا كان Win NT/w2k/XP مثبتًا لديك، فيمكنك تسجيل هذا التطبيق كخدمة؛ وللقيام بذلك، تحتاج إلى تشغيله باستخدام scktsvr .exe / معلمة التثبيت)

2.2. تطبيق العميل

لنقم بإنشاء تطبيق جديد وحفظه في المجلد C:\ClientServer\Client تحت اسم Client. دعونا نضع في النموذج الرئيسي مكونين كل ClientDataSet (دعنا نسميهم cdsFirst، cdsSecond)، DataSource (دعنا نسميهم dsFirst، dsSecond)، DBGrid (دعنا نسميهم dbgFirst، dbgSecond) ومكون SocetConnection واحد.

SocetConnection

إذا فعلت كل شيء بشكل صحيح، فعند تعيين الخاصية "متصل" على "صحيح"، يجب أن يبدأ تطبيق الخادم.

ClientDataSet

لنقم بتشغيل محرر الحقول (انقر نقرًا مزدوجًا على المكون) وأضف جميع الحقول هناك. للمكونات ClientDataSetدعونا نكتب المعالج sdsAfterPost

واستبداله بمعالجة الأحداث AfterPostكلا ClientDataSets.

مصدر البيانات

ملكية معنى
DataSetcdsFirst وcdsSecond على التوالي

DBGrid

ملكية معنى
مصدر البياناتdsFirst وdsSecond على التوالي

لنقم بتشغيل محرر الأعمدة (انقر نقرًا مزدوجًا على المكون) وأضف جميع الحقول هناك.
لنضع زرًا على النموذج بالقرب من الشبكات ونكتبه في معالج onClick.