A leitura de dados inseridos pelo utilizador, para definir pesquisas ou criar objectos, por exemplo, é realizada através do conceito de formulário. Um formulário é representado pela classe Form. Um formulário agrupa diversos pedidos numa única interacção.
Cada pedido é constituído por uma cadeia de caracteres e guarda a resposta do utilizador. Relativamente à informação pedida ao utilizador, são suportados 4 tipos: inteiros, reais, boleanos e cadeias de caracteres. Os pedidos são representados pela classe abstracta e genérica Input<T>. Para cada pedido deve ser criada uma instância de InputInteger, InputFloat, InputBoolean ou InputString, dependendo do tipo de dados que o utilzador deve preencher. Cada uma destas classes tem um construtor com dois argumentos: a mensagem descritiva do pedido e a referência para o formulário onde deve ser integrado o pedido. Existe ainda um separador, designado por InputNone, que não pede qualquer valor.
Para preencher um formulário deve ser executado o método parse sobre o formulário. A execução deste método, processa os vários pedidos do formulário de forma sequencial. Para cada pedido, o formulário apresenta a mensagem associada ao pedido e lê a resposta do utilizador, a qual é guardada no pedido. Caso o utilizador dê uma resposta inválida (por exemplo, quer-se ler um número e o utilizador inseriu uma cadeia de caracteres que não representa um número), a pergunta é repetida e dada uma nova oportunidade ao utilizador para inserir novos dados. Após o formulário ter sido totalmente prenchido pode-se aceder ao valor recolhido para cada pedido invocando o método value() sobre o pedido em causa. Note-se que só faz sentido invocar o método value() sobre um pedido depois de ter sido executado o método parse sobre o formulário que contém o pedido em causa.
O exemplo seguinte apresenta a criação de um formulário que realiza 4 pedidos de dados ao utilizador. É ainda utilizado um separador para separar os 2 primeiros pedidos dos restantes dois. Finalmente, este exemplo apresenta novamente ao utilizador os dados, um por linha, que ele preencheu no formulário:
public final void execute() throws InvalidOperation { Form f = new Form("Titulo"); Display display = new Display(); InputInteger id = new InputInteger(form, "Introduza um valor inteiro"); InputFloat real = new InputFloat(form, "Distância"); InputNone sep = new InputNone(form, "-----"); InputString str = new InputString(form, "Nome"); InputBoolean sn = new InputBoolean(form, "OK?"); form.parse(); display.addLine("Id = " + id.value()); display.addLine(" Real = " + real.value()); display.addLine(" Str = " + str.value()); display.addLine(" " OK = " + sn.value()); display.display(); }
O exemplo seguinte exemplifica a funcionalidade de adicionar um número à aplicação:
public class AddNumber extends Command<IntegerManager> { /** Number to read. */ private Input<Integer> _number; //Constructor public AddNumber(IntegerManager ent) { super("Adicionar Número", ent); _number = _form.addIntegerInput("Introduza um número: "); } protected void execute() { // executed when this option is selected _form.parse(); _receiver.addNumber(_number.value()); _display.addLine("Number added: " + _number.value()).display(); } }
Dado que apenas é necessário ler um inteiro, o formulário apenas irá conter um pedido do tipo InputInteger, o qual tem que ser criado e adicionado ao formulário. Uma forma mais rápida de especificar o código para criar o pedido e associá-lo ao formulário é utilizar um dos vários métodos add disponíveis na classe Form. Existe um método add para cada tipo de dados a inserir pelo utilizador. Neste exemplo é utilizado o método addInputInteger, o qual recebe a mensagem a colocar no pedido e cria o pedido, associa o pedido criado ao formulário e devolve uma referência para o pedido criado. Utilizando esta abordagem, o método execute do comando apenas terá que invocar o método parse sobre o formulário do comando e depois aceder ao valor inserido para cada pedido invocando método value sobre o pedido.