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ć kopiowana, rozpowszechniana 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
2. Nie-graficzne (Non-GUI) możliwości wejścia i wyjścia
3. Wejście dla Stringów
4. Wejście standardowych typów
5. Podstawowe możliwości wejścia
6. Wiadomości
7. Dialogi plikowe
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.IO jest pakietem, który może w mniejszym lub większym stopniu zastąpić standardowy pakiet Ada.Text_IO i jego pochodne Ada.Integer_Text_IO oraz Ada.Float_Text_IO, co oznacza, że tradycyjnie tekstowe programy mogą być przeniesione do środowiska graficznego, bez większego wysiłku. JEWL.IO używa graficznych okienek dialogowych (zwanych w skrócie dialogami) by wprowadzać dane, każda dana jest przesyłaną także jako echo do standardowego wyjścia. To oznacza, że część programu, w której wprowadzamy dane, może zostać zrobiona z dialogów graficznych, podczas gdy wyjście wciąż będzie wypisywane do standardowego wyjścia. Fakt ten oznacza, że log wyjścia będzie dokładnym odbiciem tego, jakby program był w całości oparty na trybie tekstowym.
JEWL.IO zawiera także kilka dodatkowych udogodnień: na przykład, ułatwienia dotyczące generowania komunikatów o błędzie lub innych powiadomieniach użytkownika, jako wiadomości (które także są przesyłane do standardowego wyjścia); funkcje konwertujące dane do typów łańcuchowych string i do łączenia typów łańcuchowych string by uprościć wypisywanie na wyjściu; także zabezpieczenia jak procedury Put_Line dla typów innych niż string.
JEWL.IO dostarcza podobne operacje jak w Ada.Text_IO dodając jednocześnie nowe udogodnienia:
We wszystkich dialogach za wyjątkiem zawiadomień użytkownika występuje przycisk Anuluj, który pozwala anulować wprowadzanie do wejścia. Naciśnięcie tego przycisku (lub przycisku zamykającego na pasku tytułowym) w każdym przypadku zamknie okno dialogowe i wzniesie wyjątek o anulowaniu wejścia Input_Cancelled.
Następujące sekcje opisują wszystkie te aspekty dużo dokładniej. W każdym przypadku, nazwy użyte by opisać parametry są właściwymi nazwami użytymi w deklaracjach, więc procedury opisane jako Get(Prompt,Default) mogą być także wywołane w ten sposób:
Get ("My prompt", "My default");
lub tak:
Get (Prompt => "My prompt", Default => "My default");
lub tak:
Get (Default => "My default", Prompt => "My prompt");
Także, nazwa każdej operacji w jej opisie jest połączona z wersją HTML w pakiecie specyfikacyjnym, więc po jej kliknięciu można zobaczyć jej formalny zapis.
Wyjście jest bardzo podobne do tego, które dostarcza pakiet Ada.Text_IO. Są wspólne dla wszystkich typów danych obsługiwanych przez JEWL.IO (String, Integer, Float oraz Boolean; dowolny typ wyliczeniowy, całkowity lub rzeczywisty) jak również standardowy typ znakowy Character. Dostępne są następujące operacje wyjścia:
Dostępne są również standardowe operacje konwersji:
Długość rezultatu funkcji To_String(Item) będzie zależeć od wartości parametru Item; analogicznie, długość S & X będzie zależała od wartości S i X. Takie 'niesprecyzowane' (unconstrained) łańcuchy mogą zostać przesłane do podprogramu, który oczekuje na taki właśnie typ, jako parametr (e.g. Put) ale mogą zostać przypisane tylko do zmiennej typu String (lub części zmiennej string) jeśli jest dokładnie odpowiedniego rozmiaru. Na przykład, następująca rzecz wygeneruje wyjątek Constraint_Error, jeśli rezultat To_String(Item) nie ma dokładnej długości 20 znaków:
S : String(1..20) := To_String(Item);
Czasem łatwiej zadeklarować zmienną String o odpowiednim rozmiarze i zainicjalizować ją używając następującej deklaracji:
declare S : String := To_String(Item); begin -- tutaj użycie wartości S end;
Granice S nie muszą być określone; rezultat To_String(Item) zostanie użyty by je określić.
Dodatkowe funkcje dotyczące użycia plików:
Stringi są obsługiwane odrobinę inaczej niż pozostałe typy, ponieważ String jest 'nieskrępowanym' (unconstrained) typem, którego długość może być różna. Możliwe operacje to:
Ponieważ długość string'a jest nieznana, jedynymi miejscami, gdzie ta funkcja może być użyta są miejsca gdzie nieskrępowany string jest akceptowalny. Są parametrami do innych procedur lub funkcji:
Put(Get(Prompt,Default));
lub w deklaracji:
S : String := Get(Prompt,Default);
Obydwa parametry Prompt i Default są opcjonalne, więc najprostsza forma stosowania Get jest taka:
S : String := Get;
Domyślnie , podpowiedź Prompt brzmi "Wprowadź swój tekst:" i Default jest pustym stringiem ("", zero znaków długości).
By umożliwić kompatybilność z nazwami operacji z Ada.Text_IO, ostatnie dwie są dostępne pod różnymi nazwami:
Istnieje także wersja Get, która odczyta pojedynczy znak z pliku:
Standardowe typy obsługiwane przez JEWL.IO (poza typem String, którego obsługa jest wyżej) to Integer, Float oraz Boolean. Nie ma wejściowych udogodnień dla pojedynczych znaków, jako że String lub typ wyliczeniowy jest zwykle lepszym wyborem dla tego typu wejścia. Jeśli to konieczne, udogodnienia dla typów wyliczeniowych opisane poniżej mogą być używane z typem znakowym Character.
Dla Integer, Float oraz Boolean, następujące operacje wejścia są dostępne:
Dialogi dla Integer i Float używają takiego samego okienka jak dla String, za wyjątkiem tego, że dane wejściowe są sprawdzane co do typu, kiedy przycisk OK zostaje naciśnięty. Jeśli są nieprawidłowe, wiadomość o błędzie zostanie wyświetlona (zobacz Error, niżej) i dialog zostanie wyświetlony ponownie, jeśli OK zostanie naciśnięte jako odpowiedź.
Dialogi typu Bool mają odmienny wygląd, zależnie od tego czy wartość jest określona. Jeśli nie ma domyślnej, okienko zawiera określoną podpowiedź i trzy przyciski podpisane "Tak", "Nie" oraz "Anuluj". Naciśnięcie "Tak" zwraca wartość prawdy True, "Nie" zwraca fałsz False, a "Anuluj" wznosi Input_Cancelled - wyjątek jak zwykle.
Jeśli wartość domyślna istnieje, pole zaznaczania jest wyświetlone (podpisane odpowiednią podpowiedzią) razem z przyciskami "OK" i "Anuluj". Pole zaznaczania jest zaznaczone jeśli domyślną wartością jest prawda True.
JEWL.IO podstawowych podpakietów dla wejścia i wyjścia typów wyliczeniowych, całkowitych i zmiennoprzecinkowych. By ich używać, muszą być zainstancjonowane z odpowiednim typem:
package My_Enumerated_IO is new JEWL.IO.Enumeration_IO (My_Enum); package My_Integral_IO is new JEWL_IO.Integer_IO (My_Int); package My_Float_IO is new JEWL_IO.Float_IO (My_Float);
Operacje dostępne w tych pakietach są standardowymi
operacjami wyjścia i następującymi operacjami wejścia (takie same jak opisane
powyżej dla standardowych typów, wyżej):
Dialogi dla typów całkowitych i zmiennoprzecinkowych używają tego samego dialogu co dialog dla String, za wyjątkiem tego, że wprowadzana wartość jest sprawdzana, by upewnić się czy po naciśnięciu OK, wszystko będzie w porządku. Jeśli wartość jest błędna, wiadomość o błędzie, która precyzuje dostępne wartości zostanie wyświetlona jako okno wiadomości (patrz Error , niżej) i dialog zostanie wyświetlony ponownie jeśli przycisk "OK" został naciśnięty jako odpowiedź.
Zauważ, że powinieneś unikać używania klauzuli use dla podtypów całkowitych lub zmiennoprzecinkowych, jako że to powoduje dwuznaczność między istniejącymi operacjami dla Integer i Float i tymi dostarczonymi w nowym pakiecie. Na przykład, rozważ co się stanie, jeśli Integer_IO jest zainstancjonowany dla Natural(nych) (jako podtyp Integer):
package Natural_IO is new JEWL.IO.Integer_IO(Natural); use Natural_IO;
Jeśli Get jest wywołane dla Integer lub Natural, kompilator nie będzie w stanie rozróżnić pomiędzy dwoma dostępnymi wersjami Get:
Get(Item); -- czy to Get(Item:Integer) lub Get(Item:Natural)?
By rozstrzygnąć dwuznaczność, musisz sprecyzować nazwę pakietu w obu przypadkach:
JEWL.IO.Get(Item); -- Get(Item:Integer) Natural_IO.Get(Item); -- Get(Item:Natural)
Jeśli nie ma klauzuli use dla Natural_IO, wersja Get dla typu Natural będzie wciąż musiała być zakwalifikowana jako Natural_IO.Get jak w drugim przypadku powyżej, ale Get(Item) bez dodatkowych kwalifikacji będzie teraz interpretowane bez dwuznaczności jako odwołanie do wersji Get dla typu Integer (pierwszy przypadek wyżej).
Dialog dla typów wyliczeniowych posiada Kombo zamiast pola edycji, i jeśli domyślna wartość została zdefiniowana, będzie wartością wyświetlaną początkowo w Kombo. Naciśnięcie klawisza na prawo od Kombo wyświetli opuszczaną listę możliwych wartości typu wyliczeniowego. Tylko wartości wyświetlone na tej liście mogą być wybrane; wartość Kombo nie może być edytowana wprost.
Wiadomość jest dialogiem, który może zostać użyty do poinformowania użytkownika o błędzie lub innej informacji, lub zadać pytanie tak/nie. Są trzy operacje wyświetlające okna wiadomości:
|
![]() |
|
![]() |
|
![]() |
Dostarczone standardowe dialogi do otwierania i tworzenia plików. Wyświetlają drzewo katalogów i pozwalają wybrać lub ręcznie wpisać nazwę pliku do otwarcia lub utworzenia. W każdym wypadku parametr File identyfikuje plik będący otwartym bądź tworzonym i musi być zmienną typu File_Type. Procedury używające tych dialogów są następujące:
Dialog będzie wyglądał tak:
Pliki powinny zostać zamknięte jeśli nie są dłużej w użyciu:
przetłumaczył Piotr Śliwka 2004