Saltar para o conteúdo principal
Versão: 20 R5 BETA

Uma visita rápida

Usando a linguagem 4D, imprimir a mensagem tradicional ""Hello, world!" na tela pode ser feito de várias maneiras. A maneira mais simples é provavelmente escrever a linha única abaixo em um método de projeto:

ALERT("Hello, World!")

Esse código vai exibir um alerta normal de plataforma com a mensagem "hello world" contendo um botão OK. Para executar o código, precisa clicar no botão de execução do editor de Método:

hello-world

Ou poderia anexar esse código a um botão em um formulário e executar o formulário, nesse caso, clicar no botão exibira a caixa de diálogo de alerta. Em qualquer caso, acabou de executar sua primeira linha de código 4D!

Atribuir valores

Dados podem ser colocado ou copiados de ou em variáveis, campos, elementos arrays... Colocar dados em uma variável é chamado atribuiindo os dados a uma variável e é feito com o operador de atribuição (:=). O operador de atribuição também é usado para atribuir dados para elementos campos ou arrays.

$MyNumber:=3 //assigns 3 to MyNumber variable  
[Products]Size:=$MyNumber //assigns MyNumber variable to [Products]Size field
arrDays{2}:="Tuesday" //assigns "Tuesday" string to the 2nd arrDays element
MyVar:=Length("Acme") //assigns the result of the function (4) to MyVar
$myDate:=!2018/01/21! //assigns a date literal
$myHour:=?08:12:55? //assigns a time literal

Você DEVE diferenciar o operador atribuição := dos outros operadores. Ao invés de combinar expressões a uma nova, o operador de atribuição copia o valor da expressão para a direita do operador de atribuição para a variável ou campo para a esquerda do operador.

Importante: no confunda el operador de asignación (:=) con el signo igual (=). Um operador de atribuição diferente (e não =) foi escolhido deliberadamente para evitar problemas e confusão que ocorrem frequentemente em outras linguagens com operadores como == ou ===. Esses erros são geralmente difíceis de reconhecer pelo compilador e geram problemas trabalhosos.

Variáveis.

A linguagem 4D é baseada em tipos, mas com alguma flexibilidade. Por ejemplo, para crear una variable de tipo fecha, puede escribir: Por exemplo, para criar uma variável do tipo dados, pode escrever:

var MyDate : Date

La palabra clave var permite declarar variables objeto de un tipo de clase definido, por ejemplo:

var myPerson : cs.Person
//variable of the Person user class

Mesmo geralmente não sendo recomendado, é possível criar variáveis simplesmente usando-as; não precisa defini-las formalmente como se faz com campos. Por exemplo, se quiser criar uma variável que contenha a data atual mais 30 dias, pode escrever:

MyOtherDate:=Current date+30

A linha de código lê “MyOtherDate gets the current date plus 30 days.” Essa linha cria a variável e a atribuiu com o tipo de data (temporário) e um conteúdo. Uma variável criada por atribuição é interpretada como sem tipo, ou seja, pode ser atribuída com outros tipos em outras linhas e então muda o tipo dinamicamente. Una variable digitada con var no puede cambiar de tipo. Sin embargo, en modo compilado, el tipo nunca puede cambiarse, independientemente de cómo se haya declarado la variable.

Comandos

Os comandos 4D são métodos integrados para realizar uma ação. Comandos são frequentemente usados com parâmetros, que são passados em parênteses () e separados por ponto e vírgula (;). Exemplo:

COPY DOCUMENT("folder1\\name1";"folder2\\" ; "new")

Alguns comandos são anexados à coleções ou objetos, em cujo caso são métodos temporais que se utilizam com a notação de pontos. Por exemplo:

$c:=New collection(1;2;3;4;5)
$nc:=$c.slice(0;3) //$nc=[1,2,3]

$lastEmployee:=$employee.last()

Pode utilizar os plug-ins ou os componentes 4D que adicionem novos comandos a seu entorno de desenvolvimento 4D.

Há vários plug-ins propostos pela comunidade de usuários 4D ou desenvolvedores de terceira parte no mercado. Por ejemplo, utilizando el 4d-plugin-pdf-pages en macOS:

