Podręcznik Użytkownika JEWL.Windows


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>.


Zawartość

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

ż


1. Wstęp

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).

1.1 Zaczynamy

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
 

1.2 Inny przykład

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... :-)


 

1.3 Przykład używający okienko dialogowe

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 informacja

Z 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.


2. Hierarchia typów okienkowych

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:

Show (Window, Visible)
Czyni określone okno widoczne(Visible = True) lub niewidoczne(Visible = False). Parametr Visible może zostać pominięty, w takim przypadku okno jest widoczne. Kiedy okno jest czynione widocznym, jest także aktywowane. Jest to prawdą nawet jeśli okno jest już widoczne, więc Show może zostać użyte do wybrania okna jako aktywnego.

Hide (Window)
Oznacza to samo co Show (Window, False).

Focus (Window)
Wybiera dane okno jako aktywne. Obsługa przerwań klawiatury dotyczyć będzie aktywnego okna.

Visible (Window)
Sprawdza czy okno jest widoczne. Funkcja zwraca wartość typu Bool.

Get_Origin (Window)
Zwraca pozycję lewego górnego rogu danego okna.

Get_Width (Window)
Zwraca szerokość danego okna.

Get_Height (Window)
Zwraca wysokość danego okna.

Set_Origin (Window, Origin)
Ustawia pozycję lewego górnego rogu określonego okna na określone współrzędne.

Set_Size (Window, Width, Height)
Ustawia szerokość i/lub wysokość danego okna. Parametry szerokości i wysokości są opcjonalne, więc wymiar nie ulegnie zmianie jeśli zostaną pominięte.

Get_Font (Window, Font)
Zwraca aktualnie ustawioną dla danego okna czcionkę, zwraca typ Font_Type. Czcionki są opisane póżniej.

Set_Font (Window)
Ustawia czcionkę użytą do wyświetlania tekstów w danym oknie na określoną czcionkę (wartość typu Font_Type).

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 .

2.1 UŻYWANE TYPY

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ą.

2.1.1 Czcionki

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ę:

Font (Name, Size, Bold, Italic)
Tworzy czcionkę o określonym kroju i rozmiarze. Inne parametry to pogrubienie (bold) i kursywa (italic)oba są opcjonalne i ustawione domyślnie na False.

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.

2.1.2 Punkty

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 :

Endpoint (From, Length, Angle)
Oblicz punkt końcowy linii rysowanej z punktu From o określonej długości, pod określonym kątem i zwrócenie wyniku jako Point_Type.
Inside (Point, From, To)
Sprawdza czy określony punkt znajduje się wewnątrz prostokąta zawartego między punktami From oraz To i zwraca wartość Boolean jako rezultat, gdzie From i To reprezentują parę ułożonych po przeciwnie przekątnej prostokąta punktów. Zwraca prawdęTrue jeśli punkt jest wewnątrz, w przeciwnym wypadku False.
P1 + P2
Dodaje punkty P1 i P2. Na przykład, (10,10) + (5,3) = (15,13).
P1 – P2
Odejmuje punkty P1 i P2. Na przykład, (10,10) – (5,3) = (5,7).

2.1.3 Kolory

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:

Light (Colour)
Zwraca jaśniejszą wersję koloru , e.g. Light(Blue).
Dark (Colour)
Zwraca ciemniejszą wersję koloru , e.g. Dark(Green).

Dla Amerykanów nazwy zostały przemianowanymi Color_Type i Color_Range na Colour_Type i Colour_Range odpowiednio.

2.1.4 Kąty

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).

2.1.5 Wyrównania

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.

2.1.6 Obrazki

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:

Image (Name)
Zwraca obiekt obrazka zawierający bitmapę załadowaną z pliku o określonej nazwie.
Valid (Image)
Sprawdza czy dany obiekt obrazka zawiera właściwą bitmapę.
Width (Image)
Zwraca szerokość obrazka .
Height (Image)
Zwraca wysokość obrazka .

2.2 Określanie rozmiarów okna i pozycji

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:

Screen_Width
Funkcja zwraca szerokość ekranu .
Screen_Height
Funkcja zwraca wysokość ekranu .
 

2.3 Używanie klawiatury

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.

