Objeto
Variáveis, campos ou expressões do tipo Objecto podem conter vários tipos de dados. The structure of native 4D objects is based on the classic principle of "property/value" pairs. A sintaxe desses objetos é baseada na notação JSON:
Um nome de uma propriedade é sempre um texto, por exemplo "nome". Deve seguir regras específicas.
Um valor de propriedade pode ser do seguinte tipo:
- number (Real, Integer, etc.)
- text
- null
- boolean
- ponteiro (armazenado como tal, avaliado usando o comando
JSON Stringify
ou quando copiando), - data (tipo de data ou cadeia de formato de data ISO)
- objecto(1) (os objectos podem ser aninhados em vários níveis)
- imagem(2)
- collection
(1)Os objectos ORDA, tais como entidades ou seleções de entidades não podem ser armazenados em campos de objectos; no entanto, são totalmente suportados em variáveis de objectos em memória.
(2)Quando exposto como texto no depurador ou exportado para o JSON, as propriedades do objeto da imagem imprimem "[Imagem do objecto]".
Keep in mind that property names differentiate between upper and lower case.
You manage Object type variables, fields or expressions using the object notation or the commands available in the Objects (Language) theme. Note-se que comandos específicos do tema Consultas tais como QUERY BY ATTRIBUTE
, QUERY SELECTION BY ATTRIBUTE
, ou ORDER BY ATTRIBUTE
podem ser utilizados para realizar o processamento em campos de objectos.
Cada valor de propriedade acessado através da notação de objeto é considerado uma expressão. Pode utilizar tais valores sempre que se esperem expressões 4D:
- em código 4D, quer escritos nos métodos (Editor de Código) ou externalizados (fórmulas, ficheiros de etiquetas 4D processados por
PROCESS 4D TAGS
ou no Servidor Web, ficheiros de exportação, documentos 4D Write Pro...), - nas áreas de expressão do depurador e do explorador de Runtime,
- na lista de propriedades do editor de formulários para objectos de formulários: Variável ou Campo de expressão, bem como várias caixas de selecção e expressões de colunas (Fonte de dados, cor de fundo, estilo, ou cor da fonte).
Instanciação
Objects must have been instantiated, otherwise trying to read or modify their properties will generate a syntax error.
Object instantiation can be done in one of the following ways:
- using the
New object
command, - utilizando o operador
{}
.
Several 4D commands and functions return objects, for example Get database measures
or File
. In this case, it is not necessary to instantiate explicitely the object, the 4D language does it for you.
comando New object
The New object
command creates a new empty or prefilled object and returns its reference.
Exemplos:
var $obVar : Object //declaration of an object type 4D variable
$obVar:=New object //instantiation of an object and assignment to the 4D variable
var $obFilled : Object
$obFilled:=New object("name";"Smith";"age";42) //instantiation and assignment of a prefilled object
operador {}
The {}
operator allows you to create an object literal. An object literal is a semi-column separated list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({}
). The object literal syntax creates empty or filled objects.
Since any property value is considered an expression, you can create sub-objects using {}
in property values. You can also create and reference collection literals.
Exemplos:
var $o ; $o2 ; $o3 : Object //declaration of object variables
$o := {} // instantiation of an empty object
$o2 := {a: "foo"; b: 42; c: {}; d: ($toto) ? true : false } // instanciação de um objecto
// com propriedades {"a": "foo", "b":42, "c":{}, "d":false})
// mesmas propriedades utilizando variáveis
var $a : Text
var $b : Number
var $c : Object
$a:="foo"
$b:=42
$c:={}
$o3:={ a: $a; b: $b; c: $c } // {"a": "foo";b":42; "c":{}}
É possível misturar as sintaxes New object
e literal:
$o:={\
ob1: {age: 42}; \
ob2: New object("message"; "Hello"); \
form1: Formula(return This.ob1.age+10); \
form2 : Formula(ALERT($1)); \
col: [1; 2; 3; 4; 5; 6]\
}
$o.form1() //52
$o.form2($o.ob2.message) // apresenta Hello
$col:=$o.col[5] //6
Objeto regular ou compartilhado
Pode criar dois tipos de objetos:
- regular (non-shared) objects, using the
New object
command or object literal syntax ({}
). Estes objetos podem ser editados sem qualquer controle de acesso específico, mas não podem ser compartilhados entre processos. - shared objects, using the
New shared object
command. Estes objetos podem ser compartidos entre processos, incluidos os threads preemptivos. Access to these objects is controlled byUse... End use
structures. For more information, refer to the Shared objects and collections section.
Noções básicas de sintaxe
A notação de objetos pode ser utilizada para acessar aos valores das propriedades de objetos através de uma string de tokens.
Propriedades dos objectos
Com a notação de objetos, pode acessar às propriedades dos objetos de duas maneiras:
- using a "dot" symbol: > object.propertyName
Exemplo:
employee.name:="Smith"
- using a string within square brackets: > object["propertyName"]
Exemplos:
$vName:=employee["name"]
//or also:
$property:="name"
$vName:=employee[$property]
Uma vez que um valor de propriedade de objeto pode ser um objeto ou uma coleção, a notação de objeto aceita uma sequência de símbolos para acessar subpropriedades, por exemplo:
$vAge:=employee.children[2].age
A notação de objetos está disponível em qualquer elemento da lenguagem que possa conter ou devolver um objeto, ou seja:
- com os Objetos mesmos (armazenados em variáveis, campos, propriedades de objetos, arrays de objetos ou elementos de coleções). 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 objeto
$val:=$myCollection[3].subvalue //elemento coleção
- Comandos 4D que devolvem objectos. Exemplo:
$measures:=Get database measures.DB.tables
- Métodos de Projeto que retornam objetos. Exemplo:
// MyMethod1
#DECLARE -> $o : Object
$o:=New object("a";10;"b";20)
//myMethod2
$result:=MyMethod1.a //10
- Collections Example:
myColl.length //tamanho da coleção
Ponteiro
Nota preliminar: dado que os objetos são passados sempre por referência, geralmente não é preciso usar ponteiros. Ao passar o objeto, internamente 4D utiliza automaticamente um mecanismo similar a um ponteiro, minimizando a necessidade de memória e permitindo modificar o parâmetro e devolver as modificações. Como resultado, não é necessário usar ponteiros. Mas se quiser usar ponteiros, valores de propriedade podem ser acessados com ponteiros.
Usar notação de objeto com ponteiros é parecido com usar notação de objeto diretamente com os objetos, exceto que o símbolo "ponto" deve ser omitido.
Acesso direto
pointerOnObject->propertyName
Acesso pelo nome:
pointerOnObject->["propertyName"]
Exemplo:
var vObj : Object
var vPtr : Pointer
vObj:=New object
vObj.a:=10
vPtr:=->vObj
x:=vPtr->a //x=10
Valor Null
Quando se usar a notação de objeto, o valore null se torna compatível com o comando Null . Este comando pode ser usado para atribuir ou comparar o valor nulo com as propriedades de objeto ou elementos de coleção, por exemplo
myObject.address.zip:=Null
If(myColl[2]=Null)
For more information, please refer to Null and Undefined.
Valor não definido
A avaliação de uma propriedade de um objeto pode produzir às vezes um valor indefinido. Normalmente ao tentar ler ou atribuir expressões indefinidas, 4D gera erros. Isso não acontece nos casos abaixo:
- Reading a property of an undefined object or value returns undefined; assigning an undefined value to variables (except arrays) has the same effect as calling
CLEAR VARIABLE
with them:
var $o : Object
var $val : Integer
$val:=10 //$val=10
$val:=$o.a //$o.a é indefinido (sem erro), e a atribuição deste valor limpa a variável
//$val=0
- Lendo a propriedade de comprimento de uma coleção indefinida produz 0:
var $c : Collection //variável criada mas nenhuma colecção está definida
$size:=$c.length //$size = 0
- Um valor indefinido passado como parâmetro para um método de projecto é automaticamente convertido em 0 ou "" de acordo com o tipo de parâmetro declarado.
var $o : Object
mymethod($o.a) //passa um parâmetro indefinido
//No método mymethod
#Declare ($myText : Text) //o tipo de parâmetro é texto
// $myText contém ""
- Uma expressão de condição é automaticamente convertida em falsa quando se avalia para indefinida com as palavras-chave If e Case:
var $o : Object
If($o.a) // false
End if
Case of
:($o.a) // false
End case
- A atribuição de um valor indefinido a um objecto existente reinicia ou limpa o seu valor, dependendo do seu tipo:
- Objecto, colecção, ponteiro: Null
- Imagem: Imagem vazia
- Booleano: Falso
- String: ""
- Número: 0
- Data: !00-00-00-00! se a configuração "Usar tipo de data em vez de formato de data ISO nos objetos" estiver habilitada, caso contrário ""
- Hora: 0 (número de ms)
- Indefinido, Null: sem mudança
var $o : Object
$o:=New object("a";2)
$o.a:=$o.b //$o.a=0
- Atribuir um valor indefinido a uma propriedade objecto não existente não faz nada.
Quando expressões de um certo tipo são esperadas em seu código 4D, pode garantir que tenha o tipo correto mesmo quando são avaliadas como indefinidas, cercando-as com o comando de transformação 4D apropriado: String
, Num
, Date
, Time
, Bool
. Estes comandos devolvem um valor vazio de tipo especificado quando a expressão é avaliada como indefinida. Por exemplo:
$myString:=Caixa minúscula(String($o.a.b))) // certifique-se de obter um valor de string mesmo que não esteja definido
// para evitar erros no código
Para mais informações, consulte Null e Undefined
Exemplos
Usar notação de objeto simplifica o código 4D no manejo dos mesmos. Entretanto note que a notação baseada em comandos continua sendo totalmente compatível.
- Escrita e leitura das propriedades de objetos (este exemplo compara a notação de objetos e anotação de comandos):
// Using the object notation
var $myObj : Object //declares a 4D variable object
$myObj:={} //creates an object literal and assigns it to the variable
$myObj.age:=56
$age:=$myObj.age //56
// Using the command notation
var $myObj2 : Object //declares a 4D variable object
OB SET($myObj2;"age";42) //creates an object and adds the age property
$age:=OB Get($myObj2;"age") //42
// Of course, both notations can be mixed
var $myObj3 : Object
OB SET($myObj3;"age";10)
$age:=$myObj3.age //10
- Criar uma propriedade e atribuir valores, incluindo objetos:
var $Emp : Object
$Emp:=New object
$Emp.city:="London" //creates the city property and sets its value to "London"
$Emp.city:="Paris" //modifies the city property
$Emp.phone:=New object("office";"123456789";"home";"0011223344")
//creates the phone property and sets its value to an object
- Obter um valor em um subobjeto é bem simples usando a notação de objeto:
$vCity:=$Emp.city //"Paris"
$vPhone:=$Emp.phone.home //"0011223344"
- É possível acessar as propriedades como strings usando o operador []
$Emp["city"]:="Berlin" //modifies the city property
//this can be useful for creating properties through variables
var $addr : Text
$addr:="address"
For($i;1;4)
$Emp[$addr+String($i)]:=""
End for
// creates 4 empty properties "address1...address4" in the $Emp object