|
|
pl:prolog:prolog_lab:prolog_lab_xpce [2008/04/20 00:13] wojnicki |
pl:prolog:prolog_lab:prolog_lab_xpce [2019/06/27 15:50] |
====== Prolog, graficzny interfejs użytkownika XPCE ====== | |
| |
XPCE jest zorientowanym obiektowo podsystemem wizualizacji dla środowiska SWI-Prolog. | |
Pełna dokumentacja XPCE znajduje się pod adresem: http://hcs.science.uva.nl/projects/xpce/UserGuide/ | |
| |
===== Wprowadzenie ===== | |
| |
| |
==== Tworzenie obiektów ==== | |
| |
new/2 (new(?Reference, +NewTerm)) umożliwia tworzenie obiektów graficznych, pierwszy argument zwraca referencje do utworzonego obieku (unikalny identyfikator) z użyciem @/1, drugi argument jest rodzajem obiektu (klasą) do utworzenia. | |
| |
<code prolog> | |
?- new(P, point(10,20)). | |
P = @772024 | |
| |
?- new(@demo, dialog('Demo Window')). | |
</code> | |
| |
free/1 (free(+Reference)) niszczy obiekty, argumentem jest identyfikator obiektu (pierwszy argument new/2). | |
| |
<code prolog> | |
?- free(@demo). | |
</code> | |
| |
**Uwaga:** Wszystkie obiekty utworzone z wykorzysaniem //named reference// (@demo w powyższym przykładzie) muszą być usunięte za pomocą free/2 w celu uniknięcia wycieków pamięci. | |
| |
==== Modyfikacja stanu obiektów ==== | |
| |
Stan obiektu można zmodyfikować korzystając z predykatu: send/2. | |
Pierwszym argumentem jest referencja obiektu, drugim metoda do wykonania. | |
Poniższy przykład dodaje pole tekstowe do utworzonego wcześniej okna dialogowego. | |
| |
?- send(@demo, append(text_item(nazwa))). | |
| |
Aby wyświetlic tak utworzony obiekt należy użyc metody ''open'': | |
| |
?- send(@demo, open). | |
| |
send można również dekomponując term, zatem powyższy przykład można zapisać jako: | |
| |
?- send(@demo, append, text_item(nazwa)). | |
| |
zatem kolejne argumenty send licząc od 3-go będą argumentami metody append. | |
| |
XPCE definiuje kilka standardowych obiektów m.in. @display oraz @prolog. | |
@display reprezentuje ekran. | |
@prolog jest obiektem reprezentującym maszynę wnioskującą. | |
Dowolny predykat zdefiniowany w Prologu jest metodą, w nomenkleaturze XPCE. | |
Zatem za pomocą send można uruchomic np. write/1: | |
| |
?- send(@prolog, write('hello')). | |
| |
| |
| |
==== Odpytywanie obiektów ==== | |
| |
get/3 (get(+Receiver, +Selector(+Argument...), -Result)) umożliwia uzyskanie informacji o stanie obiektu. | |
Np. aby dowiedzieć się jaka jest szerokość obiektu: | |
| |
?- get(@demo,width,X) | |
| |
albo o wartości wpisanej do pola tekstowego (metoda ''member'' wyszuka wlaściwy obiekt, po nazwie, jaka była uzyta do jego utworzenia w tym przypadku ''nazwa''): | |
| |
?- get(@demo, member(nazwa), ObiektTekstowy), get(ObiektTekstowy, selection, ToCoUzytkownikWpisal). | |
| |
Biorąc pod uwagę poniższy program: | |
<code prolog> | |
:- new(@demo, dialog('Okno Testowe')), | |
new(@txt,text_item('to Jest tekst:')), | |
send(@demo,append(@txt)), | |
send(@demo,open). | |
</code> | |
| |
Zapytanie: | |
| |
?- get(@txt,selection,X). | |
| |
uzgodni z szukaną ''X'' wartość wprowadzoną przez użytkownika. | |
| |
Poniższe zapytanie uzgodni szerokość ekranu z szukaną X: | |
| |
?- get(@display,width,X). | |
| |
==== Akcje ==== | |
| |
Aby zaprogramować zdarzenie związane z akcją użytkownika nalezy skorzystać z //uśpionego// send. | |
| |
Poniższy kod utworzy okno o nazwie 'dialogowe' oraz przycisk 'nacisnij'. | |
Po nacisnięciu przycisku na standardowym wyjściu pojawi się napiś 'au! nie naciskaj'. | |
| |
<code prolog> | |
?- new(@okno,dialog(dialogowe)), | |
new(@but,button(nacisnij,message(@prolog,write,'au! nie naciskaj!\n'))), | |
send(@okno,append,@but), | |
send(@okno,open). | |
</code> | |
| |
albo w krótszej wersji: | |
| |
<code prolog> | |
?- new(@okno,dialog(dialogowe)), | |
send(@okno,append(button(nacisnij,message(@prolog,write,'au! nie naciskaj!\n')))), | |
send(@okno,open). | |
</code> | |
| |
=== Selektor === | |
| |
<code prolog> | |
wypisz(X):- | |
new(Okno,dialog(wpisales)), | |
send(Okno,append(text(X))), | |
send(Okno,open). | |
| |
ui:- | |
new(Okno,dialog(dialogowe)), | |
send(Okno,append(new(Txt,text_item(pole_tekstowe)))), | |
send(Okno,append(button(nacisnij,message(@prolog,wypisz,Txt?selection)))), | |
send(Okno,open). | |
| |
:- ui. | |
</code> | |
| |
W 9 lini występuje tzw. selektor. Pozwala on na wybranie określonej własności obiektu, która ma być przekazana. | |
W tym przypadku jest to wartość ''selection'' pola tekstowego (szukana ''Txt''), czyli tekst wpisany w pole przez użytkownika. | |