2.4 Okna wiadomości i zwykłe dialogi

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:

Show_Message (Text, Title)
Pokazuje okienko informacyjne z przyciskiem "OK" i ikonką informacji. Text jest tekstem wiadomości, która pojawia się wewnątrz okienka, zaś Title jest tytułem, który pojawia się w pasku tytułowym. Tytuł może zostać pominięty, w takim wypadku będzie on brzmiał "Message".
Show_Error (Text, Title)
Pokazuje wiadomość o błędzie z przyciskiem "OK" i ikonką błędu. Text jest tekstem wiadomości, która pojawia się wewnątrz okienka, zaś Title jest tytułem, który pojawia się w pasku tytułowym. Tytuł może zostać pominięty, w takim wypadku będzie on brzmiał "Error".
Show_Query (Text, Title)
Pokazuje zapytanie z przyciskami "Yes" (Tak) oraz "No" (Nie) i ikoną zapytania. Text jest tekstem wiadomości, która pojawia się wewnątrz okienka, zaś Title jest tytułem, który pojawia się w pasku tytułowym. Tytuł może zostać pominięty, w takim wypadku będzie on brzmiał "Query". Ta funkcja zwraca wartość Bool, True jeśli naciśnięty zostanie przycisk "Yes", False jeśli "No".

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:

2.5 Odgrywanie dźwięków

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::

Play_Sound (Sound)
Odtwarza dźwięk zawarty w pliku, którego nazwa jest podana jako String w parametrze Sound.

Jeśli plik zawiera nieprawidłowy format dźwięku, procedura nie wykonuje żadnej operacji.


3. Kontenery

Kontenery to okna, które mogą zawierać inne okna. Istnieją cztery typy kontenerów:

3.1 Ramki

Ramka (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):

Frame (Height, Width, Title, Command, Font)
Konstruuje ramkę o określonej wysokości i szerokości. Tytuł wyświetlany jest na pasku tytułowym i ramka generuje kod komendy kiedy jest zamykana. Wysokości szerokość to pełna wysokość i szerokość ramki, nie tylko obszar roboczy. Czcionka jest parametrem opcjonalnym, i jeśli zostanie pominięty, zostanie użyta czcionka globalna (Default_Font). Pozycja ramki na ekranie zostanie wybrana przez system.
Frame (Origin, Height, Width, Title, Command, Font)
Jak wyżej, za wyjątkiem tego, że lewy górny róg okna zostanie wyświetlony w pozycji wyznaczonej przez Origin.
Frame_Width
Funkcja, która zwraca całkowitą grubość brzegów ramki(i.e. różnica pomiędzy szerokością ramki a szerokością obszaru roboczego, który ramka zawiera).
Frame_Height
Funkcja, która zwraca całkowitą wysokość brzegów ramki(i.e. różnica pomiędzy szerokością ramki a szerokością obszaru roboczego, który ramka zawiera).
Valid (Frame)
Funkcja, która zwraca True jeśli ramka została utworzona, ale nie została zamknięta, w przeciwnym wypadku False.
Close (Frame)
Zamyka określoną ramkę. Ramka zniknie, funkcja Valid zwróci False. Procedura nie ma efektu jeśli okno zostało już wcześniej zamknięte.
Next_Command
Ta funkcja oczekuje dopóki następny kod komendy nie zostanie przesłany przez ramkę albo kontrolkę wewnątrz ramki. Jej rezultatem jest kod komendy zwróconej.
Command_Ready
Ta funkcja zwraca True jeśli komenda jest gotowa do bycia przetworzoną.

3.2 Dialogi

Dialog (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):

