الفصل الأول : الربـــط بـ DDE
ترجمـة وتفصيل زكيري عبد العالي
[ALIGN=RIGHT]الفهرس :
1. الربط بـ DDE
أ-تعريف DDE
ب-المكونات المستعملة للربط
ج-استعمالات
2. جزء الخــادم
3. جزء الزبــون
4. حالة استثنائية
أ- خـادم Non-Delphi
ب- زبـون Non-Delphi
5. الخلاصة
1-الربط بـ DDE:
تعني DEE (Dynamic Data Exchange soit en Français échange de donnée dynamique)
أي تغيير المعطيات آليا حيث تسمح هذه الطريقة بالتخاطب بين تطبيقين لا نتحدث الآن عن OLE بل هي طريقة أخرى مختلفة تماما . الهدف من هدا الفصل ليس أين يمكن استعمال هذه الطريقة ومتي بل الهدف هو سهولة التخاطب والربط الديناميكي بالدلفي .
أ-تعريف DDE:
هو التخاطب بين تطبيقين مع بعضهم البعض , على شرط أن يكونا منفذين . إذن نقول أن إحدى التطبيقين هو الخــادم والآخر هو الزبـون , كما يمكن للخـادم أن يكون زبون لتطبيق أخر .
اما عن الاتصال فهو يتم حسب طريقتين إما أن يطلب الزبون بعض المعلومات من حين إلى أخر آو أن يرسل الخادم تنبيه ثم معطية حين وجودها .
الربط بطريقة DEE
يمثل من الخادم الى الزبون
ب-المكونات المستعملة للربط :
في شريط المكونات systeme نجد أربعة مكونات وهي المكونات الخاصة بالربط ب DDE.
DdeServerConv, DdeServerItem, DdeClientConv et DdeClientItem.
ج-استعمالات :
يتمثل دور كل من DdeServerConv DdeClientConv بفتح مجال الحوار بين الخادم و الزبون , كما يجب إضافة المكونين DdeServerItem DdeClientItem وهما المسؤولان عن تبادل المعطيات والتحكم في كمية المعطيات المتبادلة .
المكونين DdeServerItem DdeClientItem بإعطاء الخاصيتين على التوالي :
Lines من نوع TStrings
Text من نوع Tstring
وهما الخاصيتين المحددتين الى حجم المعطيات المتبادلة فالخاصية text محددة ب 255 رمز
6. جزء الخــادم
بدانا بالخادم لسببين هما :
1- اولا : بمجرد ان يتم الربط و يتحقق الخادم نتعرف على نوع المعطيات التي سيتم مبادلتها
2- ثانيا : حين يتم تنفيذ تطبيق الزبون يتم تنفيذ تطبق وشحن الخادم اليا .
افتح مشروع جديد ضع على الفورم DdeServerConv و DdeServerItem
ملاحظة لست ملزم عزيزي الطالب بإضافة المكون DdeServerConv , حيينها تصبح النافذة التي تملك DdeServerItem الخادم لكن المشكلة عند تغيير عنوان النافذة والذي يعتبر المستعمل للتعرف على الخادم يتم قطع الاتصال .إذن أنصحك بوضع المكون DdeServerConv لتحديد الخادم .
ملاحظة لست ملزم عزيزي الطالب بإضافة المكون DdeServerConv , حيينها تصبح النافذة التي تملك DdeServerItem الخادم لكن المشكلة عند تغيير عنوان النافذة والذي يعتبر المستعمل للتعرف على الخادم يتم قطع الاتصال .إذن أنصحك بوضع المكون DdeServerConv لتحديد الخادم .
لوضع المعطيات في DdeServerItem هي مجرد عملية إسناد عادية نكتب :
procedure TForm1.Edit1OnChange(Sender : Tobject);begin DdeServerItem1.Text := Edit1.Text; End;
ولان لم يبقى الى شحن خصائص DdeServerItem وينتهي جزء الخادم اذن نقوم بتغيير الخاصية ServerConv بوضع اسم المكون DdeServerConv او بوضع اسم المشروع ولاحقته .
7. جزء الزبــون:
و الآن ننتقل إلى الزبون فنضيف إجباريا هذه المرة المكون DdeClientConv و DdeClientItem
1- DdeClientConv
*- نقوم بتغيير الخاصية DdeService الخاصة طبعا ب DdeClientConv
*-نقم بتغيير الخاصية ConnectMode الى DdeManual
*-بالنقر مرتين على DdeService نتحصل على
-في الخاصية SERVICE نكتب اسم مشروع الخادم ولاحقته .
-في الخاصية RUBIRIQUE نكتب اسم المكون DdeServerConv.
*-نغير في الخاصية Service application : ونكتب فيها اسم المشروع الجديد للخادم
2- DdeClientItem
*- نقوم بتغيير الخاصية DdeConv ونكتب DdeServerConv
*-نقم بتغيير الخاصية DdeItem ونكتب اسم المكون DdeServerItem
نقوم الان بتغيير الخاصية ConnectMode الى DdeAutomatic والخاصة بالمكون DdeClientConv
في الحد Onchange للمكون DdeClientItem نكتب :
procedureTForm1.DdeClientItem1Change(Sender: Tobject(;begin // Récupère les informations du serveur et les placent dans Edit1 Edit1.Text := DdeClientItem1.text; End;
واخيرا تستطيع تنفيذ المشروع وملاحظة النتيجة حين تغيير النص الموجود في الخادم يتغيير في الزبون .
procedureTForm1.DdeClientItem1Change(Sender: Tobject(;begin // Récupère les informations du serveur et les placent dans Edit1 Edit1.Text := DdeClientItem1.text; End;
8. حالة استثنائية
لو قلت لي نعم جيد لكن لو كان الخادم ليس تطبيق دلفي فما العمل ؟
حسننا.يوجد حل وحيد لكن يجب ان تكون على معرفة بتطبيقات زبون/خادم لااطيل
للتخاطب مع الخادم يجب :
1- معرفة اسم الخادم وهو سهل لانه ممثل باسم التطبيق .
2- معرفة اسم service
3- معرفة الموضوع topic اي تحديد نوع المعطيات المسترجعة .
أ-خـادم Non-Delphi
ناخذ مثالا عن تطبيق دلفي زبون يتخاطب مع تطبق وينداوز مسيير البرامجDdeClientConv, DdeClientItem,
-نفتح مشروع جديد ونضع المكونات التالية : DdeClientConv , DdeClientItem وlistBox
-نغيير في خاصيات المكون DdeClientConv :
*-لاعلام الدلفي بالنتظار حتي تتم عملية الشحن ddeManuel
*-نقرتين على DdeService لتحديد الموضوعProgman في service
*- في service application ادخل Progman
نغيير ايضا في DdeClientItem
*- في الخاصيةDdeConv نكتب اسم DdeClientConv
*- في الخاصية DdeItem نحدد Groups
اخيرا نرج الخاصيةConnectMode الى DdeAutomatic للمكون الاول وبهذا يتم الشحن
في الخاصية OnChange للمكون DdeClientItem نضيف حلقة ليتم نسخ عناصر DdeCLientItem.Lines
في ListBox
procedureTForm1.DdeClientItem1Change(Sender: Tobject); var i : integer; begin // Récupère les informations du serveur et les placent dans ListBox1 for i := 0 to DdeClientItem1.Lines.Count - 1 do begin ListBox1.Lines.Add(DdeClientItem1.Lines); end; end;
ب- زبـون Non-Delphi
في المثال التالي نستعمل HTBasic اعلم ان الكثير يعرفه لكن كن على علم عزيزي الطالب انه يمكن الاتصال باي تطبيق مهما كانة اللغة المستعملة فلا يوجد في الحيات سوى الدلفي والسي.
INTEGER Result,Ch1,Ch2
DIM Ret$[256],Htbvers$[80]
Htbvers$=SYSTEM$("VERSION:HTB")
IF POS(Htbvers$,"9") THEN
Htbvers$="9"
ELSE
Htbvers$="5"
END IF
CLEAR SCREEN
! Charge la librairie DDE correspondant à la version du HTB, seulement si elle n'est pas déjà chargée.
IF NOT INMEM("Ddeinit") THEN
SELECT Htbvers$
CASE "5"
LOADSUB ALL FROM "htbdde.csb"
CASE "9"
LOADSUB ALL FROM "htb8dde.csb"
END SELECT
PRINT
PRINT " BASIC DDE Client CSUB (R"&Htbvers$&") est chargé.."
END IF
CALL Ddeinit(Result)
IF Result=0 THEN
DISP "Doing some DDE conversation.."
!WAIT 2
! Connexion à l'application, retourne un numéro de canal dans Ch
CALL Ddeconnect(Ch1,"ServeurPrj","DdeServerConv1")
IF Ch1<>0 THEN
! Se reconnecte avec un autre canal
CALL Ddeconnect(Ch2,"ServeurPrj","DDeServerConv1")
CALL Dderequest(Ch2,"DDeServerItem1",Ret$,Result) ! récupère la valeur
CALL Ddeterminate(Ch2,Result) ! Termine la connexion sur le second canal
CALL Ddeterminate(Ch1,Result) ! Sur le premier
ELSE
BEEP
Buf$="ServeurPrj DDE connexion échouée"
END IF
CALL Ddeclean(Result) ! Libère les ressources DDE
ELSE
BEEP
Buf$="DDE initialisation échouée"
END IF
CLEAR SCREEN
PRINT Ddeinfo$
PRINT "Valeur du serveur: ";Ret$;
PRINT
PRINT Buf$
PRINT "DDE Test terminé"
DELSUB Ddeinit TO END
END9. الخلاصة :
لتحقيق اتصال او ربط يدوي يكفي ان نغيير ConnectMode الى DdeManual للمكون DdeClientConv
وعند ما نريد استرجاع المعطيات نستخدم RequestDataاعلم انه لا نحتاج الى DdeClientItems في هذه الحالة .