Os arrays são objetos de linguagem. Você pode criar e usar arrays que nunca aparecerão na tela. Entretanto, arrays também são objetos de interface de usuários. Os seguintes tipos de Objetos de formulários estão sustentados por arrays:
Menu de pop-up/drop-down
Combo box
Área de deslocamento (obsoleto desde 4D v13)
Tab control
List box
Pode-se pré-definir estes objetos no Editor de Formulários de Ambiente de Designe usando o botão de valores da janela Lista de Propriedades (exceto List Box). Também se pode defini-los por programação, utilizando os comandos de arrays. Em ambos os casos, o objeto de formulário é sustentado por um array criado por você ou pelo 4D
Quando utilizar estes objetos, você pode detectar que elemento do objeto foi selecionado (ou recebeu um clique) submetendo a um teste o elemento selecionado de array. Inversamente, pode se selecionar um item em particular do objeto designando ou elemento selecionado para o array.
Quando um array é usado para sustentar um objeto de formulário, tem uma natureza dupla: é tanto um objeto de linguagem quanto um objeto de interface do usuário. Por exemplo, quando designa um formulário, cria-se uma área de deslocamento.
O nome da variável associada, neste caso atNomes, é o nome do array que você utiliza para criar e administrar a área de deslocamento.
Notas:
O elemento selecionado do array é armazenado internamente em uma variável de tipo inteiro longo. Como resultado, não é possível utilizar arrays que contenham mais de 32.767 elementos (no entanto, um grande número de elementos não é adequado para a visualização como um objeto de formulário).
Não se pode mostrar arrays de duas dimensões nem arrays de ponteiros.
A gestão de objetos do tipo List Box (os quais podem conter vários arrays) implica muitos aspectos específicos. Essas particularidades são tratadas na seção Contextual click.
O seguinte exemplo mostra como preencher um array e mostrá-lo em uma lista drop-down. Um array arSalarios cria-se utilizando o comando ARRAY REAL. Ele contém todos os salários de funcionários de uma empresa. Quando o usuário escolhe um elemento da lista drop-down, o campo [Empregados]Salario recebe o valor escolhido
Inicializa o array arSalarios usando o evento On Load para o objeto. Para fazer isso, lembre-se de ativar o evento na janela Lista de propriedades, como mostrado a seguir:
Clique no botão Método de objeto e crie o seguinte método:
As linhas:
ARRAY REAL(arSalarios;10) For($vlElem;1;10)
arSalarios{$vlElem}:=2000+($vlElem*500) End for
criam o array numérico 2500, 3000... 7000, correspondendo aos salários anuais de $30,000 a $84,000, antes dos impostos.
As linhas:
arSalarios:=Find in array(arSalarios;[Empregados]Salario) If(arSalarios=-1) arSalarios:=0 End if
controlam tanto a criação de um novo registro ou a modificação de um registro existente.
Se cria-se um novo registro, o campo [Empregados]Salario inicialmente igual a zero. Neste caso, Find in array não encontra o valor no array e devolve -1. O teste If (arSalarios=-1) coloca em zero a arSalarios, indicando que nenhum elemento foi selecionado na lista drop-down.
Se modificar-se um registro existente, Find in array recupera o valor no array e estabelece ao elemento selecionado da lista drop-down o valor atual do campo. Se o valor para um empregado em particular não estiver na lista, o teste If (arSalarios=-1) desfaz-se a seleção de todos os elementos da lista.
Nota: para maiores informações sobre o elemento de array selecionado, leia a próxima seção.
Para reportar o valor selecionado da lista drop-down arSalarios, precisa-se apenas administrar o evento On Clicked do objeto. O número de elemento selecionado é o valor do array arSalarios. Por isso, a expressão arSalarios{arSalarios} retorna o valor escolhido na lista drop-down.
Complete o método de objeto arSalarios desta forma:
Case of
:(Form event=On Load) ARRAY REAL(arSalarios;10) For($vlElem;1;10) arSalarios{$vlElem}:=2000+($vlElem*500) End for arSalarios:=Find in array(arSalarios;[Empregados]Salario) If(arSalarios=-1) arSalarios:=0 End if
:(Form event=On Clicked) [Empregados]Salario:=arSalarios{arSalarios} End case
A lista drop-down se vê assim:
A seguinte seção descreve as operações comuns e básicas que você realizará sobre arrays quando os utiliza como objetos de formulário.
Você pode reordenar os elementos do array usando o comando SORT ARRAY ou de diferentes arrays usando o comando MULTI SORT ARRAY. Usando o exemplo anterior, e sempre que o array se mostre como área de deslocamento:
a. A princípio, a área se mostrará como a lista à esquerda.
b. Depois da execução da seguinte linha de código:
Usando o exemplo anterior, e dado que o array é mostrado na área de rolagem, você pode manejar os cliques da seguinte forma:
` Método de objeto área de rolagem atNomes Case of
:(Form event=On Load) ` Inicializar o array (como se mostrou anteriormente) ARRAY TEXT(atNames;5) ` ...
:(Form event=On Unload) ` Não necessitamos mais do array CLEAR VARIABLE(atNombres)
:(Form event=On Clicked) If(atNomes#0) vtInfo:="Você clicou em: "+atNomes{atNomes} End if
:(Form event=On Double Clicked) If(atNomes#0) ALERT("Você fez duplo clique em: "+atNomes{atNomes} End if End case
Nota: os eventos devem estar ativados nas propriedades do objeto.
Enquanto a sintaxe atNomes{$vlElem} permite trabalhar com um elemento particular do array, a sintaxe atNomes devolve o número do elemento selecionado. Assim, a sintaxe atNomes{atNomes} significa 'o valor do elemento selecionado no array atNomes.” Se nenhum elemento for selecionado, atNomes é igual a 0 (zero), então o teste If (atNames#0) detecta se um elemento realmente foi selecionado ou não.
O comando Find in Array busca um valor em particular no array. Utilizando o exemplo anterior, o seguinte código selecionará o elemento cujo valor é 'Ricardo', se esse é o nome introduzido na caixa de diálogo de busca:
$vsNome:=Request("Introduza o nome:") If(OK=1) $vlElem:=Find in array(atNomes;$vsNome) If($vlElem>0) atNomes:=$vlElem Else ALERT("Não há "+$vsNome+" na lista de nomes.") End if End if
Menus de Pop-up, listas de drop-down, áreas de deslocamento e tab controls podem ser normalmente usadas da mesma maneira. Obviamente, nenhum código adicional é pedido para redesenhar objetos na tela toda vez que se muda o valor de um elemento, ou quando se adiciona ou deleta elementos.
Nota: para criar e usar tab controls com ícones e ativar e desativar tabs, você deve usar uma lista hierárquica como objeto de suporte para o tab control. Para maiores informações, veja o exemplo para o comando New list.
Enquanto você pode controlar menus de pop-up, listas de drop-down, áreas de deslocamento e tab controls com os algoritmos descritos na seção anterior, você deve manejar os combo boxes de maneira diferente.
Um combo box é, na verdade, um área de entrada de texto, à qual é anexada uma lista de valores (os elementos do array). O usuário pode escolher um valor desta lista, e então editar o texto. Então, em um combo box, a noção do elemento selecionado não se aplica.
Com os combo boxes, não há nunca um elemento selecionado. Cada vez que o usuário selecionar um dos valores anexos à área, o valor é colocado no elemento zero do array. Então, se o usuário edita o texto, o valor modificado pelo usuário é também colocado naquele elemento zero.
` Método de objeto Combo Box asCores Case of
:(Form event=On Load) ARRAY STRING(31;asCores;3)
asCores{1}:="Azul"
asCores{2}:="Branco"
asCores{3}:="Vermelho"
:(Form event=On Clicked) If(asCores{0}#"") ` O valor do objeto é automaticamente modificado ` Usando o evento On Clicked com um Combo box ` Se necessita apenas quando se devem tomar ações adicionais End if
:(Form event=On Data Change) ` Buscar no array ignora o elemento zero, então devolve -1 ou >0 If(Find in array(asCores;asCores{0})<0) ` O valor introduzido não é um dos valores adjuntos do objeto ` Adicionar o valor à lista para a próxima vez APPEND TO ARRAY(asCores;asCores{0}) Else ` O valor introduzido está entre os valores adjuntos do objeto End if End case