قيادة المعطيات و الربط بين عدة واجهات


قيادة المعطيات و الربط بين عدة واجهات
آليات قيادة المعطيات
إن أغلب الواجهات الرسومية GUI تولد أو تستخدم المعطيات الخاصة بالتطبيق. سنشرح في هذه الفقرة الآليات الثلاثة لقيادة المعطيات المعرفة للتطبيقات في بيئة GUI. إنها تؤمن وسيلة للتطبيقات من أجل تخزين و استرجاع وتبادل المعطيات المخزنة.
إن آليات معطيات الواجهة
GUI و معطيات التطبيق تكون متشابهة ولكن معطيات GUI يمكن أن تكون أبسط للاستخدام. يستخدم GUIDE بشكل خاص معطيات GUI لقيادة البنية handles, و لكن تستطيع أيضاً استخدام بنية handles لمعطيات GUI أو معطيات التطبيقات لقيادة المعطيات المعرفة للتطبيق. إن خاصية UserData يمكن أن تحمل المعطيات المعرفة للتطبيق.

معطيات الواجهة GUI
تتم قيادة معطيات الواجهة GUI باستخدام التابع guidata. حيث يستطيع هذا التابع أن يخزن متحول وحيد كمعطيات GUI. كما أنه يستخدم أيضاً لاسترجاع قيمة هذا المتحول.

1) حول معطيات الواجهة GUI تكون دائماً مرافقة لشكل الواجهة GUI, و تكون متاحة لكل استدعاءات مكونات الواجهة. إذا حددت مقبض المكونة عندما تخزن أو تسترجع معطيات الواجهة فإن MATLAB وبشكل أوتوماتيكي يرفق المعطيات مع شكل أم (parent) المكونات.
إن معطيات الواجهة تتضمن فقط متحولاً وحيداً طوال الوقت. وكتابة معطيات الواجهة يكون فوق معطيات الواجهة الموجودة. لهذا السبب فإن معطيات الواجهة تكون معرفة عادة لتكون البنية التي تستطيع بها أن تضيف حقولاً لها كيفما تريد.
إن معطيات الواجهة تزود مطوري التطبيق بالواجهة الملائمة لمعطيات تطبيق الأشكال.

2) معطيات الواجهة GUI في GUIDE :
إن GUIDE و بشكل أوتوماتيكي يستخدم guidata ولإنشاء المحافظة على بنية handles, هذه البنية تمرر بشكل أوتوماتيكي كوسيط لكل استدعاء, حيث أن البنية handles تتضمن المقابض لكل المكونات في الواجهة GUI.
في الواجهات المبنية باستخدام GUIDE, فإنه لا يمكنك استخدام guidata لقيادة أي متحول غير البنية handles. إذا فعلت ذلك فإنه يمكن أن تكتب فوق بنية handle وبالتالي واجهتك لن تعمل. إذا كنت تريد استخدام معطيات الواجهة GUI لتشارك المعطيات المعرفة لتطبيق ضمن الاستدعاءات فإنه يجب عليك أن تخزن المعطيات في الحقول التي تريد أن تضيفها إلى بنية handles.

3) إضافة حقول إلى بنية handles
لإضافة حقل إلى بنية
handles, و التي تمرر كوسيط استدعاء في GUIDE :
- خصص قيمة للحقل الجديد المضاف إلى البنية. على سبيل المثال :
handles.number_errors=0;
أضف الحقل number_errors إلى البنية handles وضع فيه قيمة مساوية للصفر.

- استخدم الأمر التالي لتخزين المعطيات.
guidata(hObject,handles(
عندما يكون hObject مقبض المكونة التي شغلها الاستدعاء. فإنه سيتم تمريره بشكل أوتوماتيكي لكل استدعاء.

4) تغيير معطيات الواجهة GUI في ملف M-file المولد من GUIDE
في
GUIDE المولد لملف M-file, فإن معطيات الواجهة GUI تمثل بشكل دائم بالبنية handles. هذا المثال يحدث البنية handles ومن ثم يخزنها :
§        افرض أن البنية handles تتضمن الحقل المعرف للتطبيقhandles.when  الذي يملك القيمة 'now'.
§        في استدعاء الواجهة GUI, نفذ التغيير المطلوب handles. هذا المثال يغير قيمة handles.when إلى 'later', ولكنه لا يقوم بتخزين البنية handles.
handles.when='later';
§        خزن النسخة المغيرة للبنية handles بالأمر :
Guidata(hObject,handles)
حيث أن hObject الذي يمرر بشكل أوتوماتيكي إلى كل استدعاء, يكون المقبض للمكونة التي شغلها الاستدعاء. إذا لم تخزن البنية handles , فإن التغيرات التي نفذتها في الخطوة السابقة ستضيع.

  صيغة الربط بين عدة واجهات Multipages GUI forms
من خلال المثال التالي  سنتعلم  كيف يمكن إنشاء GUI لصفحات/شرائح مختلفة ، وأيضاً إنشاء واجهة رئيسيةmaster gui لتتحكم بعدة واجهات .
-      handles
لكل واجهة رسومية GUI بنية (structure) تدعى : handles ، و لكي نتمكن من رؤية أو تحرير هذه الـبنية يمكن استخدام guidata

ý   مقبض الحصول على الخاصية GET HANDLES
h=guidata (gui_reference);

ý   مقبض ضبط الخاصية SET HANDLES
guidata (gui_reference,h);
حيث gui_reference هو رقم مزدوج يعمل كمؤشر يشير إلى gui ، لتقوم بتخزين هذا المؤشر كمتغير يقوم باستدعاء الـ gui بواسطة الـ output .
gui_reference=gui1;

-      Creating Slide Pages
-         قم بإنشاء واجهتين 2guis  (GUI1.m and GUI2.m) .
-         وضع في كل منهما الكائنات التالية:
-       two edit box : edit1 , edit2.
-       two pushbutton : pushbutton1 with title Next , pushbutton2 with title Previous.
-         الآن من أجل عملية التصفح سنضيف في كل gui :
next and prev
-         قم بإضافة السطرين التاليين في التابع   OpeningFcn لكل من الواجهتين اللتين قمت بإنشائهما gui1 ,gui2
function gui1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui2 (see VARARGIN)

% Choose default command line output for gui2
handles.output = hObject;
handles.next=1;
handles.prev=1;
% Update handles structure
guidata(hObject, handles);


-         الآن  اذهب إلى pushbutton1_callback وأضف هذه الأسطر لعرض الشريحة التالية وإخفاء نفسه :
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.next,'visible','on');
set(handles.output,'visible','off');

