Este é o site histórico da documentação 4D. As documentações estão sendo movidas progressivamente para developer.4d.com

Página Inicial

 
4D v19.8
Usar notação padrão objeto

Usar notação padrão objeto  


 

É 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

Notação de objetos pode ser usada para acessar valores de propriedade de objeto e elementos de coleção através da cadeia de  tokens.

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
  • comandos 4D que retorna objetos.
    Exemplo:
     $measures:=Get database measures.DB.tables
  • Métodos de projeto que retorna objetos.
    Exemplo:
      // MeuMetodo1
     C_OBJECT($0)
     $0:=New object("a";10;"b";20)
     
      //meuMetodo2
     $result:=MyMethod1.a //10
  • Coleções (apenas propriedade length, ver parágrafo a seguir).
    Exemplo:
     myColl.length //tamanho da 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:

 C_COLLECTION(myCol)
 myCol:=New collection("A";"B")
 myCol[5]:="Z"
  //myCol[2]=null
  //myCol[3]=null
  //myCol[4]=null

Propriedade Length

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

.

  • Acesso por token:
    pointerOnObject->propertyName
  • Acesso por nome:
    pointerOnObject->["propertyName"]

Exemplo:

 C_OBJECT(vObj)
 C_POINTER(vPtr)
 vObj:=New object
 vObj.a:=10
 vPtr:=->vObj
 x:=vPtr->a //x=10

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 e Case 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 ""
    • Hora: 0 (número de ms)
    • Indefinido, Null: sem mudança

     C_OBJECT($o)
     $o:=New object("a";2)
     $o.a:=$o.b //$o.a=0

  •   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

Os métodos Formula ou Formula from string lhe permitem criar objetos "fórmula" nativos que pode encapsular em propriedades de objeto:

 C_OBJECT($f)
 $f:=New object
 $f.message:=New formula(ALERT("Hello world"))

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:

 C_OBJECT($f)
 $f:=New object
 $f.message:=New formula(ALERT("Hello "+$1))
 $f.message("John") //mostra "Hello John"

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:

 $vCity:=$Emp.city //"Paris"
 $vPhone:=$Emp.phone.home //"0011223344"

  •  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



Ver também 

C_COLLECTION
C_OBJECT
Erros de Análise de notação de objeto (-10737 -> -10701)
New collection
New object

 
PROPRIEDADES 

Produto: 4D
Tema: Objetos (Linguagem)

 
CONTEÚDO DA PÁGINA 
 
HISTÓRIA 

Criado por: 4D v16 R4

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v19)
Manual de linguagem 4D ( 4D v19.1)
Manual de linguagem 4D ( 4D v19.4)
Manual de linguagem 4D ( 4D v19.5)
Manual de linguagem 4D ( 4D v19.6)
Manual de linguagem 4D ( 4D v19.7)
Manual de linguagem 4D ( 4D v19.8)