الاسـتـدعـاءات


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


1.    ماهو الاستدعاء Callback :
إن الاستدعاء عبارة عن التابع الذي تكتبه وترفقه مع مكونة GUI محددة أو مع شكل الواجهة GUI، إنه يتحكم بالواجهة GUI أو سلوك المكونة عن طريق إنجاز بعض الأفعال بالتجاوب مع الحدث المطبق على المكونة ، يدعى هذا النوع من البرمجة غالباً بالبرمجة المقادة بالحدث event -driven Programming.                                                             عندما يحدث حدث للمكونة ، فإن الماتلاب يستحضر استدعاء المكونة التي طلب في الحديث ، ويمكن أن تكون المكونة أي وسيلة تحكم مثل زر ضغط أو مربع قائمة أو منزلقة كما يمكن أن تكون أيضاً قائمة أو لوحة أو مجموعة أزرار.

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





ملفات واجهة المستخدم الرسومية GUI
1.    الملفات M-files و ملفات الشكل FIG-file
عندما تقوم بتخزين أو تنفيذ واجهتك لأول مرة فإن GUIDE سيخزن الواجهة بشكل افتراضي بملفين:
·        ملف الشكل FIG-file ذو الامتداد .fig والذي يتضمن وصفاً كاملاً لتخطيط الواجهة و مكونات الواجهة مثل أزرار الضغط، المحاور، اللوحات، القوائم، و إلى ما هنالك. إن ملف الشكل FIG-file عبارة عن ملف رقمي ثنائي ولا يمكن تعديله باستثناء تغيير التخطيط في GUIDE. لاحظ أن هذا الملف FIG-file هو نوع من ملفات MAT-file.
·        الملف M-file ذو الامتداد .m والذي بشكل أولي يتضمن شيفرة التهيئة و قوالب لبعض الاستدعاءات التي تكون ضرورية للتحكم بسلوك الواجهة. إذ يجب عليك أن تضيف الاستدعاءات التي تكتبها لمكونات واجهتك إلى هذا الملف.
حالما تخزن واجهتك فإن GUIDE سيفتح بشكل أوتوماتيكي ملف M-file في محررك الافتراضي. إن كلا الملفين FIG-file و M-file يتوضعان عادة بنفس المجلد، وهما يقابلان مهام تخطيط و برمجة الواجهة GUI. عندما تقوم بتخطيط الواجهة من محرر التخطيط، فإن عملك سيتم تخزينه في ملف FIG-file، وعندما تقوم ببرمجة الواجهة، فإن عملك سيتم تخزينه في الملف M-file.
إذا تضمنت الواجهة عناصر ActiveX، فإن GUIDE يولد أيضاً ملفاً لكل مكونة ActiveX.


2.    بنية ملف M-file الواجهة GUI
إن الملف M-file للواجهة GUI الذي يولده GUIDE عبارة عن ملف تابع. إن اسم التابع الأساسي هو نفس الاسم لملف M-file. مثلاً: إذا كان اسم ملف M-file هو mygui.m، عندها فإن اسم التابع الأساسي هو mygui. إن كل استدعاء في الملف هو تابع جزئي Subfunction للتابع الأساسي.
عندما يقوم GUIDE بتوليد ملف M-file، فإنه و بشكل أوتوماتيكي يضم قوالب أغلب الاستدعاءات شائعة الاستخدام لكل مكونة. إن الملف M-file يتضمن أيضاً شيفرة التهيئة، وكذلك استدعاء تابع الافتتاح واستدعاء تابع الخرج. يجب عليك أن تضيف شيفرة إلى استدعاء المكونات لواجهتك من أجل أن تنجز الأعمال التي تريد، ومن جهة أخرى تستطيع أيضاً إضافة شيفرة لاستدعاء تابع الافتتاح واستدعاء تابع الخرج. إن الأجزاء الأساسية لملف M-file الواجهة GUI كما هو في الجدول.


صياغة اسم الاستدعاء و وسطائه
إن GUIDE يعرف اصطلاحات لأسماء الاستدعاء ووسطائه و يصيغ هذه المصطلحات في قوالب و إصدارات الاستدعاء التي تضاف إلى ملف M-file. كل قال يكون مشابه للتابع الجزئي callback لزر الضغط الموضح في العبارات التالية:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
إن سطر التعليق الأول يصف الحدث الذي يشغل تنفيذ الاستدعاء. إن هذا السطر يتبع بسطر تعريف التابع، أما التعليقات الباقية تصف وسطاء الدخل. أدخل شيفرة البرنامج بعد التعليق الأخير.يمكنك تجنب التوليد الآلي لأسطر تعليقات الاستدعاء للاستدعاءات الجديدة. في مربع حوار التفضيلات Preferences، اختر GUIDE وألغ الخيار:
Add Comments for newly generated Callback functions