Dialog (Height, Width, Title, Command, Font)
Konstruuje ramkę o określonej wysokości i szerokości. Tytuł jest wyświetlany w pasku tytułowym, ramka generuje określoną komendę kiedy jest zamykana. Wysokości szerokość odnosi się do całej ramki, nie do obszaru roboczego. Czcionka jest parametrem opcjonalnym, domyślna zostanie użyta jeśli parametr zostanie pominięty.
Dialog_Width
Funkcja, która zwraca całkowitą grubość brzegów ramki(i.e. różnica pomiędzy szerokością ramki a szerokością obszaru roboczego, który ramka zawiera).
Dialog_Height
Funkcja, która zwraca całkowitą wysokość brzegów ramki(i.e. różnica pomiędzy szerokością ramki a szerokością obszaru roboczego, który ramka zawiera).
Execute (Dialog)
Funkcja, która czyni dialog widocznym na środku ekranu i dezaktywuje wszystkie inne okna należące do tej samej aplikacji. Kiedy komenda jest generowana poprzez zamykanie dialogu, lub użycie kontrolki z tego dialogu, dialog jest chowany a funkcja zwraca ten kod.

3.3 Panele

Panel (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):

Panel (Parent, Origin, Width, Height, Title, Font)
Konstruuje panel zawarty w określonym kontenerze macierzystym. Pozostałe parametry opisane jak wyżej.

3.4 Menu

Menu (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):

Menu (Parent, Text)
Konstruuje menu dołączone do ustalonego rodzica, który musi być ramką albo innym menu. Tekst jest nazwą menu wyświetlaną pod paskiem tytułowym, albo jako etykieta podmenu. Może zawierać znak "&", który działa jak opisano wcześniej.
Menu_Height
Zwraca wysokość pojedynczej linii elementu menu .


4. Kontrolki

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):

Enable (Control, Enabled)
Uaktywnia określoną kontrolkę, jeśli wartość Enabled wynosi True, lub dezaktywuje jeśli wartość wynosi False. Parametr Enabled może zostać pominięty, w takim przypadku kontrolka jest aktywna. Nieaktywne kontrolki nie reagują na akcje użytkownika i wyglądają na "poszarzałe". Domyślnie wszystkie kontrolki są aktywne.
Disable (Control)
Oznaca to samo co Enable (Control, False).
Enabled (Control)
Sprawdza czy kontrolka jest aktywna. Zwraca wartość Bool.

4.1 Kontrolki tekstu

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):

Get_Length (Control)
Funkcja zwraca długość tekstu przypisanego do kontrolki.
Get_Text (Control)
Funkcja zwraca tekst przypisany do kontrolki, jako string. Można zdefiniować długość łańcucha wywołując funkcję Get_Length, jak to opisano powyżej.
Get_Text (Control, Text, Length)
Procedura, która zwraca tekst kontrolki do zmiennej Text o ustalonej długości. Ilość znaków kopiowanych jest określana w zmiennej Length. Jeśli tekst jest krótszy niż zmienna łańcuchowa, tekst jest kopiowany do jej początku, zaś reszta pozostaje nietknięta. Jeśli tekst jest dłuższy niż zmienna łańcuchowa, skopiowane zostanie tylko tyle ile może się zmieścić.
Set_Text (Control, Text)
Ustawia łańcuch znaków w kontrolce.

4.1.1 Przyciski

Przycisk (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):

Button (Parent, Origin, Width, Height, Text, Command, Default, Font)
Konstruuje przycisk określony przez macierzysty kontener, podpisany określonym tekstem, w którym można użyć znaku "&", który działa w sposób jaki opisano wcześniej. Default jest opcjonalne; domyślnie jest to False, ale jeli ustawione zostanie True, zostanie utworzony przycisk z grubszą ramką, który może zostać aktywowany poprzez naciśnięcie klawisza Enter. Czcionka także jest parametrem opcjonalnym.

4.1.2 Etykiety

Etykieta (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):

Label (Parent, Origin, Width, Height, Text, Align, Font)
Konstruuje etykietę, określoną przez kontener macierzysty, pokazującą określony tekst. Początek etykiety określany jest jak to opisano wyżej. Parametr Align jest opcjonalny, określa wyrównanie tekstu, możliwości to Left, Centre i Right; domyślnie jest to Left. Czcionka także jest opcjonalna.

4.1.3 Pola edycyjne

Pole 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):

Editbox (Parent, Origin, Width, Height, Text, Password, Font)
Konstruuje pole edycyjne określone przez macierzysty kontener. Początek jest relatywny do okna macierzystego.Text to domyślny napis pojawiający się w kontrolce, jeśli go pominiemy, pole będzie puste. Password jest opcjonalnym parametrem typu Bool, domyślnie jest to False; jeśli ustawione na True, wpisywane litery będą pojawiały sięjako gwiazdki.
Modified (Editbox)
Funkcja, która zwraca wartość True, jeśli użytkownik zmodyfikował pole.

