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.