1.    تسمية توابع الاستدعاء
إن مثال الاستدعاء الموضح أعلاه يوضح التعريف التالي للتابع:
function pushbutton1_Callback(hObject, eventdata, handles)
عندما يقوم GUIDE بتوليد القالب، فإنه ينشئ اسم الاستدعاء بإلحاق محرف الخط السفلي (_) واسم خاصية الاستدعاء إلى خاصية Tag للمكونة. في المثال المدروس، فإن pushbutton1 تكون خاصية Tag لزر الضغط، وcallback يكون واحداً من خواص الاستدعاء لزر الضغط. إن خاصية Tag تعرف وبشكل وحيد المكونة ضمن الواجهة GUI. في المرة الأولى التي تخزن فيها الواجهة GUI بعد إضافة المكونة، يضيف GUIDE استدعاءات هذه المكونة إلى ملف M-file ويولد أسماء الاستدعاء باستخدام القيمة الحالية لخاصية Tag. وإذا أردت تغيير قيمة Tag الافتراضية فإنه عليك أن تفعل ذلك قبل تخزين الواجهة GUI.

2.    تغيير أسماء الاستدعاءات المخصصة من GUIDE
يمكنك تغيير أسماء الاستدعاءات المخصصة من GUIDE بإحدى الطرق التالية :
أ‌.       تغيير خاصية Tag
يمكنك أن تغير خصائص Tag لإعطاء استدعاءات المكونة اسماً ذا معنى أقوى. أي أنه من الممكن تغيير خاصية Tag من pushbutton1 إلى closebutton. إذا أمكن، قم بتغيير خاصية Tag قبل تخزين الواجهة، وعندها فإن GUIDE وبشكل أوتوماتيكي يستخدم القيمة الجديدة عندما يسمي الاستدعاءات. مع ذلك فإنه إذا قمت بتغيير خاصية Tag بعد تخزين الواجهة GUI، فإن GUIDE سيحدث الأجزاء التالية تبعاً للقيمة الجديدة للـ Tag، مؤمناً جعل كل المكونات تملك قيم Tag مختلفة:
o      توابع استدعاء المكونات في ملف M-file.
o      قيم خصائص استدعاء المكونات، التي تستطيع عرضها في مراقب الخاصية.
o      الإشارة في ملف M-file إلى حقل بنية handles التي تتضمن مقبض المكونات.

ب‌.   تغيير خاصية الاستدعاء
لإعادة تسمية تابع جزئي لاستدعاء جزئي بدون تغيير خاصية Tag:
o      استبدل العبارة النصية للاسم في خاصية الاستدعاء باسم جديد. على سبيل المثال، إذا كانت قيمة خاصية الاستدعاء لزر الضغط في mygui هي:
mygui('pb1_Callback',gcbo,[ ],guidata(hObject))
        فإن العبارة النصية pb1_Callback عبارة عن الاسم لتابع الاستدعاء. غير الاسم إلى
       الاسم المطلوب، على سبيل المثال، closebutton.
o      يجب عليك أن تحدث كل حالات اسم تابع الاستدعاء في ملف M-file.
o      يجب عليك تحديث المراجع في ملف M-file إلى حقل بنية handles التي تتضمن مقبض المكونات.

3.    وسطاء الدخل
إن جميع الاستدعاءات في ملف للواجهة GUI تملك وسطاء الدخل التالية:
§        hobject: مقبض العنصر (المكونة) الذي يتم به تنفيذ الاستدعاء.
§        eventdata: تحجز لاستخدامات لاحقة.
§        handles: بنية تتضمن مقابض العناصر في الشكل. وكذلك معطيات التطبيقات المعرفة.

4.    البنية Handles
ينشئ GUIDE البنية handles التي تتضمن مقابض كل العناصر في الشكل، من أجل الواجهات GUI التي تتضمن نص محرر، لوحة، قائمة منبثقة، وزر ضغط، فإن البنية handles تبدو في الأصل مشابهة للنص التالي، إن GUIDE يستخدم خاصية tag للمكونات لتسمية عنصر البنية وذلك من أجل التعامل معه.
 handles =                                                                                           
           Figure1: 160.0011           Edit1: 9.0020
           Uipanel1: 8.0017           Popupmenu: 7.0018           Pushbutton1: 161.0011           Output: 160.0011
     إن GUIDE ينشئ ويعرض بنية handles كمعطيات للواجهة GUI، حيث تمرر كوسيط
     دخل لكل الاستدعاءات وتمكن استدعاءات الواجهة من مشاركة قيم الخاصية ومعطيات
     التطبيق.

استدعاءات التهيئة
إن GUIDE بشكل تلقائي يتضمن استدعاءين، تابع الافتتاح وتابع الخرج في كل ملف M-file للواجهة GUI التي يتم إنشاؤها وبناؤها.

§        تابع الافتتاح Opening Function
إن تابع الافتتاح هو الاستدعاء الأول في كل ملف M-file للواجهة. إن هذا الاستدعاء يتم تنفيذه فقط قبل أن تصبح الواجهة GUI مرئية للمستخدم، ولكن بعد أن يتم إنشاء كل المكونات أي أنه بعد أن يتم تنفيذ استدعاءات CreateFcn للمكونات، إذا كان أي منها بحاجة لتنفيذ.
يمكنك استخدام تابع الافتتاح لإنجاز مهام التهيئة قبل أن يدخل المستخدم إلى الواجهة. على سبيل المثال، يمكنك أن تستخدمه لإنشاء المعطيات أو أن تقرأ المعطيات من مصدر خارجي، كما أن وسطاء سطر أمر الواجهة GUI تمرر إلى تابع الافتتاح.