4.2 Kontrolki Bool

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):

Get_State (Control)
Pobiera stan Bool kontrolki (True jeśli zaznaczony, False jeśli odznaczony).
Set_State (Control, State)
Ustawia kontrolkę do określonego stanu (zaznaczony lub odznaczony, zależnie czy State jest True czy False).

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):

Menuitem (Parent, Text, Command)
Konstruuje element menu przyłączony do określonego macierzystego menu. Parametr Text jest tekstem, który będzie wyświetlony jako jego etykieta, a Command jest komendą zwracaną kiedy element jest wybrany. Tekst może zawierać znak "&".
Separator (Parent)
Konstruuje separator dołączony do określonego menu. Jest to pozioma kreska, która dzieli menu na sekcje. Separatory są traktowane jak elementy menu, ale nie mogą być wybierane ani generować kodów komend.

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):

Checkbox (Parent, Origin, Width, Height, Text, Checked, Font)
Konstruuje pole zaznaczania zawarte w kontenerze macierzystym, podpisane tekstem. Parametr Text może zawierać znak "&". Parametr Checked jest opcjonalny, oznacza stan początkowy pola zaznaczania, domyślnie jest to False. Czcionka jest opcjonalna.

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):

Radiobutton (Parent, Origin, Width, Height, Text, Checked, Font)
Konstruuje przycisk radio zawarty w macierzystym kontenerze podpisanym odpowiednim tekstem. Parametr Text może zawierać znak "&". Parametr Checked jest opcjonalny, oznacza stan początkowy przycisku radio, domyślnie jest to False. Czcionka jest opcjonalna.

4.3 Kontrolki wielokrotnej linii tekstu

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):

Get_Count (Control)
Zwraca ilość linii tekstu w kontrolce.
Get_Line (Control)
Zwraca numer aktualnie wybranej linii (lub zero jeśli żadna nie została wybrana).
Get_Length (Control, Line)
Zwraca długość tekstu określonej linii . Numer linii może zostać pominięty, w takim wypadku zwróci długość aktualnej linii.
Get_Text (Control, Line)
Zwraca tekst określonej linii jako string. Jeśli pominiemy numer, zwróci tekst aktualnej linii. Możesz zdefiniować długość stringu wywołując funkcję Get_Length, jak opisano powyżej.
Get_Text (Control, Line, Text, Length)
Procedura, która pobiera tekst określonej linii do zmiennej Text. Ilość kopiowanych znaków definiuje zmienna Length. Jeśli tekst jest krótszy niż zmienna łańcuchowa, tekst jest kopiowany od początku, a reszta pozostaje nienaruszona. Jeśli tekst jest dłuższy, skopiowana zostanie tylko mieszcząca się ilość.
Set_Text (Control, Text, Line)
Ustawia tekst określonej linii na określoną wartość, zastępując istniejący tekst, przy pominięciu numeru linii dotyczy aktualnej linii.
Select_Line (Control, Line)
Ustawia określoną linię jako aktualną. Jeśli określona linia to zero, żadna linia nie zostanie wybrana. Wybrana linia jest wskazywana wizualnie, różnie dla różnych kontrolek.
Append_Line (Control, Text)
Dopsiz linię zawierającą tekst na końcu kontrolki.
Insert_Line (Control, Text, Line)
Wstawia nową linię o danym tekście ponad określoną linią. Przy ominięciu parametru numeru linii, odnosi się do aktualnej linii. Jeśli nie ma aktualnej linii, zostanie dopisane na końcu kontrolki.
Delete_Line (Control, Line)
Usuwa określoną linię. Numer linii może zostać pominięty, w takim wypadku usunięta zostanie aktualna linia.
Delete_All (Control)
Usuwa wszystkie linie z kontrolki.

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):

Listbox (Parent, Origin, Width, Height, Font)
Tworzy listę tekstową zawartą w macierzystym kontenerze, w miejscu o zadanych współrzędnych, o określonej długości i szerokści. Parametr czcionki może zostać pominięty.

