Из Prolog установить значения в PCE легко, используя send / 3 или send / 4 . Поэтому одним из способов решения этой проблемы является использование предиката Prolog для вызова метода, который устанавливает значение для объекта PCE.
Объекты могут содержать другие объекты и иметь переменные класса и экземпляра в области видимости. Все, что нужно коду Пролога, это ссылка на объект: вызывая предикат со ссылкой на объект, предикат может вызывать соответствующий метод для передачи значения.
Вот некоторый код, который создает объект на основе диалогового класса. Кнопка в объекте при нажатии вызовет предикат (аналогичный тому, который описан в этом вопросе), который создаст значение на основе переданного значения, а затем установит это значение в переменной экземпляра диалоговое окно . Он также поместит значение в элемент управления text _ item .
Этот исходный код программы textfield.pl и может быть запущен с
swipl -s textfield.pl -g run
Текст по умолчанию:
![Demo Text](https://i.stack.imgur.com/NEydX.png)
Ввод пользователя
![ABC](https://i.stack.imgur.com/FAPWW.png)
Текст, обновляемый программой посредством сообщений, отправляемых в GUI из предиката, вызванного кнопкой:
![ABC surrounded by asterisks](https://i.stack.imgur.com/vDe0Z.png)
демо класс:
:- use_module(library(pce)).
:- pce_begin_class(demo, dialog).
/* Instance variables*
name, type, access, description */
variable(result, name*, get, "Result from Prolog Callback").
initialise(Demo) :->
"Create something that get/4 and send/3 can work with."::
send(Demo, send_super, initialise, 'Demo'),
send(Demo, append, new(InputText, text_item(input, 'Demo Text'))),
send(Demo, append,
button(execute_command,
and(message(@prolog,doIt, Demo,InputText?selection),
message(@prolog,printIt,Demo)))).
:- pce_end_class.
Код, вызываемый кнопкой:
%%% Create a new value based on the input string
%%% Write the new value back to the 'input' member of the
%%% 'demo' object. Also put the value int the 'result' slot.
doIt(Demo,Word) :-
concat_atom(['*** ' , Word, ' *** '] ,WordGotDid),
format("doIt: Setting result: ~w...~n", [WordGotDid]),
get(Demo,member,input,InputText),
send(InputText,selection,WordGotDid),
send(Demo,slot,result,WordGotDid).
%%% Read and display the 'result' slot.
printIt(Demo) :-
get(Demo,slot,result,Result),
write('\nResult: "'),
write(Result),
write('"\n').
Основная программа:
%%% Create an object that has fields that can be mutated.
run :- new(Demo,demo),
send(Demo,open).
После просмотра демонстраций и написания этого кода мое мнение может измениться, как только я закончу изучать XPCE: несмотря на то, что в Прологе можно программировать с помощью сообщений из XPCE, просматривая демонстрационный код, не так, как это сделано. Программирование выполняется на Прологе или на каком-либо другом языке, и в качестве клея используется Пролог, в то время как XPCE - это в основном пассивный графический интерфейс, вроде HTML-форм. Программа создает объекты XPCE, изменяет их состояние и считывает значения из них. XPCE обычно не пишет в программу, кроме небольших сообщений, связанных с графическим интерфейсом; но даже это обычно делается в методах объектов XPCE.