PDF REMOVE PAGE(path;page)

4D SVG é um exemplo de componente utilitário que aumenta as capacidades de sua aplicação:

//desenhar uma imagem
svgRef:=SVG_New
objectRef:=SVG_New_arc(svgRef;100;100;90;90;180)

4D SVG é incluído em 4D.

Constantes

4D oferece um conjunto extensivo de constantes predefinidas, cujos valores são acessíveis por nome. Isso permite escrever código mais legível. Por ejemplo, Read Mode es una constante (valor 2).

vRef:=Open document("PassFile";"TEXT";Read Mode) // abre documento em modo apenas leitura

As constantes pré-definidas aparecem sublinhadas como padrão no editor de métodos 4D.

Página Métodos

4D ofrece un gran número de métodos (o comandos) integrados, pero también le permite crear sus propios métodos de proyecto. Os métodos de projeto são métodos definidos pelo usuário que contenham comandos, operadores e outras partes da linguaje. Los métodos projeto são métodos genéricos, mas há outros tipos de métodos: métodos objeto, métodos formulário, métodos tabela (Triggers) e métodos base.

Um método projeto é composto de várias linhas de instruções, cada uma das quais consta de uma linha no método. Uma linha de instrução realiza uma ação e pode ser simples ou complexa.

Por exemplo, a linha abaixo é uma declaração que mostará uma caixa de diálogo de confirmação:

CONFIRM("Quer realmente fechar esta conta?"; "Sím"; "Não")

Um método também contém testes e loops que controlam o fluxo da execução. 4D methods support If...Else...End if and Case of... Else...End case branching structures as well as looping structures: While...End while, Repeat...Until, For...End for, and For each... End for each:

O exemplo abaixo recorre todos os caracteres do texto vtSomeText:

For($vlChar;1;Length(vtSomeText))
//Do something with the character if it is a TAB


If(Character code(vtSomeText[[$vlChar]])=Tab)
//...
End if
End for

Um método projeto pode chamar a outro método projeto com ou sem parâmetros (argumentos). Os parâmetros se passam ao método entre parêntesis, depois do nome do método. Cada parâmetro está separado do próximo por um ponto e vírgula (;). A method can return a single value in a parameter, which have to be declared. Os parâmetros estão disponíveis dentro do método chamado como variáveis locais numeradas sequencialmente: $1, $2,..., $n. Um método pode devolver um único valor no parâmetro $0. Quando chamar um método, apenas digite seu nome:

$myText:="hello"
$myText:=Hacer_algo($myText) //Llamar al método Do_Something
ALERT($myText) //"HELLO"

//Aquí el código del método Do_Something
#DECLARE ($in : Text) -> $out : Text
$out:=Uppercase($in)

Tipos de dados

Na linguagem, os diferentes tipos de dados que podem ser manejados são denominados tipos de dados. Existem tipos de dados básicos (string, numérico, data, hora, booleano, imagem, ponteiros, arrays), e também tipos de dados compostos (BLOBs, objetos, coleções).

Lembre que os dados de tipo string e numérico podem ser associados a mais de um tipo de campo. Quando são introduzidos dados em um campo, a linguagem converte automaticamente os dados no tipo correto para o campo. Por exemplo, se um campo inteiro for usado, seus dados são tratados automaticamente como numéricos. Em outras palavras não precisa se preocupar sobre misturar tipos de campos similares quando usando a linguagem; vai ser gerenciada por você.

Entretanto, quando usar a linguagem é importante que não misture diferentes tipos de dados. Da mesma forma que não tem sentido armazenar "ABC" em um campo de data, tampouco tem sentido por "ABC" em uma variável utilizada para datas. Na maioria dos casos, 4D é muito tolerante e tentará dar sentido ao que está fazendo. Por exemplo, se adicionar um número a uma data, 4D assumirá que quer adicionar esse número de dias à data, mas se tentar adicionar uma string a uma data, 4D dir-lhe-á que a operação não pode funcionar.

Há casos em que é necessário armazenar dados como um tipo e utilizá-los como outro tipo. A linguagem contém um conjunto completo de comandos que permitem a conversão de um tipo de dados para outro. Por exemplo, pode ser necessário criar um número de peça que comece com um número e termine com caracteres como "abc". Neste caso, poderá escrever:

[Products]Part Number:=String(Number)+"abc"

If Number is 17, then [Products]Part Number will get the string “17abc”.

Los tipos de datos están completamente definidos en la sección Tipos de datos.

Objectos e colecções

Pode manipular objectos e colecções da linguagem 4D utilizando a notação de objeto para obter ou definir os seus valores. Por exemplo:

employee.name:="Smith"

Também pode utilizar uma cadeia de caracteres entre parênteses rectos, por exemplo:

$vName:=employee["name"]

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

Note-se que se o valor da propriedade do objeto for um objeto que encapsula um método (uma fórmula), é necessário adicionar parênteses () ao nome da propriedade para executar o método:

$f:=New object
$f.message:=Formula(ALERT("Hello world!"))
$f.message() //displays "Hello world!"

Para aceder a um elemento da collection, é necessário passar o número do elemento entre parênteses rectos:

C_COLLECTION(myColl)
myColl:=New collection("A";"B";1;2;Current time)
myColl[3] //acesso ao 4º elemento da colecção

Classes

A linguagem 4D suporta classes de objectos. Añade un archivo myClass.4dm en la carpeta Project/Sources/Classes de un proyecto para crear una clase llamada "myClass".

Para instanciar un objeto de la clase en un método, llame la clase usuario desde el class store (cs) y utilice la función miembro new(). É possível passar parâmetros.

// num método 4D
$o:=cs.myClass.new()

En el método clase myClass, utilice la instrucción Function<methodName> para definir la función miembro clase methodName. Una función miembro de clase puede recibir y devolver parámetros como todo método, y utilizar This como instancia del objeto.


//in the myClass.4dm file
Function hello -> $welcome : Text
$welcome:="Hello "+This.who

Para ejecutar una función miembro de clase, basta con utilizar el operador () en la función miembro de la instancia del objeto.

$f:=New object
$f.message:=New formula(ALERT("Hello world!"))
$f.message() //displays "Hello world!"

Opcionalmente, utilice la palabra clave Class constructor para declarar las propiedades del objeto.

//in the Rectangle.4dm file
Class constructor ($width : Integer; $height : Integer)
This.height:=$height
This.width:=$width
This.name:="Rectangle"

Una clase puede extender otra clase utilizando Class extends <ClassName>. Las superclasses se pueden llamar con el comando Super. Por exemplo:

//in the Square.4dm file Class extends rectangle Class constructor($length : Integer)

// It calls the parent class's constructor with lengths
// provided for the Rectangle's width and height Super($length;$length) This.name:="Square"

Operadores

Quando se utiliza a linguagem, é raro que se pretenda apenas um dado. É mais provável que queira fazer algo com esses dados ou a partir deles. Estes cálculos são efectuados com operadores. Os operadores, em geral, pegam em dois dados e efetuam uma operação sobre eles que resulta num novo dado. Já está familiarizado com muitos operadores. You are already familiar with many operators. You are already familiar with many operators.

OperadorOperaçãoExemplo
-Adição1 +2 = 3
Subtração3 - 2 = 1
*Multiplicação2 * 3 = 6
/Divisão6 / 2 = 3

Os operadores numéricos são apenas um dos tipos de operadores disponíveis. 4D suporta muitos tipos de dados, tais como números, texto, datas e imagens, por isso há operadores que realizam operações nestes diferentes tipos de dados.

Os mesmos símbolos são frequentemente utilizados para operações diferentes, consoante o tipo de dados. Por exemplo, o sinal de mais (+) efetua operações diferentes com dados diferentes:

Tipo de dadosOperaçãoExemplo
NumberAdição1 + 2 adiciona os números e resultados em 3
StringConcatenação"Hello " + "there" concatena (junta) as cadeias de caracteres e resulta em "Hello there"
Data e NúmeroAdição de data!1989-01-01! + 20 acrescenta 20 dias à data de 1 de janeiro de 1989 e resulta na data de 21 de janeiro de 1989

Expressões