4.3.2 Kombo

Kombo (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):

Combobox (Parent, Origin, Width, Editable, Font)
Konstruuje kombo zawarte w określonym macierzystym kontenerze. Inaczej niż w przypadku innych kontrolek, wysokość jest ustawiana automatycznie i nie może być ustawiona. jeśli parametr Editable ma wartość True, zawartość polal edycji może być edytowana bezpośrednio, jeśli jest to False, użytkownik może wybrać tylko element z listy. Parametr Editable i czcionka są opcjonalne.

4.3.3 Pola Memo

Pole 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):

Memo (Parent, Origin, Width, Height, Font)
Tworzy pole memo wewnątrz kontenera o współrzędnych lewo/góra relatywnie do macierzystego kontenera, określonej szerokości i wysokości, używający określonej czcionki (tej co rodzic).
Show_Selection (Memo)
Skroluje pole memo, jeśli to konieczne, tak by aktualna pozycja była widoczna na ekranie.
Get_Column (Memo)
Pobiera numer kolumny aktualnego wyboru, gdzie początkiem jest kolumna o numerze 1.
Cut_Selection (Memo)
Wycina aktualnie wybrany tekst z pola memo do schowka.
Copy_Selection (Memo)
Kopiuje aktualnie wybrany tekst z pola memo do schowka..
Paste_Selection (Memo)
Wkleja zawartość schowka do pola memo, zastępując aktualnie wybrany tekst. Jeśli żaden tekst nie został wybrany, zawartośćschowka zostanie dołączona do aktualnej pozycji.
Undo_Change (Memo)
Cofa ostatnią akcję użytkownika w polu memo. Zauważ, że ostatnia akcja użytkownika liczy się jako zmian tekstu, wieć możesz cofnąć cofnięcie.
Modified (Memo)
Funkcja, która zwraca wartosć True, jeśli użytkownik zmodyfikował pole memo od ostatniego czasu, kiedy funkcja została wywołana.


5. Kadry