-         ومن أجل pushbutton2_callback تماماً كالسابق لكن لعرض الشريحة السابقة :
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.prev,'visible','on');
set(handles.output,'visible','off');


-      Creating Master Slide
-         قم بإنشاء gui خالية أضف إليها pushbutton  بعنوان start واحفظها (guio.fig ) ، وبشكل آلي سيتم إنشاء  الملف guio.m .
-         الآن في هذا الملف ، اذهب إلى guiOpeningFcn ، وستجد الكود التالي :

function gui0_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled (see VARARGIN)

% Choose default command line output for untitled
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

-         قم بتحرير هذا الكود ،لاستدعاء الشريحتين وحفظ مؤشرات تشير لهم فيه .

% Choose default command line output for guio
handles.output = hObject;

handles.s1=gui1;
handles.s2=gui2;

h1=guidata(handles.s1);
h1.next=handles.s2;
h1.prev=hObject;
guidata(handles.s1,h1);

h2=guidata(handles.s2);
h2.next=hObject;
h2.prev=handles.s1;
guidata(handles.s2,h2);

% Update handles structure
guidata(hObject, handles);
handles.output;
%set(handles.output,'Visible','off');
set(handles.s1,'visible','off');
set(handles.s2,'visible','off');
guidata(hObject,handles);

-         كما ترى ، لقد استدعيت gui1 و gui2 وحفظت مصدرهم أو مؤشرات تعود إلى handles.s1 و handles.s2 .
-         ومن أجل التصفح .. أشرنا إلى  s2 كشريحة تالية للشريحةs1(slide 1) والشريحة الرئيسية mastergui كشريحة سابقة لـ s1 ،و بنفس الطريقة لـ s2(slide 2) .

-         الآن نحتاج للتعديل على كود زر البداية start button لإخفاء الصفحة الرئيسية ونبدأ slide 1 .
هنا ببساطة أضف إلى  pushbutton1_Callback الموجود في gui0.m الأسطر التالية :
set(handles.output,'visible','off');
set(handles.s1,'visible','on');
set(handles.s2,'visible','off');
-         تذكر أن : handles.output  يُشير إلى مؤشر gui  نفسه .

-      Final Touch: Processing your data
-        بينما أنت تعمل .. ستعود إلى الصفحة الرئيسية مرة أخرى لأن الشريحة التالية لـ s2 هي masterpage الصفحة الرئيسية ، هنا تحتاج لجمع كل البيانات ولتتمكن من استخدامها كما تريد .
-         على سبيل المثال .. أريد أن أضيف  الأرقام الأربعة  المكتوبة في  4 editboxes  إلى بعضها ، أي جمع الأرقام المكتوبة في gui1  و gui2  الموجودة ضمن الـ editboxes  .
-         للسهولة ، ضع  زر آخر pushbutton  باسم Submit  ، وأيضاً Editbox بعنوان Result ، على الـصفحة الرئيسية  masterpage ، واكتب كود الحساب في Submit_callback  .
-         لا حاجة لأن تقول أنك تحتاج لضغط هذا الزر submit_button عندما تعود إلى الصفحة الرئيسية لتعمل التحرير النهائي .
-         هذا كود الحساب :
h1=guidata(handles.s1);
a1=get(h1.edit1,'string');
a2=get(h1.edit2,'string');
h2=guidata(handles.s2);
a3=get(h2.edit1,'string');
a4=get(h2.edit2,'string');
a=str2num(a1)+str2num(a2)+str2num(a3)+str2num(a4);
set(handles.result,'string',a);
-          فائدة الصفحة الرئيسية أنها تتيح لك أن تعيد ترتيب وتنظيم شرائحك بسهولة كبيرة ،وكل gui بشكل مستقل .