Em termos simples, as expressões retornam um valor. De facto, quando se usa a linguagem 4D, usa-se expressões a toda a hora e tende-se a pensar nelas apenas em termos do valor que representam. As expressões também são conhecidas como fórmulas.

As expressões são compostas por quase todas as outras partes da linguagem: comandos, operadores, variáveis, campos, propriedades de objetos e elementos de coleções. Utiliza expressões para escrever linhas de código, que por sua vez são utilizadas para construir os métodos. A linguagem utiliza expressões sempre que necessita de um dado.

As expressões raramente são "autónomas." Há vários sítios em 4D onde uma expressão pode ser usada por si só. Inclui:

  • Editor de fórmulas (apply formula, query with formula, order by formula)
  • El comando EXECUTE FORMULA
  • A lista de propriedades, onde uma expressão pode ser usada como fonte de dados para a maioria dos widgets
  • Depurador onde o valor das expressões pode ser verificado
  • Editor de relatórios rápidos como uma fórmula para uma coluna

Tipos de expressões

Refere-se a uma expressão pelo tipo de dados que devolve. Existem vários tipos de expressão. A tabela seguinte apresenta exemplos de cada tipo de expressão.

ExpressionTipoDescrição
“Hello”StringA palavra Hello é uma constante cadeia de caracteres, indicada pelas aspas duplas.
“Hello ” + “there”StringDuas cadeias, "Hello " e "there", são adicionadas (concatenadas) com o operador de concatenação de cadeias (+). É devolvida a cadeia de caracteres "Hello there".
“Sr. ” + [People]NameStringSão concatenadas duas cadeias: a cadeia "Mr. " e o valor atual do campo Name na tabela People. Se o campo contiver "Smith", a expressão devolve "Mr. Smith".
Uppercase("smith")StringEsta expresión utiliza Uppercase, un comando del lenguaje, para convertir la cadena "smith" a mayúsculas. Retorna "SMITH".
4NumberEsta é uma constante numérica, 4.
4 * 2NumberDois números, 4 e 2, são multiplicados utilizando o operador de multiplicação (*). O resultado é o número 8.
myButtonNumberEsta é uma variável associada a um botão. Devolve o valor atual do botão: 1 se foi clicado, 0 se não foi.
!1997-01-25!DateEsta é uma constante data para a data 1/25/97 (25 de janeiro de 1997).
Current date+ 30DateEsta es una expresión de tipo Fecha que utiliza el comando Current date para obtener la fecha de hoy. Adiciona 30 dias à data de hoje e devolve a nova data.
?8:05:30?HoraEsta é uma constante de tempo que representa 8 horas, 5 minutos e 30 segundos.
?2:03:04? + ?1:02:03?HoraEsta expressão soma dois horas e devolve a hora 3:05:07.
TrueParâmetrosEste comando devolve o valor Booleano TRUE.
10 # 20ParâmetrosTrata-se de uma comparação lógica entre dois números. O sinal de número (#) significa "não é igual a". Como 10 "não é igual a" 20, a expressão devolve TRUE.
“ABC” = “XYZ”ParâmetrosTrata-se de uma comparação lógica entre duas cadeias. Não são iguais, pelo que a expressão devolve FALSE.
My Picture + 50ImagemEsta expressão pega na imagem em My Picture, move-a 50 píxeis para a direita e devolve a imagem resultante.
->[People]NamePonteiroEsta expressão devolve um ponteiro ao campo chamado [People]Name.
Table(1)PonteiroEste é um comando que devolve um ponteiro para a primeira tabela.
JSON Parse (MyString)ObjectEste é um comando que devolve MyString como um objeto (se o formato é adequado)
JSON Parse (MyJSONArray)CollectionEste é um comando que devolve MyJSONArray como uma coleção (se o formato é adequado)
Form.pageNumberPropriedade objectoUma propriedade objeto é uma expressão que pode ser de qualquer tipo suportado
Col[5]Elemento de colecçãoUm elemento de coleção é uma expressão que pode ser de qualquer tipo suportado
$entitySel[0]EntityUm elemento de uma seleção de entidade ORDA é uma expressão do tipo entidade. Este tipo de expresión es no asignable

Expressões atribuíveis vs expressões não atribuíveis