Kadr (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:

Canvas (Parent, Origin, Width, Height, Font)
Konstruuje kadr zawarty w macierzystym kontenerze podpisany określonym tekstem. Początek jest relatywny do okna macierzystego. Szerokość i wysokość są relatywne do szerokości i wysokości rodzica. Kliknięcia myszki i klawisze klawiatury będą ignorowane. Czcionka jest parametrem opcjonalnym.
Canvas (Parent, Origin, Width, Height, Command, Font)
Tworzy kadr jak powyżej. Dodatkowy parametr Command odnosi się do komendy generowanej kiedy naciśnięty zostaje przycisk myszki. Czcionka jest parametrem opcjonalnym.
Canvas (Parent, Origin, Width, Height, Command, Keypress, Font)
Tworzy kadr jak powyżej. Dodatkowy parametr Keypress jest opcjonalny, odnosi się do kodu komendy, która zostanie wygenerowana, jeśli klawisz klawiatury zostanie naciśnięty. Czcionka jest parametrem opcjonalnym.

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.

5.1 Właściwości kadrów

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 :

Set_Colour (Canvas, Colour)
Ustawia kolor kadru na określony w parametrze. Dotyczy całego tła kadru. Kolor jest opcjonalny, niezdefiniowany daje biały.
Set_Pen (Canvas, Colour, Width)
Ustawia pędzel do rysowania linii na określony kolor i szerokość. Szerokość zero rysuje niewidzialnym pędzlem. Zmiana pióra dotyczy tylko linii narysowanych później. Kolor i szerokość są opcjonalne, jeśli pominięte, dają czarny i szerokość 1 piksel.
Set_Fill (Canvas, Colour)
Ustawia kolor wypełnienia kształtów na określony w parametrze. Dotyczy tylko kształtów narysowanych po zmianie koloru; już istniejące pozostają nienaruszone. jeśli kolor zostanie pominięty, wnętrza kształtów nie będą wypełniane.
Set_Font (Canvas, Font)
Ustawia czcionkę używaną do pisania tekstu ma kadrze. Dotyczy tylko tekstów, które będą napisane po zmianie czcionki.

Dla Amerykanów istnieje wersja funkcji nazwana Set_Color jako przemianowanie Set_Colour.

5.2 Operacje rysowania

Kadry dostarczają szeroki wachlarz dostępnych operacji rysowania. Te operacje to:

Draw_Line (Canvas, From, To)
Rysuje linię używając aktualnego pędzla pomiędzy punktami From i To.
Draw_Line (Canvas, From, Length, Angle)
Rysuje linię używając aktualnego pędzla pomiędzy punktami From i To o określonej długości i pod określonym kątem.
Draw_Line_List (Canvas, Points)
Rysuje ciąg linii połączonych określonymi punktami. Points jest tablicą punktów, e.g. ((0,0), (5,5), (10,0), (10,10), (0,10)). Cała sekwencja jest traktowana jako nieprzerywalna operacja.
Draw_Rectangle (Canvas, From, To, Rounding)
Rysuje prostokąt o diagonalnie przeciwnych rogach w punktach From i To. Rounding jest opcjonalnym parametrem, który określa wielkość zaokrąglenia na rogach (domyślnie brak zaokrąglenia) i określa gdzie zaczyna sięzaokrąglenie. Obszar jest rysowany używając aktualnego pędzla, a prostokąt jest wypełniany kolorem wypełnienia.
Draw_Rectangle (Canvas, From, Width, Height, Rounding)
To samo co wyżej, z tym, że prostokąt jest rysowany z punktu From na określoną wysokość i szerokość.
Draw_Ellipse (Canvas, From, To)
Rysuje elipsę zawartą w diagonalnie przeciwnych rogach prostokąta określonego przez punkty From i To. Obszar jest rysowany używając aktualnego pędzla, a elipsa jest wypełniana kolorem wypełnienia.
Draw_Ellipse (Canvas, From, Width, Height)
To samo co wyżej, z tym, że elipsa jest rysowana z punktu From na określoną wysokość i szerokość. Obszar jest rysowany używając aktualnego pędzla, a elipsa jest wypełniana kolorem wypełnienia.
Draw_Circle (Canvas, Centre, Radius)
Rysuje koło o określonym promieniu, którego środek jest w wyznaczonym punkcie. Obszar jest rysowany używając aktualnego pędzla, a koło jest wypełniane kolorem wypełnienia.
Draw_Polygon (Canvas, Points)
Rysuje wielokąt z wierzchołkami w wyznaczonych punktach. Punkty są ustawione jak w Draw_Line_List (zobacz wyżej), ale ostatni musi być połączony z pierwszym, by zamknąć kształt. Obszar jest rysowany używając aktualnego pędzla, a wielokąt jest wypełniany kolorem wypełnienia.
Draw_Image (Canvas, From, Image)
Rysuje określony obrazek od punktu From jako lewego górnego rogu.
Draw_Image (Canvas, From, To, Image)
Rysuje określony obrazek, rozszerzając go jeśli to konieczne, by pasował do prostokąta, który znajduje się we współrzędnych From i To.
Draw_Image (Canvas, From, Width, Height, Image)
Rysuje określony obrazek zaczynając od punktu From jako lewego górnego rogu, rozszerzając go jeśli to konieczne, by pasował do prostokąta, który znajduje się we współrzędnych From i To.
Draw_Text (Canvas, From, Text)
Pisze tekst zaczynając od punktu From jako lewego górnego rogu.
Draw_Text (Canvas, From, To, Text, Align)
Pisze określony tekst w prostokątnym obszarze między punktami From i To używając aktualnej czcionki. Parametr Align jest opcjonalny, pozwala wyrównać tekst, parametry to Left, Centre lub Right , domyślnie jest to lewo.
Draw_Text (Canvas, From, Width, Height, Text, Align)
To co wyżej, z tym, że ograniczający prostokąt jest rysowany z punktu zaczynającego się w punkcie From o określonej szerokości i wysokości.

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.

5.3 Modyfikacja rysunku

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:

Erase (Canvas)
Wymazuje cały kadr.
Save (Canvas)
Zachowuje obecny stan kadru.
Restore (Canvas)
Przywraca stan kadru do momentu, w którym został on zachowany, wymazuje przez to wszystko co mogło być narysowane później.

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).

