Шаг 27.
Visual Prolog.
Сгенерированный код

    На этом шаге мы рассмотрим сгенерированный код.

    Теперь посмотрим на сгенерированный код и разберемся, как он работает.

   dlg_person_Create (Parent):-
      NAME= "",
      AGE=void,
      MARRIED=b_false,
      SKILLS=[1,3,5], 
      SEX=idc_male, 
   %MARK Person,   new variables
      dialog_CreateModal(Parent,[resdlg(dlg_person_ResID,wd_Modal)],
      [
   %BEGIN Person, ControlList, 16:10:55-23.11.2006, Auto updated!
      df(idc_name,editstr(NAME,[]),nopr), 
      df(idc_age,editint(AGE,[range(0,70)]),nopr),
      df(idc_married,checkbox(MARRIED),nopr),
      df(idc_skills,listbox(["prolog","c","с++","pascal",
        "database","word","excel","basic"],SKILLS),nopr),
      df(SEX,radiobuttongroup([idc_male,idc_female]),nopr)
    %END Person, ControlList 
       ],
      dlg_person_eh, 0, VALLIST, ANSWER),
    dlg_person_handle_answer(ANSWER,VALLIST).
    dlg_person_handle_answer(idc_ok,VALLIST):-!,
       dlg_person_update(VALLIST). dlg_person_handle_answer(idc_cancel,_):-
       !.	%Handle Esc and Cancel here
    dlg_person_handle_answer (_,_) :-
       errorexit().
    dlg_person_update(_VALLIST):-
   %BEGIN Person,Update controls,09:07:56-20.6.2006,Auto updated!
    _NAME = dialog_VLGetstr(idc_name,_VALLIST), 
    _AGE = dialog_VLGetint(idc_age,_VALLIST), 
    _MARRIED = dialog_VLGetCheck(idc_married,_VALLIST), 
     dialog_VLGetListBox(idc_skills,_VALLIST,
       _IDC_LISTBOX_ITEMLIST,_SKILLS) ,
    _SEX = dialog_VLGetRadiobutton(idc_male,_VALLIST), 
   %END Person,   Update controls
    true. 
   %MARK Person,   new events
      dlg_person_eh (_, _, _) : -!,
         fail.
    %END_DLG Person

    Вам следует знать, что:

    Итак, мы изменим сгенерированный предикат dlg_person_Create, чтобы он принимая специфические входные параметры для диалогового окна и возвращал специфические параметры вывода.

    Теперь изменим наш источник для того, чтобы поставлять входные значения диалоговому окну, получать измененные выходные значения и хранить новые значения. С этой целью объявим факт employee, который может хранить информацию о человеке. В этом случае мы не изменяем глобальный предикат dlg_person_Create, а создаем локальный предикат my_person_create, который обладает необходимой функциональностью с входными и выходными значениями для диалогового окна.

    И последнее: изменим предикат dlg_person_update так, чтобы возвращались измененные значения:

   domains
      person=person(string Name,dialog_int Age,boolean Married,
         ilist Skills,dialog_control_id Sex)
   facts-employes
      employee(person)
   clauses %  Initial value
      employee(person("",void,b_false,[],idc_male)). 
   predicates
      dlg_person_eh:EHANDLER
      dlg_person_update(dialog_val_list,ctlid,person)
      my_person_Create(window Parent,person In,person Out) 
   clauses
      dlg_person_Create(Parent):-retract(employe(Person)), !,
      my_person_Create(Parent,Person,NewPerson), assert(employe(NewPerson)).
      my_person_Create(Parent,person (Name,Age,Married,Skills,Sex),
                         NewPerson):-
   %MARK Person,   new variables
      dialog_Create(Parent,[resdlg(dlg_person_ResID,wd_Modal)],
         [
   %BEGIN Person, ControlList, 09:07:56-20.6.2006, Auto updated!
       df(idc_name,editstr(NAME,[]),nopr),
       df(idc_age,editint(AGE,[range (0,70)]),nopr),
       df(idc_married,checkbox(MARRIED),nopr),
       df(idc_skills,listbox(["prolog","с","с++","pascal",
           "database","word","excel","basic"],SKILLS),nopr),
       df(SEX,radiobuttongroup([idcjnale,idc_female]),nopr) 
   %END Person, ControlList 
       ],
       dlg_person_eh,0,_VALLIST,_ANSWER),
     dlg_person_update(_VALLIST,_ANSWER,NewPerson).
    dlg_person_update(_VALLIST,idc_ok,
            person(_Name,_Age,_Married,_Skills,_Sex)):-!,
   %BEGIN Person, Update controls, 09:07:56-20.6.2006, Auto updated!
       _NAME=dialog_VLGetstr(idc_name,_VALLIST),
       _AGE=dialog_VLGetint(idc_age,_VALLIST),
       _MARRIED=dialog_VLGetCheck(idc_married,_VALLIST),
       dialog_VLGetListBox(idc_skills,_VALLIST,_ITEMLIST,_SKILLS), 
       _SEX=dialog_VLGetRadiobutton(idc_male,_VALLIST), 
   %END Person, Update controls
      true. 
   %MARK Person, new events

    Несмотря на то, что мы изменяли параметры и структуру сгенерированного кода, сохраняя комментарии %BEGIN/%END вокруг автоматически модифицированного кода, мы можем продолжать модифицировать этот код, используя эксперт диалогового пакета.

    Текст этого проекта вместе с EXE-файлом можно взять здесь (750,8 Кб).

    Со следующего шага мы начнем рассматривать средства создания графического интерфейса.




Предыдущий шаг Содержание Следующий шаг