Una expresión puede ser simplemente una constante literal, como el número 4 o la cadena "Hello", o una variable como $myButton. Também pode utilizar operadores. Por exemplo, 4 + 2 é uma expressão que utiliza o operador de adição para somar dois números e devolver o resultado 6. En todos los casos, estas expresiones son no asignables, lo que significa que no se les puede asignar un valor. En 4D, las expresiones pueden ser asignables. Uma expressão é atribuível quando pode ser utilizada no lado esquerdo de uma atribuição. Por exemplo:

//$myVar variable is assignable, you can write:  
$myVar:="Hello" //assign "Hello" to myVar
//Form.pageNumber is assignable, you can write: Form.pageNumber:=10 //assign 10 to Form.pageNumber
//Form.pageTotal-Form.pageNumber is not assignable: Form.pageTotal- Form.pageNumber:=10 //error, non-assignable

Em geral, as expressões que utilizam um operador não são atribuíveis. Por ejemplo, [Person]FirstName+" "+[Person]LastName no es asignable.

Ponteiro

A linguagem 4D fornece uma implementação avançada de ponteiros, que permite escrever código poderoso e modular. É possível utilizar ponteiros para referenciar tabelas, campos, variáveis, arrays e elementos de arrays.

Un puntero a un elemento se crea añadiendo un símbolo "->" antes del nombre del elemento, y se puede desreferenciar añadiendo el símbolo "->" después del nombre del puntero.

MyVar:="Hello"
MyPointer:=->MyVar
ALERT(MyPointer->)

Código em várias linhas

Puede escribir una única instrucción en varias líneas terminando cada línea de la instrucción con un caracter barra invertida final \. A linguagem 4D considera todas as linhas de uma só vez. Por exemplo, as duas declarações seguintes são equivalentes:

$str:=String("hello world!")
$str:=String("hello"+\
" world"+\
+"!")

Comentários

Os comentários são linhas de código inactivas. Estas linhas não são interpretadas pela linguagem 4D e não são executadas quando o código é chamado.

Existem duas formas de criar comentários:

  • // para crear una línea de comentario
  • /*...*/ para comentarios em linha ou multilinha.

Ambos os estilos de comentários podem ser utilizados em simultâneo.

Comentarios de una línea (//comentario)

Inserte // al principio de una línea o después de una instrucción para añadir una línea de comentario. Exemplo:

//This is a comment For($vCounter;1;100) //Starting loop
//comment
//comment
//comment
End for

Comentarios en línea o multilínea (/*comment*/)

Surround contents with /* ... */ characters to create inline comments or multiline comment blocks. Tanto los bloques de comentarios en línea como los multilínea comienzan con /* y terminan con */.

  • Las líneas de comentarios en línea se pueden insertar en cualquier parte del código. Exemplo:
For /* inline comment */ ($vCounter;1;100)
...
End for
  • Los bloques de comentarios multilíneas permiten comentar un número ilimitado de líneas. Os blocos de comentários podem ser aninhados (o que é útil, já que o editor de código 4D suporta blocos condensados). Exemplo:
For ($vCounter;1;100)
/*
comments
/*
other comments
*/
*/
...
End for

Sequências de escape

A linguagem 4D permite-lhe usar sequências de escape (também chamadas caracteres de escape). Uma sequência de escape é uma sequência de caracteres que pode ser utilizada para substituir um carácter "especial".

La secuencia consiste en una barra invertida \, seguida de un caracter. Por ejemplo, \t es una secuencia de escape para el caracter Tab. Las secuencias de escape facilitan la introducción de caracteres especiales: el ejemplo anterior (\t) sustituye a la entrada "Caracter(Tab)".

Em 4D, podem ser utilizadas as seguintes sequências de escape:

Escape sequenceCarácter substituído
\nLF (Avanço de linha)
\tHT (Tab)
\rCR (Carriage return)
\\\ (Barra invertida)
\"" (aspas)

É possível utilizar maiúsculas ou minúsculas nas sequências de escape.

En el siguiente ejemplo, el caracter Retorno de carro (secuencia de escape \r) se inserta en una sentencia para obtener un diálogo:

ALERT("The operation has been completed successfully.\rYou may now disconnect.")