Ten dokument jest częścią biblioteki JEWL, prawa © John English 2000. To oprogramowanie zostało wydane zgodnie z założeniami GNU Powszechnej Licencji Publicznej, i może być kopiowane, rozpowszechniane i używana zgodnie z jej zasadami. Sugestie, komentarze, błędy i modyfikacje powinny być przesyłane do autora <je@brighton.ac.uk>.
1. Wstęp
1.1 Zaczynamy
1.2 Inny przykład
1.3 Przykład używający okienko dialogowe
2. Hierarchia typów okienkowych
2.1 Używane typy
2.1.1 Czcionki
2.1.2 Punkty
2.1.3 Kolory
2.1.4 Kąty
2.1.5 Wyrównania
2.1.6 Obrazki
2.2 Określanie rozmiarów okna i pozycji
2.3 Używanie klawiatury
2.4 Okna wiadomości i zwykłe dialogi
2.5 Odgrywanie dźwięków
3. Kontenery
3.1 Ramki
3.2 Dialogi
3.3 Panele
3.4 Menu
4. Kontrolki
4.1 Kontrolki tekstu
4.1.1 Przyciski
4.1.2 Etykiety
4.1.3 Pola edycyjne
4.2 Kontrolki Bool
4.2.1 Elementy menu
4.2.2 Pola zaznaczania
4.2.3 Przyciski radio
4.3 Kontrolki wielokrotnej linii tekstu
4.3.1 Lista tekstowa
4.3.2 Kombo
4.3.3 Pola memo
5. Kadry
5.1 Właściwości kadrów
5.2 Operacje rysowania
5.3 Modyfikacja rysunku
5.4 Obsługa czynności użytkownika
6. Zwykłe dialogi
6.1 Dialogi kolorów
6.2 Dialogi czcionek
6.3 Dialogi operacji plikowych
JEWL (John English's Window Library) jest zbiorem pakietów języka Ada przeznaczonych dla początkujących, które pozwalają na tworzenie względnie skomplikowanych pod względem graficznym aplikacji, przy minimalnym wysiłku. Pakiety zostały zaprojektowane, by być niezależnymi od systemu, jednak aktualnie jedyną implementacją jest ta dla systemu Microsoft Windows. Przykłady w tym dokumencie bazują na tej właśnie implementacji.
JEWL nie został przeznaczony jako narzędzie kompletnie powiązane z interfejsem API Windows (lub jakiegokolwiek innego); jest to umyślnie prosty system pozwalający początkującym programistom Ady pisać w niej programy w trybie graficznym GUI. Ukrywa wiele ze skomplikowania wkomponowanego w budowanie aplikacji w tym trybie, i jej użycie nie wymaga "zaawansowanego" poziomu programowania; jej intencją jest być dostępną dla programistów, którzy są zaznajomieni z programowaniem proceduralnym. Wewnętrznie, używa zadań, chronionych rekordów, typów etykietowych, i wielu innych aspektów, o których użytkownik nie musi wiedzieć. Zaadoptowany model to uproszczona pętla zdarzeń, która jest całkowicie proceduralna i w której uniknięto skomplikowania związanego z użyciem wezwań (problem wezwań dla dostępu do podprogramów), programowania obiektowego (obejście pierwowzorów bez przypadkowego definiowania nowych metod, które nigdy nie są wywoływane) lub podstawowych kontrolek (wymagających instalacji indywidualnych kontrolek).
JEWL dostarcza wiele standardowych kontrolek GUI m.in. menu, przyciski, etykiety tekstowe, pola zaznaczania, przyciski radio, pola edycji, listy tekstowe i komba. Daje także wachlarz kontenerów do których kontrolki mogą zostać przymocowane; na przykład, ramka jest kontenerem, który wygląda jak standardowe, położone najwyżej okno z paskiem tytułowym.
Niektóre kontrolki (e.g. przyciski i elementy menu) generują komendy (kody komend) kiedy są aktywowane, na które program może zareagować w odpowiedni sposób; inne(e.g. pola edycji) pozwalają użytkownikowi na interakcję ze sobą, lecz nie generują komend. Program może czekać na komendę z przycisku lub elementu menu i później odpowiedzieć na nią poprzez odczyt lub modyfikację jej wartości.
Głównym pakietem JEWL jest JEWL.Windows, który jest podstawowym pakietem, który musi zostać zainstancjonowany (sprecyzowany) z typem reprezentującym komendę zwracaną przez kontrolkę. By uniknąć potrzeby definiowania typu i instancjonowania pakietu, stworzono pakiet JEWL.Simple_Windows, który jest predefiniowaną instancją JEWL.Windows dla typu znakowego (to znaczy, kod komendy, który będzie zwracany przez kontrolkę będzie znakiem).
By używać JEWL, potrzebujesz dołączyć do pakietu pakiet JEWL.Windows z członem with:
with JEWL.Windows;
procedure My_Program is
...
end My_Program;
JEWL.Windows jest podstawowym pakietem, który musi być zainstancjonowany z listą kodów komend które przyciski i menu będą generować. Na przykład, jeśli potrzebujesz komendy która wyłącza program, zapisuje bądź odczytuje plik, mógłbyś zdefiniować następującą komendę:
type Command_Code is (Quit, Load, Save);
Teraz instancja wersji JEWL.Windows, która może wygenerować te trzy kody komend:
package My_Windows is new JEWL.Windows (Command_Code);
use My_Windows;
Następnie będziesz musiał zdefiniować główne okno dla swojego programu, jako ramkę:
My_Frame : Frame_Type := Frame (200, 150, "Main Window", Quit);
To tworzy zmienną o nazwie My_Frame typu Frame_Type i inicjalizuje ją by odnosiła się do ramki, która ma 200 pikseli szerokości i 150 wysokości, o tytule "Main Window" w pasku tytułowym. Kiedy zostanie zamknięte, wygeneruje komendę Quit. Będzie wyglądało taks:

Okno pojawi się na ekranie jak tylko zostanie utworzone, i zniknie, kiedy program się zakończy. Ciało programu będzie zawierało pętlę by zapobiec zakończeniu programu dopóki okno nie zostanie zamknięte:
while Valid(My_Frame) loop
...
end loop;
Wartość funkcji Valid(My_Frame) jest prawdą tak długo jak długo My_Frame odnosi się do istniejącego okna, innymi słowy dopóki okno nie zostanie zamknięte. Póki jest otwarte, okno może być przeciągane dookoła ekranu, minimalizowane, maksymalizowane, lub zmieniany może być jego rozmiar w ten sam sposób jak każdego innego okna. Kompletny program który wyświetli okienko takie jak to powyżej wygląda tak:
with JEWL.Windows;
procedure My_Program is
type Command_Code is (Quit, Load, Save);
package My_Windows is new JEWL.Windows (Command_Code);
use My_Windows;
My_Frame : Frame_Type := Frame (200, 150, "Main Window", Quit);
begin
while Valid(My_Frame) loop
null; -- nic nie rób, powtórz pętlę
end loop;
end My_Program;
Alternatywnie, może zostać użyta standardowa instancja JEWL.Simple_Windows, która używa znaków do kodów komend. Na przykład, mógłbyś użyć 'Q', 'L' i 'S' zamiast Quit, Load i Save. To oznacza, że nie musisz definiować typu Command_Code ani robić instancji JEWL.Windows:
with JEWL.Simple_Windows;
use JEWL.Simple_Windows;
procedure My_Program is
My_Frame : Frame_Type := Frame (200, 150, "Main Window", 'Q');
begin
while Valid(My_Frame) loop
null; -- nic nie rób, powtórz pętlę
end loop;
end My_Program;
Oczywiście, ten program marnuje dużo czasu powtarzając w kółko pętlę. Ostatni parametr funkcji Frame określa kod komendy, która zostanie wygenerowana, kiedy ramka zostanie zamknięta (w tym przypadku, 'Q'), i możesz sprawić by program zaczekał, póki nie zostanie wygenerowana komenda, używając funkcji Next_Command. Pętla może zostać zmodyfikowana w ten sposób:
loop
case Next_Command is
when 'Q' => ...
when others => null;
end case;
end loop;
Teraz program będzie oczekiwał na komendę do wygenerowania przy każdej pętli, a użycie instrukcji case, pozwala określić jaką instrukcję wykonać dla danej komendy. Pętla nie sprawdza dłużej czy okno istnieje, ponieważ kod komendy 'Q' zostanie wygenerowany, kiedy okno zostanie zamknięte. Można tego użyć do wyjścia z pętli:
when 'Q' =>
exit;
Możesz generować także komendy używając przycisków, elementów menu lub kadrów. W przypadku przycisku, naciśnięcie go powoduje komendę, zaś wybranie elementu menu generuje komendę. Kadry opisane są później. Możesz zdefiniować przycisk generujący kod komendy 'Q' w ten sposób:
Quit_Button : Button_Type :=
Button (My_Frame, (50,10), 80, 25, "Quit", 'Q');
Jest to definicja przycisku przyłączonego do ramki My_Frame w pozycji (50,10): to znaczy, 50 pikseli od lewego brzegu i 10 pikseli od górnego brzegu na tzw. obszarze klienta ramki (pod paskiem tytułowym). Będzie szeroki na 80 pikseli i wysoki na 25 pikseli podpisany słowem "Quit". Zauważ, że kod komendy 'Q' może teraz zostać wygenerowany poprzez naciśnięcie przycisku "Quit" lub zamknięcie okna. Kod komendy 'Q' może zostać zmodyfikowany, by upewnić się, że okno zamknięte zostanie w ten sposób:
when 'Q' =>
Close (My_Frame);
exit;
Procedura Close zamknie ramkę, jeśli wciąż jest ona otwarta (ale nie ma efektu jeśli już została zamknięta).
W tym przykładzie, chcemy mieć możliwość wygenerowania komend Load ('L') i Save ('S'). Prosta droga by tego dokonać to dodanie dwóch przycisków do ramki:
Load_Button : Button_Type :=
Button(My_Frame, (55,20), 80, 25, "Load", 'L');
Save_Button : Button_Type :=
Button(My_Frame, (55,60), 80, 25, "Save", 'S');
Pierwszy przycisk jest zawarty w ramce My_Frame na pozycji (55,20). Drugi jest dołączony na pozycji (55,60), 40 pikseli poniżej pierwszego. Oba przyciski mają rozmiar 80 pikseli szerokości i 25 pikseli wysokości. Jeden podpisany jest jako "Load" i generuje komendę Load, drugi jest podpisany "Save" i generuje komendę Save. Tak wygląda nasze okienko, kiedy dodamy przyciski:

Musisz dokończyć funkcję case poprzez dodanie odpowiednich akcji, jako odpowiedź na komendy Load i Save. Dla przetestowania, po prostu wystarczy wyświetlenie wiadomości:
when 'L' =>
Show_Message ("Load button pressed!");
when 'S' =>
Show_Message ("Save button pressed!");
Show_Message jest poręczną funkcją, która generuje okno informacyjne zawierające określoną wiadomość i przycisk "OK". Wygląda ono tak:

Pełny kod programu :
with JEWL.Simple_Windows;
use JEWL.Simple_Windows;
procedure My_Program is
My_Frame : Frame_Type := Frame (200, 150, "Main Window", 'Q');
Load_Button : Button_Type :=
Button(My_Frame, (55,20), 80, 25, "Load", 'L');
Save_Button : Button_Type :=
Button(My_Frame, (55,60), 80, 25, "Save", 'S');
begin
while Valid(My_Frame) loop
case Next_Command is
when 'Q' =>
exit;
when 'L' =>
Show_Message ("Load button pressed!");
when 'S' =>
Show_Message ("Save button pressed!");
when others =>
null;
end case;
end loop;
end My_Program;
Domyślnie, kompilator GNAT wygeneruje kod by utworzyć okno konsolowe, a okno aplikacji pojawi się ponad wszystkim. Jeśli nie potrzebujesz okna konsoli, dodaj parametr "-mwindows", kiedy budujesz program. Na przykład powyższy program może zostać skompilowany następującą komendą:
gnatmake my_program.adb -largs -mwindows
Ten dział opisuje nieco bardziej skomplikowany przykład: konwerter temperatury pomiędzy stopniami Celsjusza i Fahrenheit-a i na odwrót. Będzie wyglądał tak:

Składa się z ramki nazwanej "Converter", pola edycji, które aktualnie zawiera cyfrę 0, przycisku podpisanego, jako "Convert", oraz etykiety, która pokazuje rezultat konwersji (w tym przypadku"0C = 32F". Jest tam także menu nazwane "Direction", z dwoma elementami menu: "C to F" oraz "F to C".
Ramka ma 200 pikseli szerokości i 150 wysokości:
My_Frame : Frame_Type := Frame (200, 150, "Converter", 'Q');
Pole edycji znajduje się na pozycji (10,10), i ma 170 pikseli szerokości i 20 pikseli wysokości, z początkową wartością zero:
Value : Editbox_Type := Editbox(My_Frame, (10,10), 170, 20, "0");
Przysick znajduje się na pozycji (55,40) i ma 80 pikseli szerokości 25 pikseli wysokości:
Do_It : Button_Type :=
Button (My_Frame, (55,40), 80, 25, "Convert", 'X');
Etykieta znajsuje się w miejscu (0,75) i ma 20 pikseli wysokości. Możemy sprawić, by zajmowała całą szerokość macierzystego okna poprzez określenie jej szerokości jako zero. W ten sposób, jeśli okno macierzyste zmieni swój rozmiar, rozmiar etykiety także ulegnie zmianie. Określanie rozmiaru i pozycji elementu relatywnie do rozmiaru okna macierzystego opisane jest w dziale 2.2.
Etykieta jest początkowo pusta, ale chcemy żeby tekst wyświetlany w niej był wypośrodkowany i poziomy:
Result : Label_Type := Label (My_Frame, (0,75), 0, 20, "", Centre);
Menu tworzymy w ten sposób:
My_Menu : Menu_Type := Menu (My_Frame, "&Direction");
C_To_F : Menuitem_Type := Menuitem (My_Menu, "&C to F", 'C');
F_To_C : Menuitem_Type := Menuitem (My_Menu, "&F to C", 'F');
Menu jest zamknięte w ramkę, a dwa elementy menu są dołączone do menu. Każdy element menu określa kod komendy, która zostanie wygenerowana, jeśli element zostanie wybrany. Etykiety dla menu i elementów menu zawierają znak "&" , który nie jest wyświetlany, ale powoduje że następujący po nim znak (e.g. "D" w słownie "Direction") jest podkreślony podczas wyświetlania. Możesz wybrać menu myszką, albo naciskając przycisk ALT łącznie z podkreślonym znakiem (ALT-D w tym przypadku) by je wyświetlić. Kiedy menu jest widoczne, możesz wybrać jego element używając myszki albo naciskając ALT-C (for "C to F") lub ALT-F (for "F to C").
Jeśli nie podoba ci się ten styl wizualny, bardzo łatwo jest go zmienić, by odpowiadał twoim potrzebom, ale ważną rzeczą teraz jest by zdefiniować ciało programu w ten sposób, by czyniło coś pożytecznego. Jak poprzednio, będziemy potrzebować pętli, która się kończy, kiedy zamyka się okno:
loop
case Next_Command is
when 'Q' =>
exit;
when 'C' =>
-- and so on.
end case;
end loop;
Kilka dodatkowych zmiennych będzie potrzebne: zmienna typu Boolean by zarejestrować kierunek konwersji (C do F lub F do C), którą nazwę To_F, oraz pare zmiennych typu integer (które nazwę C i F z powodu braku lepszego pomysłu). Elementy menu muszą ustawiać wartość To_F:
when 'C' =>
To_F := True;
when 'F' =>
To_F := False;
Kiedy przycisk zostanie naciśnięty, potrzebujemy pobrać zawartość pola edycyjnego i przekonwertować jego zawartość z string na integer, a następnie przeprowadzić obliczenia:
when 'X' =>
if To_F then
C := Integer'Value(Get_Text(Value));
-- convert C to Fahrenheit
else
F := Integer'Value(Get_Text(Value));
-- convert F to Centigrade
end if;
Używamy funkcji Get_Text by pobrać zawartość pola edycyjnego. Get_Text może zostać użyta z dowolną kontrolką tekstową, włączając pola edycyjne oraz etykiety; możesz także ustawić tekst wyświetlany przez kontrolkę używając Set_Text. Konwersja do stopni Fahrenheit-a jest obliczana w ten sposób:
F := C * 9 / 5 + 32;
Konwersja do stopni Celsjusza odwrotnie:
C := (F - 32) * 5 / 9;
Ostatecznie, musimy użyć funkcji Set_Text by wyświetlić rezultat w etykiecie, która dla konwersji do Fahrenheit-ów wygląda w ten sposób:
Set_Text (Result, Integer'Image(C) & "C =" & Integer'Image(F) & "F");
Kompletny program wygląda tak::
with JEWL.Simple_Windows;
use JEWL.Simple_Windows;
procedure Converer is
My_Frame : Frame_Type := Frame (200, 150, "Converter", 'Q');
My_Menu : Menu_Type := Menu (My_Frame, "&Direction");
C_To_F : Menuitem_Type := Menuitem (My_Menu, "&C to F", 'C');
F_To_C : Menuitem_Type := Menuitem (My_Menu, "&F to C", 'F');
Value : Editbox_Type :=
Editbox (My_Frame, (10,10), 110, 20, "0");
Do_It : Button_Type :=
Button (My_Frame, (40,40), 80, 25, "Convert", 'X');
Result : Label_Type :=
Label (My_Frame, (10,75), 0, 20, "", Centre);
To_F : Boolean := True;
C, F : Integer;
begin
loop
case Next_Command is
when 'Q' =>
exit;
when 'C' =>
To_F := True;
when 'F' =>
To_F := False;
when 'X' =>
if To_F then
C := Integer'Value(Get_Text(Value));
F := C * 9 / 5 + 32;
Set_Text (Result, Integer'Image(C) & "C =" &
Integer'Image(F) & "F");
else
F := Integer'Value(Get_Text(Value));
C := (F - 32) * 5 / 9;
Set_Text (Result, Integer'Image(F) & "F =" &
Integer'Image(C) & "C");
end if;
end case;
end loop;
end Converter;
Oczywiście można to ulepszyć na wiele różnych sposobów; nie ma widocznego wskaźnika, która konwersja zostanie dokonana, kiedy naciśniemy przycisk, i nie ma obsługi błędu, jeśli nie wprowadzimy wartości typu całkowitego do pola edycyjnego. Takie ulepszenia pozostawiam, jako ćwiczenia dla czytającego... :-)
Ten dział podaje przykład, który jest rozszerzeniem innego podanego w jednym z wcześniejszych działów. Zamiast konwertować temperatury, konwertuje waluty używając kursu, który może zostać zmieniony w okienku pop-up. Naciśnięcie przycisku "Set Rate" aktywuje okienko dialogowe, które wygląda tak:

Okna dialogowe używane są do modalnych dialogów, w których użytkownik jest zmuszony by wprowadzić jakąś daną zanim możliwa będzie kontynuacja. Okno dialogowe jest z wyglądu podobne do zwykłego okna ramki, z wyjątkiem tego, że dialogi nie mogą zmieniać rozmiaru, być minimalizowane lub maksymalizowane i nie mogą mieć menu. Dialog dezaktywuje także wszystkie inne okna należące do tej samej aplikacji podczas , gdy jest widoczny, więc okno dialogowe nie może zostać zignorowane. Jedynym sposobem by zwolnić dialog i kontynuować, jest naciśnięcie przycisku w okienku dialogowym, albo anulowanie dialogu poprzez naciśnięcie przycisku zamknięcia "close" w prawym górnym rogu.
W naszym przypadku chcemy , by dialog o etykiecie "Conversion Rate" wygenerował kod komendy 'Q', jeśli zostanie zamknięty:
Convert : Dialog_Type :=
Dialog (200, 100, "Conversion Rate", 'Q');
Dołączone do tego są etykieta, pole edycji i dwa przyciski. Przycisk OK wygeneruje znak 'Y', a przycisk Anuluj wygeneruje znak 'Q' (tak samo jak gdyby dialog został zamknięty bezpośrednio):
C_Label : Label_Type :=
Label (Convert, (10,10), 40, 25, "Rate:", Right);
C_Edit : Editbox_Type :=
EditBox (Convert, (60,10), 100, 25, "1.00");
C_OK : Button_Type :=
Button (Convert, (10,45) , 80, 25, "OK", 'Y');
C_Cancel : Button_Type :=
Button (Convert, (100,45) , 80, 25, "Cancel", 'Q');
Przycisk "Set Rate" może zostać zdefiniowany w ten sposób:
Set_Rate : Button_Type :=
Button (My_Frame, (140,40), 80, 25, "Set Rate", 'R');
Kiedy przycisk jest naciśnięty, sprawiamy, że pojawia się dialog wywołując funkcję Execute(Convert), która zwróci kod dla przycisku, który został naciśnięty by zamknąć dialog. Jeśli rezultatem jest 'Y', chcemy by pobrana została wartość z pola edycyjnego i zapisana do wartości zwanej Rate:
when 'R' =>
if Execute(Convert) = 'Y' then
Rate := Float'Value(Get_Text(C_Edit));
end if;
Zauważ, że jeśli przycisk Set_Rate zostanie naciśnięty jeszcze raz, wartość która została wprowadzona do pola edycji wciąż tam będzie, chyba że na drodze wyjątku została zmodyfikowana przez program.
Cały program wygląda tak:
with JEWL.Simple_Windows;
use JEWL.Simple_Windows;
procedure Currency_Converter is
My_Frame : Frame_Type := Frame (400, 150, "Currency Converter", 'Q');
Value : Editbox_Type :=
Editbox (My_Frame, (10,10), 110, 20, "0");
Do_It : Button_Type :=
Button (My_Frame, (40,40), 80, 25, "Convert", 'X');
Set_Rate : Button_Type :=
Button (My_Frame, (140,40), 80, 25, "Set Rate", 'R');
Result : Label_Type :=
Label (My_Frame, (10,75), 0, 20, "", Centre);
Convert : Dialog_Type :=
Dialog (200, 100, "Conversion Rate", 'Q');
C_Label : Label_Type :=
Label (Convert, (10,10), 40, 25, "Rate:", Right);
C_Edit : Editbox_Type :=
EditBox (Convert, (60,10), 100, 25, "1.00");
C_OK : Button_Type :=
Button (Convert, (10,45) , 80, 25, "OK", 'Y');
C_Cancel : Button_Type :=
Button (Convert, (100,45) , 80, 25, "Cancel", 'Q');
Rate : Float := 1.00;
Val : Float := 0.00;
begin
loop
case Next_Command is
when 'Q' =>
exit;
when 'R' =>
if Execute(Convert) = 'Y' then
Rate := Float'Value(Get_Text(C_Edit));
end if;
when 'X' =>
Val := Float(Integer'Value(Get_Text(Value)));
Set_Text (Result, Integer'Image(Integer(Val*Rate)));
when others =>
null;
end case;
end loop;
end Currency_Converter;
Ponownie, usprawnienia pozostawiam czytającemu...
Ważna informacjaZ powodu sposobu w jaki dialogi są obecnie zaimplementowane, nie powinieneś deklarować obiektów Dialog_Type w bibliotecznym poziomie pakietu ponieważ uniemożliwi to programowi jego zakończenie. Powinieneś deklarować je tylko wewnątrz procedur lub ciał pakietów. Jeśli to konieczne, możesz zadeklarować funkcję w specyfikacji pakietu, która zwróci kopię dialogu zadeklarowanego wewnątrz ciała pakietu. |
Dostępne typy okien są zorganizowane hierarchicznie w następujący sposób:
Window_Type(typ_okna)
|
+--- Container_Type(typ_kontenera) (3)
| |
| +--- Frame_Type(typ_ramki) (3.1)
| |
| +--- Dialog_Type(typ_dialogu) (3.2)
| |
| +--- Panel_Type(typ_panelu) (3.3)
| |
| +--- Menu_Type(typ_menu) (3.4)
|
+--- Control_Type(typ_kontrolki)
|
+--- Text_Control_Type(typ_kontrolki_tekstowej)(4.1)
| |
| +--- Button_Type(typ_przycisku) (4.1.1)
| |
| +--- Label_Type(typ_etykiety) (4.1.2)
| |
| +--- Editbox_Type(typ_pola_edycyjnego) (4.1.3)
| |
| +--- Boolean_Control_Type(kontrolka_typu_bool) (4.2)
| |
| +--- Menuitem_Type(typ_elementu_menu) (4.2.1)
| |
| +--- Checkbox_Type(typ_pola_zaznaczenia) (4.2.2)
| |
| +--- Radiobutton_Type(typ_przycisku_radio) (4.2.3)
|
+--- Multiline_Type(typ_kontrolki_linii_wielokrotnej) (4.3)
| |
| +--- Listbox_Type(typ_lity_tekstowej) (4.3.1)
| |
| +--- Combobox_Type(typ_kombo) (4.3.2)
| |
| +--- Memo_Type(typ_memo) (4.3.3)
|
+--- Canvas_Type(typ_kadru) (5)
Każdy poziom w hierarchii definiuje wachlarz operacji, które mogą zostać użyte z każdym pochodnym typem od danego typu w hierarchii. Na przykład, przycisk (Button_Type) może być użyty z dowolną operacją która dotyczy Window_Type, Control_Type, Text_Control_Type lub obiektu Button_Type .
Operacje zdefiniowane dla Window_Type odnoszą się do każdego okna. Są one następujące:
Zauważ, że w opisach operacji jak te powyżej, nazwy parametrów są nazwami, które mogą zostać użyte w notacji nazwowo-parametrowej, kiedy wywoływane są funkcje:
Show (W, True); -- tworzy okno W widocznym
Show (Window => W, Visible => True); -- to samo
Show (W, Visible => True); -- znowu to samo
Set_Size (W, Width=>100); -- ustawia tylko szerokość W
Set_Size (W, Height=>100); -- ustawia tylko wysokość W
Także, nazwa każdej operacji w swoim opisie jest hyperlinkiem do jej deklaracji z wersji HTML odpowiedniej specyfikacji pakietu , więc możesz zobaczyć formalną specyfikację klikając na linku.
Pośrednie typy w hierarchii (Window_Type, Container_Type, Control_Type, Text_Control_Type, Boolean_Control_Type oraz Multiline_Type) są typami abstrakcyjnymi, które nie mogą być użyte bezpośrednio. Wszystkie inne typy dostarczają funkcje konstrukcyjne do tworzenia okien odpowiedniego typu; na przykład konstruktor Frame_Type jest funkcją nazwaną Frame, konstruktor Button_Type jest funkcją nazwaną Button, itd.
Podstawowe kategorie okien to :
Wszystkie opisane są dokładniej poniżej .
Dodatkowe używane typy są używane wewnątrz JEWL by reprezentować czcionki(Font_Type), punkty (Point_Type), kolory (Colour_Type) i kąty(Angle_Type). Ten dział opisuje te typy i operacje, które je obsługują.
Czcionka określa w jakim stylu wyświetlany jest tekst, i jej nazwa typu zdefiniowana została jako Font_Type. Następujący konstruktor musi zostać użyty by stworzyć czcionkę:
Istnieją dwie czcionki globalne:
Jeśli żadne czcionki nie zostały wyznaczone, najwyżej ułożone okna będą używały czcionki Default_Font a wszystkie inne tej samej co macierzyste okna.
Punkt opisuje współrzędne (x,y) wewnątrz okna. Układ współrzędnych jest mierzony począwszy od punktu (0,0) w lewym górnym rogu okna , z współrzędną x zmieniającą się w poziomie od punktu startowego i współrzędną y zmieniającą się w pionie, odległość mierzona jest w pikselach. Punkt jest obiektem typu Point_Type, który jest tylko rekordem z dwóch składowych zwanych X i Y. Najprostszą metodą skonstruowania obiektu typu Point_Type jest załączenie dwóch wartości całkowitych w nawiasach:
(50,20) -- punkt 50 pikseli w prawo i 20 w dół
(X => 50, Y => 20) -- to samo
Następujące operacje są możliwe dla punktów :
Kolor jest reprezentowany poprzez troje wartości od 0 do 255 (jak zdefiniowano w podtypie Colour_Range) reprezentując kolor w trybie RGB. Kolor jest obiektem typu Colour_Type, który jest tylko rekordem zawierającym trzy wartości zwane czerwony, zielony, niebieski (Red, Green oraz Blue). Wyznaczają one intensywność indywidualnych odcieni tworzących kolor. Istnieje kilka predefiniowanych stałych dla najczęściej używanych kolorów: Black, White, Red, Green, Blue, Gray, Yellow, Cyan oraz Magenta. Najprostszym sposobem by utworzyć kolor Colour_Type, jest zawarcie w nawiasie trzech wartości:
(255,255,0) -- żółty (pełna intensywność czerwieni i zieleni)
(Red => 255, Green => 255, Blue => 0) -- to samo
Dwie operacje dla kolorów to:
Dla Amerykanów nazwy zostały przemianowanymi Color_Type i Color_Range na Colour_Type i Colour_Range odpowiednio.
Kąty reprezentowane są przez wartości typu Angle_Type, który jest typem modularnym o wartościach od 0 do 359 odpowiadających kątowi w stopniach. Daje to maksymalny możliwy obrót o jeden stopień, który jest adekwatny do limitów większości monitorów. Jako typ modularny wartość będzie przeskakiwała z 359 z powrotem na 0. (a każda wartość wprowadzana do zmiennej typu Angle_Type musi być w odpowiednim zakresie), więc dodanie 270 stopni do 180 stopni jako rezultat zwróci 90 stopni, a nie 450.
There are four constants of type Angle_Type provided for the sake of convenience: North (0), South (180), East (90) and West (270).
Typ Alignment_Type jest czasem używany by ustalić poziome położenie tekstu w kontrolce. Dopuszczalne są trzy możliwe wartości: Left, Centre, oraz Right. We wszystkich przypadkach, w których można użyć wyrównania, jest ono opcjonalne. Domyślna wartość to Left.
Dla Amerykanów Center jest przemianowaną nazwą Centre.
TypImage_Type jest prywatnym typem, który może przechowywać obrazek załadowany z pliku, który może zostać wyświetlony na kadrze. Operacje dla obrazka to:
Oprócz ramek i dialogów, wszystkie inne okna zawarte są w innych oknach. Początek okna znajdujący się w lewym górnym rogu jest zawarty w innym oknie (oknie macierzystym) i jest wartością typu Point_Type. Określa to odległość od lewego górnego rogu okna macierzystego, jeśli współrzędne nie są ujemne. Ujemne współrzędne określają odległość od spodu lub prawej strony okna macierzystego; na przykład początek w punkcie (20,5) oznacza początek w punkcie ustalonym na 20 pikseli od prawej strony brzegu okna macierzystego i 5 pikseli w dół od górnego brzegu.
Wysokości szerokość może także być ustawiona relatywnie w stosunku do okna macierzystego. Dodatnie wartości są używane dla wartości bezwzględnych, podczas gdy zero albo wartości ujemne są relatywne w stosunku do okna macierzystego. Zero oznacza tę samą wysokość lub szerokość co okno macierzyste, zaś ujemna wartość n oznacza n pikseli mniej niż odpowiadający rozmiar okna macierzystego.
Współrzędne, które są relatywne do okna macierzystego są zmieniane, jeśli zmianie ulegnie rozmiar okna macierzystego.
Następujące funkcje określają wymiary ekranu:
Klawiatura może być używana zamiast (lub równie dobrze jak) myszy by posługiwać się kontrolkami. Kontrolki mogą zostać włączone poprzez kliknięcie na nie myszką, ale odpowiadające im skróty klawiszowe także mogą być używane.
W każdej chwili, któraś kontrolka będzie tą aktywną i będzie w widoczny sposób podświetlona. Spacja aktywuje aktualną kontrolkę, jeśli jest to przycisk albo pole zaznaczania. Klawisz TAB może być używany do przejścia do następnej kontrolki (gdzie porządek jest ustalony poprzez kolejność w jakiej kontrolki są tworzone w programie) zaś Shift-TAB może być użyte by wrócić do poprzedniej kontrolki. Klawisze strzałek mogą być użyte by ruszyć do następnego przycisku radio albo grupy przycisków radio, lub by poruszać się pomiędzy elementami menu.
W przypadku przycisków, pół zaznaczania, przycisków radio i elementów menu, tekst kontrolki może zawierać znak "&". Jego użycie zostało omówione wyżej.
Okno wiadomości jest dialogiem, który służy do informowania użytkownika o błędzie lub innej informacji, lub by zadać pytanie tak/nie. Oto trzy funkcje pokazujące takie okna:
|
|
|
|
|
|
JEWL pozwala także na dostęp do wyboru zwykłych - powszechnych dialogów, które są dostępne jakby je po prostu wziąć z półki. Są to:
Procedura do odgrywania dźwięków procedure Play_Sound pozwala użytkownikowi odtwarzać dźwięki wave (.WAV). Dźwięki są grane asynchronicznie (i.e. program nie czeka by dźwięk się zakończył przed kontynuowaniem pracy::
Jeśli plik zawiera nieprawidłowy format dźwięku, procedura nie wykonuje żadnej operacji.
Kontenery to okna, które mogą zawierać inne okna. Istnieją cztery typy kontenerów:
3.1
RamkiRamka (typ Frame_Type) jest najwyżej położonym oknem przeznaczonym do użycia jako okno główne aplikacji. Ramka jest kontenerem, do którego inne okna (kontrolki itp.) mogą być przymocowane. Podokna ramki są umieszczane w obszarze roboczym ramki zaś wszystkie pomiary są robione względem granic obszaru roboczego..
Operacje, które odnoszą się do ramek są następujące, jako dodatek do tych operacji, które odnoszą siędo wszystkich okien (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font oraz Set_Font):
3.2
DialogiDialog (typDialog_Type) jest najwyżej położonym oknem przeznaczonym do modalnych interakcji z użytkownikiem. Dialogi są niewidoczne, chyba że zostają wywołane. Wywołanie dialogu czyni okno dialogowe widocznym na środku ekranu i dezaktywuje wszystkie inne okna należące do tej samej aplikacji dopóki nie zostanie wygenerowana komenda, albo okno nie zostanie zamknięte.. Dialogami można poruszać, nie można zmieniać wielkości, minimalizować i maksymalizować.
Operacje odnoszące się do dialogów to, jako dodatkowe do tych operacji, które odnoszą się do wszystkich okien (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font oraz Set_Font):
3.3
PanelePanel (typ Panel_Type) jest kontenerem przeznaczonym do grupowania kontrolek razem. Panel nie jest najwyżej położonym oknem, dlatego musi być zawarty w innym kontenerze.
Jedyną operacją dostępną dla wszystkich paneli jest ich konstruktor, dodatkowo oczywiście do tych operacji, które odnoszą się do wszystkich okien (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font oraz Set_Font):
3.4
MenuMenu (typ Menu_Type) są kontenerami na elementy menu. Menu mogą być dołączone tylko do ramek albo innych menu. Menu, które jest dołączone do ramki pojawi się ponad obszarem roboczym, a podmenu pojawi się jako przyłączone do menu z widoczną strzałką obok, które wyświetli podmenu, jeśli wybrane. Czcionka używana do wyświetlania menu nie może być wybrana.
Jedyna funkcja odnosząca się do menu to jego konstruktor, jako dodatek do wszystkich operacji odnoszących się do wszystkich okien (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font oraz Set_Font):
Kontrolki są oknami, które pozwalają na interakcję użytkownika. Mogą być uważane za graficzną reprezentację wewnętrznych zmiennych, których wartość może być zmieniana przez program. W większości przypadków, użytkownik także ma możliwość ich modyfikowania. Niektóre kontrolki (przyciski, elementy menu i kadry), mogą także generować kody komend, które będą zwrócone jako rezultat funkcji Next_Command (opisane jest to w sekcji o ramkach, wyżej).
Kilka typów kontrolek, na które pozwala JEWL:
Dostępne operacje to, jako dodatek do operacji dotyczących wszystkich okien (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font oraz Set_Font):
Kontrolki tekstu zawierają pojedynczą linię tekstu, która może być sprawdzana i modyfikowana przez program. Dostępne są następujące typy kontrolek tekstu:
Kontrolki tekstu są obsługiwane przez następujące funkcje, jako dodatkowe do tych, które odnoszą się do wszystkich kontrolek(Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable oraz Enabled):
4.1.1
PrzyciskiPrzycisk (typ Button_Type) jest kontrolką, która generuje kod komendy, kiedy jest naciśnięta.
Jedyną możliwą operacją dla przycisków jest funkcja konstruująca, jako dodatek do funkcji, któe odnoszą siędo wszystkich kontrolek (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text oraz Set_Text):
4.1.2
EtykietyEtykieta (typ Label_Type) jest statyczną kontrolką, która nie jest interaktywna. Etykiety nie mogą być włączane lub wyłączane, każda taka próba będzie ignorowana.
Jedyna operacja dla etykiet to ich konstruktor, jako dodatkowa do operacji odnoszących się dla wszystkich kontrolek (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text oraz Set_Text):
4.1.3
Pola edycyjnePole edycyjne (typ Editbox_Type) jest kontrolką która pozwala wprowadzić pojedynczą linię tekstu. Jeśli tekst jest dłuższy niż długość pola, kursor automatycznie przesunie tekst podczas pisania.
Operacje dla pól edycyjnych to, jako dodatkowe do tych, które dostępne są dla wszystkich kontrolek (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text i Set_Text):
Kontrolki typu Bool są podklasą kontrolek tekstowych, które zawierają także ich stan, który może być sprawdzany i modyfikowany przez program. Dostępne są następujące kontrolki Bool:
Kontrolki typu Bool mają dwie dodatkowe funkcje, jako dodatkowe do tych (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text iSet_Text):
4.2.1
Elementy menu Element menu (typMenuitem_Type) jest kontrolką, która może być dołączona tylko do menu. Nie można zmieniać jego czcionki i będzie ona zawsze taka sama jak okna macierzystego, elementy menu mogą być zaznaczone lub odznaczone, znacznik pojawia się na lewo od etykiety.
Jedyne operacje dostępne dla etykiet to, jako dodatek do tych (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text, Set_Text, Get_State i Set_State):
4.2.2
Pola zaznaczania Pole zaznaczania (typ Checkbox_Type) jest kontrolką tekstową odnoszącą się do tekstu po prawej stronie kwadracika, który może być zaznaczany lub odznaczany.
Jedyna operacja dotycząca pola zaznaczania to, jako dodana do tych, odnoszących siędo kontrolek Bool (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text, Set_Text, Get_State i Set_State):
4.2.3
Przyciski radio Przycisk radio (typ Radiobutton_Type) jest kontrolką typu Bool, odnoszącą się do tekstu po prawej stronie od kółka, które może być zaznaczone lub odznaczane. Inaczej niż w przypadku pól zaznaczania, stan przycisku radio jest określony przez stan innych takich przycisków, należących do tej samej grupy. Grupa jest tworzona poprzez dodanie przycisków radio do tego samego kontenera. Muszą być dodane łącznie ponieważ dodanie innej kontrolki zakańcza grupę .
Wybranie przycisku radio ustawi go do stanu aktywnego, w tym samym czasie dezaktywując wszystkie inne przyciski radio z tego samego kontenera. Wybranie aktywnego przycisku radio nie ma żadnego efektu, jedynym sposobem by odznaczyć jest wybranie innego przycisku radio należącego do tej samej grupy (lub użycie funkcji Set_State).
Istnieje tylko konstruktor przycisków radio, jako dodatek do tych funkcji (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Length, Get_Text, Set_Text, Get_State i Set_State):
Kontrolka wielokrotnej linii tekstu jest podobna do tej dotyczącej pojedynczej linii, z tym, że może zawierać wiele linii tekstu, z których każda może być wybrana jako aktualna linia. Do linii można się odnosić używając numeru linii, gdzie 1 to pierwsza linia. Pierwsza linia to także linia o numerze 0. Ustawienie linii na nieistniejącą wzniesie wyjątek Constraint_Error.
Type kontrolek wielokrotnej linii tekstu :
Kontrolki wielokrotnej linii tekstu mają następujące operacje, jako dodatki do tych, które odnoszą się do wszystkich kontrolek (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable oraz Enabled):
Poszczególne typy kontrolek wielokrotnej linii interpretują te operacje na nieco inne sposoby. Opisano to niżej.
4.3.1
Lista tekstowa Lista tekstowa (typ Listbox_Type) jest listą linii tekstu, która wyświetla pionowy pasek przewijania jeśli ilość linii przekracza dostępny obszar. Możesz wybrać linię klikając na nią myszką lub wywołując funkcję Select_Line, w takim wypadku staje się ona aktualną linią i jest odpowiednio zaznaczona.
Istnieje tylko konstruktor linii tekstowej, jako dodatkowa funkcja do tych (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Count, Get_Line, Get_Length, Get_Text, Set_Text, Select_Line, Append_Line, Insert_Line, Delete_Line i Delete_All):
4.3.2
KomboKombo (typ Combobox_Type) jest kombinacją pola edycji i listy tekstowej. Lista tekstowa jest zwykle niewidoczna; może zostać wysunięta w dół, poprzez naciśnięcie klawisza po prawej stronie. Linia może zostać wybrana poprzez wysunięcie w dół listy i wybranie linii, lub wywołując funkcję Select_Line. Pole edycji zawsze zawiera tekst aktualnie wybranej linii i do jej zawartości można się odwołać używając 0 jako numeru linii. Jeśli tekst wprowadzony do pola edycji nie odpowiada żadnemu z tych, które znajdują się w liście tekstowej, jest traktowany jakby nie było aktualnej linii (Get_Line zwróci zero).
Istnieje tylko funkcja tworząca kombo, jako dodatkowa do tych (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Count, Get_Line, Get_Length, Get_Text, Set_Text, Select_Line, Append_Line, Insert_Line, Delete_Line i Delete_All):
4.3.3
Pola MemoPole memo (typ Memo_Type) jest typem przeznaczonym do edycji tekstów. Inaczej niż w przypadku pozostałych kontrolek wielokrotnej linii tekstu, kursor może zostać ustawiony obok pojedynczego znaku, a nie dla całej linii, można także zaznaczyć blok tekstu zawierający kilka linii (w takim przypadku aktualna pozycja jest ustalana dla początku zaznaczenia).
Linie w polu memo są obsługiwane trochę inaczej niż w pozostałych kontrolkach wielokrotnej linii. Kursor jest początkowo ustawiany na początku pola memo, które początkowo nie zawiera żadnych linii. Jak tylko tekst jest wprowadzany do tej linii, staje się o n pierwszą linią pola memo. Naciśnięcie klawisza Enter przechodzi do następnej linii, która jednak nie jest liczona dopóki nie zostanie wprowadzony żaden tekst. Jeśli ostatnia linia jest pozostawiona pusta, nie jest traktowana jako linia, tylko jako puste miejsce, odstęp przed następną linią. Wybór linii używając Select_Line przeniesie kursor na początek wybranej linii. Jeśli numer aktualnej linii jest zwracany jako 0, oznacza to, że kursor znajduje się na pustej linii na końcu pola memo.
Oto możliwe operacje dla pola memo, jako dodatkowe do tych (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font, Set_Font, Enable, Disable, Enabled, Get_Count, Get_Line, Get_Length, Get_Text, Set_Text, Select_Line, Append_Line, Insert_Line, Delete_Line i Delete_All):
5.
KadryKadr (typ Canvas_Type) jest powierzchnią służącą do rysowania, która opcjonalnie może wygenerować kod komendy, kiedy przycisk myszki jest naciśnięty w jej granicach lub kiedy naciśnięty zostanie klawisz. Możesz rysować linie, prostokąty, elipsy i koła, wieloboki oraz tekst zmieniając kolory, rozmiary i czcionki. Kadry są obsługiwane przez wszystkie funkcje dotyczące wszystkich okien (Show, Hide, Focus, Visible, Get_Origin, Get_Width, Get_Height, Set_Origin, Set_Size, Get_Font i Set_Font) oraz przez te opisane poniżej.
Istnieją trzy konstruktory by utworzyć kadr, który nie reaguje na żadne wydarzenia, tylko na wydarzenia myszki, lub na wydarzenia myszki i klawiatury:
Zauważ, że kod komendy dla przycisku myszki musi zawsze być określony dodatkowo jeśli chcemy by kadr reagował na naciśnięcie klawisza klawiatury.
Domyślnie tło kadru jest białe, ale możesz wybrać inny kolor w każdej chwili. Kadr posiada także kilka narzędzi, którymi możesz posługiwać się rysując na nim:
Możesz zmienić narzędzia w każdej chwili, używać różnych pędzli, czcionek i kolorów. Inaczej niż w innych okna, zmiana narzędzi nie zmienia tego co już wcześniej zostało narysowane. Zamknięte kształty używają pędzla i koloru wypełnienia, pędzel rysuje brzeg kształtu, a kolor wypełnienia jego wnętrze.
Operacje używane do zmiany narzędzi :
Dla Amerykanów istnieje wersja funkcji nazwana Set_Color jako przemianowanie Set_Colour.
Kadry dostarczają szeroki wachlarz dostępnych operacji rysowania. Te operacje to:
Zauważ, że kiedy tekst jest pisany używając funkcji Draw_Text, prostokąt wewnątrz którego jest on pisany nie znika, tekst jest wpisywany nad istniejącymi elementami na kadrze. Jeśli chcesz napisać coś na czystym tle, musisz narysować tam wcześniej pusty prostokąt.
Kiedy obiekt jest rysowany, zwykle staje się stałą częścią kadru. Jeśli chcesz modyfikować istniejący obrazek, musisz wymazać cały kadr i narysować wszystko jeszcze raz. Mniej drastyczną wersją jest zachowanie kadru w pewnym momencie i późniejsze go przywołanie, choć skasowanie wszystkiego co narysowało się od czasu zachowania.
Stosowne operacje są następujące:
Zauważ, że tylko jeden stan na raz może być zachowany; użycie Save po raz drugi skasuje poprzedni stan. Ale możesz go przywrócić używając funkcję Restore, by wrócić do poprzedniego stanu ile razy chcesz.. Zauważ także, że zachowany stan zostanie skasowany, jeśli wywołasz funkcję Erase.
Save i Restore mogą zostać użyte jeśli rysunek wymaga modyfikacji, jako przykład może posłużyć analogowy zegar. Analogowy zegar może zostać zaimplementowany poprzez narysowanie jego tarczy a następnie użycie funkcji Save, by zachować stan rysunku, a następnie narysowanie wskazówek. Wywołanie funkcji Restore przywróci rysunek do poprzedniego stanu, kiedy tarcza była czysta i umożliwi ponowne narysowanie wskazówek, tym razem w innej pozycji. Implementacja zegara wymaga tylko odwołań do funkcji Restore i przerysowywania wskazówek raz na minutę (lub sekundę, jeśli druga wskazówka jest używana).
Kadr może wygenerować komendę kiedy zostanie naciśnięty przycisk myszki wewnątrz jego granic. Może to zostać użyte do zaimplementowania interaktywnych programów rysujących. Istnieje szereg dostępnych operacji, by pozwolić programowi śledzić ruch myszki, kiedy przycisk jest naciśnięty:
Te funkcje mogą być użyte łącznie z funkcjami Save i Restore (zobacz wyżej) by śledzić mysz wizualnie, kiedy mysz jest naciśnięta. Na przykład, poprzez użycie funkcji Save by zachować stan rysunku kiedy mysz jest naciśnięta, zachowany stan może być przywracany kiedy mysz się poruszy i linia może być rysowana pomiędzy punktem początkowym i końcowym. Następnym razem, kiedy myszka się poruszy, zapisany stan zostanie przywrócony i nowa linia może zostać dorysowana:
when Mouse_Pressed =>
Save (Canvas);
while Mouse_Down (Canvas) loop
if Mouse_Moved (Canvas) then
Restore (Canvas);
Draw_Line (Canvas, Start_Point(Canvas), End_Point(Canvas));
end if;
end loop;
Restore (Canvas);
To daje efekt, w którym myszka jest śledzona przez linię łączącą aktualną pozycję z punktem początkowym, gdzie myszka została naciśnięta. Jeśli Restore jest wywołane na końcu pętli pokazanej powyżej, linia zniknie kiedy mysz zostanie naciśnięta, jeśli nie, linia pozostanie częścią obrazu. i następnym razem kiedy zostanie naciśnięta, zachowany zostanie nowy stan, wiec obraz nie będzie już mógł być cofnięty przez funkcję Restore.
Następująca funkcja może zostać użyta by sprawdzić czy klawisz został naciśnięty:
Dialogi opisane tutaj mogą zostać użyte jakby były "z półki", okna dialogowe dla powszechnych (zwykłych) interakcji działają prawie w taki sam sposób jak okna wiadomości, które są stworzone by wyświetlać proste wiadomości. Są one następujące:
Są ułożone w następującą hierarchię:
Common_Dialog_Type(powszechne_dialogi)
|
+--- Colour_Dialog_Type(dialog_kolorów) (6.1)
|
+--- Font_Dialog_Type(dialog_czcionek) (6.2)
|
+--- File_Dialog_Type(dialog_plików) (6.3)
|
+--- Open_Dialog_Type(otwarcie_pliku)
|
+--- Save_Dialog_Type(zamknięcie_pliku)
Dla wszystkich tych dialogów dostępna jest operacja:
Istnieją także operacje specyficzne dla każdego dialogu, by pobierać i ustawiać w nim wartości. Zwykle wartości początkowe będą ustalone zanim dialog jest uruchomiony, a program pozna nową wartość, kiedy funkcja Execute zwróci True. Dialogi zachowają także swoje wartości pomiędzy wywołaniami funkcji Execute, jeśli nie zostaną zresetowane.
Wszystkie te dialogi opisane są dokładniej poniżej .
Dialog kolorów (typ Colour_Dialog_Type) dostarcza paletę standardowych kolorów, z której możesz wybierać kolory, lub dodawać własne do palety. Wygląda on tak:

Operacje odnoszące się do dialogu kolorów są następujące, jako dodatkowe do operacji Execute opisanej wyżej:
Dla Amerykanów nazwy Color_Dialog_Type, Color_Dialog, Set_Color i Get_Color są przemianowaniami Colour_Dialog_Type, Colour_Dialog, Set_Colour i Get_Colour odpowiednio.
Dialog czcionek (typ Font_Dialog_Type) pozwala ci wybrać czcionkę o określonej nazwie, rozmiarze i stylu z listy dostępnych czcionek. Dialog ten wygląda tak:

Operacje dostępne dla czcionek są następujące, jako dodatkowe do operacji Execute opisanej wyżej:
Dialogi operacji plikowych pozwalają wybrać plik do otwarcia na zapis lub odczyt. Istnieją dwa dostępne dialogi:
Oba typy wyglądają tak :

To jest dialog Otwierania ; dialog zapisu wygląda dokładnie tak samo, tylko przycisk "Open" jest zastąpiony przyciskiem "Save". Są funkcjonalnie takie same, za wyjątkiem typów plików, które mogą być otwarte. W dialogu Otwierania, tylko istniejące pliki mogą być wybrane; w dialogu zapisu nowe nazwy mogą być wpisane bezpośrednio.
Operacje odnoszące się siędo dialogów są następujące, dodatkowo do operacji Execute opisanej wyżej:
JEWL.Windows User Manual © John English 2000,
przetłumaczył Piotr Śliwka 2004