É possível manejar objetos da linguagem 4D utilizando a notação objeto para obter ou definir seus valores. Por motivos de compatibilidade, esta funcionalidade exige que se ative explicitamente uma opção de compatibilidade. Quando tiver ativada a notação de objetos, pode utilizá-la em todas as partes em 4D onde se esperam expressões.
Cada valor de propriedade acessado através da notação de objetos é considerado uma expressão. Quando a notação de objeto estiver ativada em seu banco de dados (ver abaixo), pode usar tais valores sempre que expressões 4D forem esperadas:
em código 4D code, quando for escrito nos métodos (editor Method) ou externalizado (fórmulas, arquivos 4D tags processados por PROCESS 4D TAGS ou o Web Server, arquivos export, documentos 4D Write Pro...),
nas áreas Expression do Debugger e explorador de Runtime,
na lista de Propriedades do Editor de Formulário para objetos formulário: Campo Variável ou Expressão assim como várias seleção de list box e expressões de coluna (Data Source, cor de fundo, estilo, cor de fonte).
Os objetos manipulados mediante a notação de objetos devem ter sido inicializados utilizando o comando New object, do contrario, o acesso a suas propriedades de leitura e escritura gerará um erro de sintaxe.
Exemplo:
C_OBJECT($obVar) //criação de uma variável 4D de tipo objeto $obVar:=New object//inicialização de objeto e atribuição à variável 4D
os mesmos princípios se aplicam a campos tipo Object:
CREATE RECORD([Person]) //Adicionar um novo registro a uma tablea contendo um campo objeto [Person]Data_o:=New object//Initialização do objeto e atribuir ao campo 4D
Com notação de objeto, propriedades de objeto podem ser acessados de duas maneiras:
usando um símbolo "ponto":
object.propertyName
Exemplo:
employee.name:="Smith"
usando uma string dentro de colchetes:
object["propertyName"]
Exemple:
$vName:=employee["name"]
Já que um valor de propriedade de objeto pode ser um objeto ou uma coleção, notação de objetos aceita uma sequència de símbolos para acessar sub-propriedades, por exemplo:
$vAge:=employee.children[2].age
Notação de objeto está disponível para qualquer elemento de linguagem que contenha ou retorne um objeto, ou seja
Objetos em si (armazenados em variáveis, campos, propriedades de objeto, arrays de objeto ou elementos de coleção). Exemplos:
$age:=$myObjVar.employee.age //variável $addr:=[Emp]data_obj.address //campo $city:=$addr.city //propriedade de um objeto $pop:=$aObjCountries{2}.population //array de objeto $val:=$myCollection[3].subvalue //elemento de coleção
Para acessar um elemento de coleção, deve passar o número de elemento embebido em colchetes:
collectionName[expression]
Nota: para maior informação sobre as variáveis de tipo coleção, consulte a seção .
Pode passar qualquer expressão válida 4D que retorna um inteiro positivo em expressão. Exemplos:
myCollection[5] //acessa o 6o elemento da coleção
myCollection[$var]
Nota: Lembre que elementos de coleção são numerados a partir de 0.
Pode atribuir um valor para o elemento da coleção usando a notação objeto:
myCol[10]:="My new element"
Se este índice de elemento for além do último elemento existente da coleção, a coleção é automaticamente redimensionada e todos os novos elementos intermediários obtém o valor null:
A propriedade length está disponível automaticamente para todas as coleções e retorna o tamanho da coleção, ou seja, o número de elementos que ela contém. Pode acessar essa propriedade de duas maneiras:
usar um símbolo "ponto", por exemplo:
$vSize:=myCollection.length
usar uma string dentro de colchetes, por exemplo:
$vSize:=myCollection["length"]
Note que a propriedade length pode apenas ser lida, não modificada.
Valores de propriedade podem ser acessados através de ponteiros. Usar notação de objeto com ponteiros é bem parecido a usar notação de objetos diretamente com objetos, exceto que o símbolo "ponto" deve ser omitido
Quando usar a notação de objeto, o valor null é compatível pelo comando Null. Este comando pode ser usardo para atribuir ou comparar o valor null a propriedades de objeto ou elementos de coleção, por exemplo
myObject.address.zip:=Null
<p>If(myColl[2]=Null)
Para saber mais, veja a descrição do comando Null.
A avaliação de uma propriedade de objeto as vezes pode produzir um valor indefinido. Este é o caso, por exemplo, quando se escreve:
C_OBJECT($o) $o:=New object("a";2) $val:=$o.b //$val es indefinido
Normalmente, ao tentar ler ou atribuir expressões indefinidas, 4D gerará erros. Isto não acontece nos casos abaixo:
A leitura de uma propriedade de um objeto ou valor indefinido devolve indefinido; atribuir um valor indefinido a variáveis (exceto arrays) tem o mesmo efeito que chamar a CLEAR VARIABLE com eles:
C_OBJECT($o) C_LONGINT($val) $val:=10 //$val=10 $val:=$o.a //$o.a está indefinido (sem erro), e assignar este valor apaga a variável //$val=0
Ler a propriedade length de uma coleção indefinida produz 0:
C_COLLECTION($c) //variável criada mas não se define nenhuma coleção $size:=$c.length //$size = 0
Um valor indefinido passado como parâmetro a um método de projeto se converte automaticamente a 0 ou "" segundo o tipo de parâmetro declarado.
C_OBJECT($o) mymethod($o.a) //passa um parâmetro não definido
//Em método mymethod C_TEXT($1) //tipo de parâmetro é texto // $1 contém ""
Uma expressão de condição se converte automaticamente a false quando se avalia como indefinida com as palavras chaves If eCase of:
C_OBJECT($o) If($o.a) // false End if Case of
:($o.a) // false End case
Atribuir um valor indefinido a uma propriedade de objeto existente reinicializa ou apaga seu valor, dependendo de seu tipo:
Objeto, coleção, ponteiro: Null
Imagem: Imagem vazia
Booleano: False
String: ""
Número: 0
Data: !00-00-00! se estiver ativada a configuração "Usar tipo de data ao invés de formato de data ISO em objetos", do contrário ""
Atribuir um valor indefinido a uma propriedade de objeto não existente não faz nada.
Quando se esperam expressôes de um tipo dado em seu código 4D, pode ter certeza de que têm o tipo correto mesmo quando são avaliadas como indefinido rodeando-as com o comando cast 4D apropriado: String, Num, Time, Date, Bool. Estes comandos devolvem um valor vazio do tipo especificado quando a expressão se avalia como indefinida. Por exemplo:
$myString:=Lowercase(String($o.a.b)) //tenha certeza de obter um valor de string mesmo se não estiver definido //para evitar erros no código
Tais propriedades são "métodos objeto", ou seja, métodos que estão ligados a seu objeto principal. Para executar um método armazenado em uma propriedad objeto, use o operador ( ) depois do nome da propriedade, como por exemplo:
$f.message() //displays "Hello world"
A sintaxe com colchetes também é compatível:
$f["message"]() //exibe "Hello world"
Também pode passar parâmetros a sua fórmula quando a chame utilizando $1, $2… da mesma forma que com os métodos projeto 4D:
Lembre que, mesmo se não tiver parâmetros, um método objeto para ser executado deve ser chamado com parênteses ( ). Chamar apenas a propriedade do objeto devolverá uma nova referência à fórmula (e não a executará):
$o:=$f.message //devolve o objeto de fórmula em $o
Os nomes de membros token (ou seja, os nomes de propriedade objeto que são acessados utilizando a notação de objetos) são mais restritivos que os nomes de objetos 4D padrão. Devem cumplir com a gramática de identificador de JavaScript (ver ECMA Script standard):
O primeiro caráctere deve ser uma letra, um subscrito (_), ou um sinal de dólar ($),
Os seguintes caracteres podem ser qualquer letra ou dígito ou um subscrito ou sinal de dólar (os caracteres de espaço NAO estao permitidos),
São sensíveis a maiusculas e minúsculas.
Nota:
não é permitido usar um campo tabela como índice de coleção, por exemplo a.b [[Table1]Id]. Deve utilizar uma variável intermediária.
A criação de atributos de objeto mediante uma string entre colchetes permite anular as reglas de ECMA Script. Por exemplo, o atributo $o["My Att"] é válido em 4D, apesar do espaço. Neste caso, entretanto, não será possível utilizar a notação de pontos com este atributo.
Aviso Apesar de nomes de propriedade de objeto poderem conter caracteres especiais tais como "." ou "[ ]" (e estarem disponíveis através de sintaxe $o["My Att.name"] ), não são recomendados já que não poderá realizar pesquisas ou ordenações neles. Todos os comandos e métodos 4D que executem pesquisas ou propriedades de objeto, tais como dataClass.query( ) ou QUERY BY ATTRIBUTE use uma string como propertyPath ou o parâmetro attributePath, por exemplo:
QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex") //subpropriedade nome de dog
Pesquisas e ordenações em propriedades que tenham caracteres especiais em seu nome serão interpretadas incorretamente e dá resultados inválidos. Por exemplo, se definir uma propriedade chamada ["A.1.1"], não será possível pesquisar:
QUERY BY ATTRIBUTE([Chapter]];[Chapter]code;"A.1.1";=;"Intro@") //nome de propriedade inválido
Em todas as versões, 4D sempre aceitou pontos (.) E colchetes ([e]) em nomes de objetos de banco de dados tokenizados (tabelas, campos, variáveis e métodos).
Entretanto, estes caracteres são utilizados para identificar tokens de linguagem na notação de objetos. Portanto, os bancos de dados que utilizam nomes que contenham pontos ou colchetes não são compativeis com a notação de objetos padrão já que interpretações errôneas poderiam romper o código existente. Por exemplo, se escrever o código abaixo:
a.b a.b:=c[1]
...4D não podería saber se a.b y c[1] representam nomes de variaveis padrão ou se b é uma propriedade de objeto a e c o segundo elemento de uma coleção de objetos c.
Portanto:
Em bancos de dados convertidos, deve selecionar uma opção específica que indique que deseja utilizar a notação de objetos. Ao selecionar esta opção, declara que seu código está "pronto para a notação de objetos", ou seja, não utiliza nenhum nome que contenha "." ou "[]".
Uma funcionalidade específica de CSM lhe ayuda a detectar os nombs que são incompatiiveis com a notação de objetos. E recomendável utilizar esta função antes de ativar a opção (consulte a seção Verificar do capítulo "CSM"). Como é habitual, se recomenda trabalhar com uma cópia de arquivo de estrutura.
A partir de 4D v17 R4, "." e os caracteres "[]" já não são permitidos nos nomes de objetos tokenizados.
Para poder utilizar a notação de objetos em bancos criados em versões anteriores a 4D v17, deve clicar no botão Utilizar a notação de objetos para acessar às propriedades objeto (Se exige Unicode) na página Compatibilidade do diálogo Configuração do banco de dados:
Esta configuração modificará o estado interno do arcquvo de estrutura e não pode ser defesita. Para obter mais informação, consulte o parágrafo Notação de objeto na seção Página Compatibilidade.
Nota: os componentes poden ter uma configuração diferente do banco de dados local.
O uso da notação de objetos simplifica o código 4D enquanto objetos são manipulados. Entretanto a notação baseada em comandos segue sendo totalmente suportada.
Escrever e ler objetos (este exemplo compara a notacção de objetos e a notação de comandos):
// Uso da notacção de objetos C_OBJECT($myObj) //declara um objeto variável 4D $myObj:=New object//cria um objeto e o atribui à variável $myObj.age:=56 $age:=$myObj.age //56
// Usando a notação de comandos C_OBJECT($myObj2) //declara um objeto variável 4D OB SET($myObj2;"age";42) //cria um objeto e agrega à propiedade age $age:=OB Get($myObj2;"age") //42
// Ambas as notações podem ser misturadas C_OBJECT($myObj3) OB SET($myObj3;"age";10) $age:=$myObj3.age //10
Cria uma propiedade e atribui valores, incluidos os objetos:
C_OBJECT($Emp) $Emp:=New object $Emp.city:="London" //cria l propriedade city e estabelece seu valor em "London" $Emp.city:="Paris" //modifica a propiedade city $Emp.phone:=New object("office";"123456789";"home";"0011223344") //cria a propriedade phone e define seu valor em um objeto
Obtér um valor em um subobjeto é muito simples utilizando a notação de objeto:
Pode acessar as propriedades como strings usando o operador [ ]
$Emp["city"]:="Berlin" //modifica a propriedade cidade //Isso pode ser útil para criar propriedades através de variáveis C_TEXT($addr) $addr:="address" For($i;1;4) $Emp[$addr+String($i)]:="" End for // cria 4 propriedades vazias "address1...address4" no objeto $Emp