Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:prolog:prolog_lab:prolog_lab_xpce [2008/04/20 11:14]
wojnicki automatyne niszczenie obiektow
pl:prolog:prolog_lab:prolog_lab_xpce [2019/06/27 15:50]
Linia 1: Linia 1:
-====== 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. 
-Jeżeli referenca obiektu nie jest nazwana (pierwszy argument new jest szukaną), obiekty takie są automatycznie niszczone. 
- 
-==== 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. 
- 
-**Uwaga:** Wszystkie referencje do obiektów (rezultaty predykatu new/2) w powyższym przykładzie tworzone są automatycznie (nie są to //named references//​),​ nie trzeba stosować free/2, niszczeniem obiektów zajmie się garbage collector. 
- 
-==== Okna modalne ==== 
- 
-TBD  
- 
-==== Obiekty graficzne ==== 
- 
-TBD 
- 
-==== Obiekty połączone ==== 
- 
-TBD 
- 
-==== Mysz: interakcja z obiektami graficznymi ==== 
- 
-TBD 
- 
-<code prolog> 
-:- pce_global(@in_out_link,​ make_in_out_link). 
- 
-make_in_out_link(L) :- 
-        new(L, link(in, out, line(arrows := second))). 
- 
-linked_box_demo :- 
-        new(P, picture('​Linked Box demo'​)),​ 
-        send(P, open), 
-        send(P, display, new(B1, box(50,​50)),​ point(20,​20)),​ 
-        send(P, display, new(B2, box(25,​25)),​ point(100,​100)),​ 
-        send(B1, handle, handle(w, h/2, in)), 
-        send(B2, handle, handle(w/2, 0, out)), 
-        send_list([B1,​ B2], recogniser, new(move_gesture(left))),​ 
-        send(B1, connect, B2, @in_out_link). 
-</​code>​ 
-===== ĆWICZENIA ===== 
- 
- 
-==== Ćwiczenie 1: Okno dialogowe ==== 
- 
-Przetestuj poniższy program ((przykład zaczerpnięty z http://​hcs.science.uva.nl/​projects/​xpce/​UserGuide/​sec-4.1.html)):​ 
- 
-<code prolog> 
-:​-dynamic(employee/​2). 
- 
-ask_employee :- 
-        new(Dialog, dialog('​Define employee'​)),​ 
-        send_list(Dialog,​ append, ​ 
-                  [ new(N1, text_item(first_name)),​ 
-                    new(N2, text_item(family_name)),​ 
-                    new(S, ​ new(S, menu(sex))),​ 
-                    new(A, ​ int_item(age,​ low := 18, high := 65)), 
-                    new(D, ​ menu(department,​ cycle)), 
-                    button(cancel,​ message(Dialog,​ destroy)), 
-                    button(enter,​ and(message(@prolog,​ 
-                                              assert_employee,​ 
-                                              N1?​selection,​ 
-                                              N2?​selection,​ 
-                                              S?​selection,​ 
-                                              A?​selection,​ 
-                                              D?​selection),​ 
-                                      message(Dialog,​ destroy))) 
-                  ]), 
-        send_list(S,​ append, [male, female]), 
-        send_list(D,​ append, [research, development,​ marketing]),​ 
-        send(Dialog,​ default_button,​ enter), 
-        send(Dialog,​ open). 
- 
-assert_employee(FirstName,​ FamilyName, Sex, Age, Dept) :- 
-        assert(employee(FirstName,​ FamilyName, Sex, Age, Dept)). 
-</​code>​ 
- 
-==== Ćwiczenie 2: Okno dialogowe ==== 
- 
-Dopisz redykat ''​show_employees/​0''​ umożliwiający przeglądanie danych pochodzących z ''​employee/​5''​. 
- 
-==== Ćwiczenie 3: Okna modalne ==== 
- 
-TBD 
- 
-==== Ćwiczenie 4: Obiekty graficzne ==== 
- 
-TBD 
pl/prolog/prolog_lab/prolog_lab_xpce.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0