5.4 Obsługa czynności użytkownika

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:

Start_Point (Canvas)
Funkcja zwracająca współrzędne punktu w kadrze, gdzie myszka została naciśnięta.
End_Point (Canvas)
Fuinkcja zwracająca aktualną pozycję myszki kiedy przycisk jest naciśnięty. Kiedy zostanie puszczony, zwraca ostateczną pozycję myszki (współrzędne punktu). Kiedy przycisk myszki jest naciśnięty, pozycja myszki jest śledzona nawet jeśli opuści ona kadr.
Mouse_Down (Canvas)
Funkcja zwracająca wartość True kiedy przycisk myszki jest wciąż naciśnięty.
Mouse_Moved (Canvas)
Funkcja zwracająca wartość True, jeli myszka poruszyła się odkąd ostatni raz została wywołana funkcja End_Point by określić pozycję myszki.

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:

Key_Code (Canvas)
Funkcja zwraca znak, który został naciśnięty. Jeśli zostanie wywołana drugi raz, zanim następny klawisz zostanie naciśnięty, lub jeśli kadr nie może obsługiwać klawiatury, funkcja zwróci znak null (ASCII.NUL).


6. Zwykłe dialogi

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:

Execute (Dialog)
Wyświetla dialog i zwraca wartość True jeśli użytkownik nacisnął przycisk OK, w przeciwnym przypadku False.

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 .

6.1 Dialog kolorów

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:

Colour_Dialog
Tworzy dialog kolorów.
Set_Colour (Dialog, Colour)
Ustawia określony kolor w dialogu. Kolor będzie wybrany kiedy dialog zostanie aktywowany.
Get_Colour (Dialog)
Zwraca kolor z dialogu .

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.

6.2 Dialogi czcionek

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:

Font_Dialog
Tworzy dialog czcionek
Set_Font (Dialog, Font)
Ustawia określoną czcionkę w dialogu . Ta czcionka będzie wybrana, kiedy dialog jest uruchamiany.
Get_Font (Dialog)
Zwraca czcionkę wybraną z dialogu .

6.3 Dialogi operacji plikowych

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:

Open_Dialog (Title)
Tworzy dialog otwierania plików, który pozwoli ci wybrać tylko istniejący plik.

Save_Dialog (Title, Create)
Tworzy dialog zapisu pliku. Parametr Create może zostać ominięty; jeśli jego wartość ustawiona jest na True (domyślnie) i wybierzesz istniejący plik, zostaniesz zapytany czy chcesz go nadpisać, zanim dialog zostanie zamknięty. Jeśli jest ustawiony na False i wprowadzisz nazwę pliku, który nie istnieje, zostaniesz zapytany o potwierdzenie czy chcesz go utworzyć. Dialog nie tworzy pliku ani nie nadpisuje, sprawdza tylko zamiary użytkownika przed dostarczeniem nazwy pliku.

Set_Name (Dialog, Name)
Ustawia określoną nazwę pliku w dialogu. Ten plik zostanie wykonany, jeśli dialog zostanie zamknięty.

Get_Name (Dialog)
Zwraca nazwę pliku wybranego w dialogu.

Add_Filter (Dialog, Text, Filter)
Dodaje filtr nazw plików do dialogu. Tylko pliki, które pasują do wybranego filtru zostaną wyświetlone kiedy dialog zostanie wywołany. Można ustawić więcej niż jeden filtr, a użytkownik może wybierać między nimi. Tekst jest opisem wybieranych plików, e.g. "Bitmap files (*.bmp)", podczas gdy filtr jest specyfikacją (e.g. "*.bmp") lub listą specyfikacji oddzieloną średnikami (e.g. "*.bmp;*.rle").

Set_Directory (Dialog, Name)
Ustawia początkowy katalog dla dialogu. Jeśli taki katalog istnieje, będzie wyświetlony kiedy dialog zostanie wywołany. Jeśli katalog zostanie zmieniony, będzie on użyty następnym razem przy włączeniu się dialogu, chyba że zostanie użyta ponownie funkcja Set_Directory.


JEWL.Windows User Manual — © John English 2000,

przetłumaczył Piotr Śliwka 2004