أ‌.       تسمية التابع وقالبه
إن GUIDE يسمي تابع الافتتاح بإلحاقه العبارة OpeningFcn إلى ملف M-file. يقدم النص التالي مثالاً لقالب افتتاح لملف M-file الواجهة mygui:
% --- Executes just before mygui is made visible.
function mygui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in b future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to mygui (see VARARGIN)

% Choose default command line output for mygui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes mygui wait for user response (see UIRESUME)
% uiwait(handles.mygui);

ب‌.  وسطاء الدخل
إن تابع الافتتاح يملك أربعة وسطاء دخل: varargin، handles، eventdata، وhobject. إن تابع الافتتاح يستطيع أن يصنع مثل هذه الوسطاء المتاحة للاستدعاءات بإضافتها إلى بنية handles.
تمرر وسطاء سطر الأمر إلى تابع الافتتاح خلال varargin. إذا قمت بفتح الواجهة GUI مع الزوج اسم الخاصية/قيمة الخاصية كوسطاء، فإن الواجهة GUI تفتح بالخاصية الموضوعة إلى القيمة المخصصة. على سبيل المثال: my_gui('Position',[71.8 44.9 74.8 19.7])
يفتح الواجهة GUI في المكان المخصص. حيث أن Position هي خاصية شكل قانونية (أي أنها إحدى خواص الشكل القياسية). إذا كان وسيط الدخل ليس خاصية شكل قانونية فإنه يجب عليك أن تضيف شيفرة لتابع الافتتاح لكي تتمكن من استخدام هذا الوسيط.

ت‌.   شيفرة القالب الأولي
بشكل أولي، فإن قالب تابع الدخل يتضمن هذه الأسطر من الشيفرة:
·        Handles.output = hObject: يضيف عنصر جديد output إلى البنية handles و يخصصها بقيمة الدخل hObject الذي يكون مقبض الشكل (مقبض الواجهة GUI). إن المقبض سيستخدم لاحقاً من قبل تابع الخرج.
·        guidata (hObject, handles) : يخزن البنية Handles. يجب عليك أن تستخدم guidata لتخزين أي تغيرات تنفذها على البنية handles. حيث أنه غير كافي فقط أن تضع القيمة في حقل handles.
·        uiwait (handles, mygui) : يكون هذا الخيار معلقاً في البداية، ويقوم بحجب تنفيذ الواجهة حتى يتم استدعاء uiresume أو يتم حذف الواجهة. لاحظ أن uiwait يسمح للمستخدم بالدخول إلى النوافذ الأخرى في الماتلاب.

§        تابع الخرج
إن تابع الخرج يرجع إلى سطر الأمر MATLAB قيم الخرج (بارامترات الخرج) التي تم توليدها خلال التنفيذ. إن هذا التابع ينفذ عندما يرجع تابع الافتتاح عنصر تحكم وقبل أن يعود عنصر التحكم إلى سطر الأمر. إن هذا يعني أنه يجب أن تولد قيم الخرج في تابع الافتتاح، أو نستدعي uiwait في تابع الافتتاح لإيقاف تنفيذه بينما تقوم الاستدعاءات الأخرى بتوليد قيم الخرج.

أ‌.  .  تسمية التابع وقالبه
إن GUIDE يسمي تابع الخرج بإلحاقه العبارة _OutputFcn إلى اسم ملف M-file. هذا مثال عن قالب لتابع خرج كما يبدو في ملف mygui M-file:

% --- Outputs from this function are returned to the command line.
function varargout = program23_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in b future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

     ب‌...  وسطاء الدخل
إن تابع الخرج يملك ثلاثة وسطاء دخل: handles ، eventdata ،  hObject.

ت‌. .  وسطاء الخرج
إن تابع الخرج يملك وسيط خرج واحد وهو  varargout الذي يعود إلى سطر الأمر. بشكل افتراضي فإن تابع الخرج يخصص handles.output للوسيط varargout. هكذا فإن الخرج الافتراضي يكون مقبض الواجهة GUI التي تخصصه العبارة handles.output في تابع الافتتاح. يمكنك تغيير الخرج عن طريق:
·        تغيير قيم handles.output. والتي يمكن أن تكون أي قيمة MATLAB قانونية متضمنة بنية أو مصفوفة خلية.
·        إضافة وسطاء خرج إلى varargout.
        إن varargout عبارة عن مصفوفة خلية. إنها تستطيع أن تتضمن أي عدد من وسطاء
        الخرج. بشكل افتراضي
، فإن GUIDE ينشئ وسيط خرج واحد،  handles.output. لإنشاء
        وسيط خرج إضافي
، أنشئ حقلاً جديداً في البنية handles وأضفه إلى Varargout باستخدام
        الأمر المشابه كمايلي:
varargout{2} = handles.output;