Neste caso, o subformulário pode mostrar os dados do subregistro atual ou qualquer tipo de valor pertinente em função do contexto (variáveis, imagens, etc.). Uma das principais vantagens de se usar subformulários página é que incluem funcionalidades avançadas e podem interatuar diretamente com o formulário pai (widgets). Os subformulários página têm suas próprias propriedades e eventos específicos, os quais podem ser admiistrados por programação.
Nota: é possível gerar componentes com funcionalidades adicionais através de subformulários. Para mais informações, consulte Desenvolver e instalar componentes 4D.
Para ativar o modo página, simplesmente deselecione Subformulário lista na Lista de propriedades para o objeto subformulário. Neste caso, as propriedades relativas a configuração dos subformulários em lista (Modo de seleção, Clique duplo em linha, etc.) não são mais mostrados:
O subformulário em página utiliza formulário de entrada designado pela propriedade “formulário detalhado”. Diferente de um subformulário em modo lista, o formulário utilizado pode vir da mesma tabela que o formulário pai. Também é possível utilizar um formulário projeto. Em execução, um subformulário em modo página tem as mesmas características de visualização padrão de um formulário de entrada. Os mecanismos dos formulários de saída (relacionados particularmente com a gestão de marcadores) não são ativados.
Uma variável pode estar associadas a um objeto subformulário. Por padrão esta variável não é nomeada, permitindo que seu código acesse usando um ponteiro obtido com o comando OBJECT Get pointer (ver no manual de Language Reference ).
A variável tem um tipo (ver o próximo parágrafo) e pode ser representado como uma variável padrão no formulário pai. Sua modificação dispara os eventos de formulário e permite sincronizar os valores do formulário pai e do subformulário:
O evento formulário On Data Change permite indicar ao contenedor do subformulário que o valor da variável foi modificada no subformulário.
O evento formulário On bound variable change indica ao subformulário (método formulário do formulário) que a variável foi modificada no formulário pai.
Utilize esta propriedade para definir o tipo da variável associada ao objeto subformulário. Por padrão, se utiliza o tipo Alfa. O tipo da variável determina a natureza dos valores trocados entre o formulário pai e o subformulário através da variável associada.
Como padrão, o tipo é "Nenhum". Se manter esse tipo, precisa digitar explicitamente usando o código para que o banco de dados funcione em modo compilado ( e neste caso, 4D digita automaticamente a variável durante a execução (ver " em manual Linguagem).
Se selecionar o tipo Objeto (com um nome de variável especificado), poderá obter ou estabelecer as propriedades desse objeto de dentrodo contexto de subformulário usando o comando Form (ver [#title id="572" anchor="3539746"/] abaixo).
Esta propriedade permite selecionar diferentes tipos de fontes:
<Nenhum>: selecione este tipo de fonte se deseja utilizar um formulário projeto ou um formulário de componente como subformulário. Estes subformulários se utilizam em modo página unicamente: a opção "Subformulário lista" debe ser desmarcado para que funcionem. Para que um formulário de componente apareça na lista "formulário detalhado" deve ter sido publicado no componente (ver o parágrafo Publicar um subformulário (component)).
Nome de tabela: escolha esse tipo tipo de fonte se deseja utilizar um formulário da tabela.
Um objeto subformulário pode ter um método objeto que permita controlar seu funcionamento, em particular, quando se desencadeiam os eventos. Para obter uma descrição dos eventos administrados pelo subformulário em página, consulte a documentação do comando Form event code.
Lembre que a interação entre o conteúdo do objeto subformulário e o formulário pai deve ser manejada através de mecanismos específicos (ver o parágrafo Programação avançada entre formulários).
A variável associada ao subformulário permite vincular os dois contextos (formulário e subformulário) para dar os toques finais a interfaces sofisticadas. Por exemplo, imagine um subformulário que representa un relógio dinâmico, inserido em um formulário pai que contém uma variável editável de tipo hora:
Ambos objetos (variável hora e contenedor do subformulário) têm o mesmo nome de variável. Neste caso, ao abrir o formulário pai, 4D sincroniza ambos os valores de forma automática. Se o valor da variável se define em vários lugares, 4D utiliza o valor que foi carregado por último. Se aplica a seguinte ordem de carga: 1-Métodos objeto do subformulário 2-Método formulário do subformulário 3-Métodos objeto do formulário pai 4-Método formulário del formulário pai
Quando se executa o formulário pai, a sincronização das variáveis deve ser efetuada pelo desenvolvedor utilizando os eventos formulário adequados. Dois tipos de interações podem ocorrer: do formulário ao subformulário e vice-versa.
Caso 1: O valor da variável do formulário pai se modifica e esta modificação deve repercutir no subformulário. Em nosso exemplo, a hora ParisTime passa a 12:15:00, seja porque o usuário introduziu esta hora ou porque foi atualizada dinamicamente (através do comando Current time por exemplo).
Neste caso, deve utilizar o evento formulário On bound variable change. Este evento deve ser selecionado nas propriedades do subformulário, se gera no método de formulário dol subformulário.
Se gera evento de formulário On bound variable change:
Tão logo quanto se atribua um valor à variável do formulário pai, mesmo se o mesmo valor é reatribuído,
Se o subformulário pertence à página de formulário atual ou à página 0.
Lembre que, como no exemplo anterior, é preferível utilizar o comando [#cmd id="1124"/] que devolve um ponteiro ao contenedor subformulário ao invés de sua variável, já que é possível inserir vários subformulários no mesmo formulário pai (por exemplo, uma janela que mostra diferentes zonas horárias tem vários relógios). Neste caso, só um ponteiro permite saber que contenedor de subformulário está na origen do evento.
Caso 2: O conteúdo do subformulário é modificado e esta modificação deve ser passada no formulário pai. Em nosso exemplo, imagine que a interface do subformulário permite ao usuário mover "manualmente" os ponteiros do relógio.
Neste caso, desde o subformulário, deve atribuir o valor do objeto à variável do contenedor do subformulário pai. Como no exemplo anterior, recomendamos que utilize o comando OBJECT Get pointer com o seletor Object subform container que devolve um ponteiro ao contenedor do subformulário.
Atribuir o valor da variável gera o evento formulário On Data Change no método do objeto contenedor do subformulário pai, o que permite realizar qualquier tipo de ação. O evento deve ser selecionado nas propriedades do contenedor de subformulário.
Nota: se mover "manualmente" os ponteiros do relógio, isso também gera o evento formulário On Data Change no método do objeto da variável valorReloj no subformulário.
4D automaticamente associa um objeto a cada subformulário ([#cmd id="1216"/). Os conteúdos desse objeto podem ser lidos ou modificados de dentro do contexto do subformulário, permitindo que comparta valores em um contexto local.
O objeto pode ser criado automaticamente ou ser a variável container pai, se explicitamente nomeada e tipificada como Objeto (ver abaixo). Em qualquer caso, o objeto é retornado pelo comando Form, que pode chamar diretamente o subformulário (usar um ponteiro não ajuda). Já que objetos são sempre passados por referência, se os usuários modificarem um valor de propriedade no subformulário, será automaticamente salvado no objeto.
Por exemplo, em seu subformulário, etiquetas de campo estão armazenadas no objeto associado de modo que possa exibir diferentes linguagens:
Pode modificar as etiquetas de seu subformulário atribuindo valores ao objeto InvoiceAddress:
C_OBJECT($lang) $lang:=New object If(<>lang="fr") $lang.CompanyName:="Société :" $lang.LastName:="Nom :" Else $lang.CompanyName:="Company:" $lang.LastName:="Name:" End if
InvoiceAddress.Label:=$lang
Para saber mais, veja a descrição do comando Form.
A comunicação entre o formulário pai e as instâncias dos subformulários pode necessitar mais do que o intercâmbio de um valor através da variável associada. Na verdade, é possível que deseje atualizar as variáveis nos subformulários em função das ações efetuadas no formulário pai e vice-versa. Se usarmos o exemplo anterior do subformulário de tipo "relógio dinâmico", poderíamos querer definir uma ou mais horas de alarme para cada relógio.
4D implementou os seguintes mecanismos para responder a estas necessidades:
Uso do parâmetro "subformulário" com o comando OBJECT Get name para especificar o objeto de subformulário e o comando OBJECT Get pointer.
Chamada do objeto contenedor desde o subformulário utilizando o comando CALL SUBFORM CONTAINER,
Além do seletor Object subform container, o comando OBJECT Get pointer aceita um parâmetro que indica em qual subformulário buscar o objeto cujo nome é especificado no segundo parâmetro. Esta sintaxe só pode ser utilizada quando se passa o seletor Object named.
... recupera um ponteiro à variável "MeuBotao" que se encontra no objeto subformulário "MeuSubForm". Esta sintaxe permite acessar desde o formulário pai a todo objeto que se encontra num subformulário. Também considere o comando OBJECT Get name que permite recuperar o nome do objeto que tem o foco.
O comando CALL SUBFORM CONTAINER permite a uma instância de subformulário enviar um evento ao objeto contenedor do subformulário, o qual pode ser processado no contexto do formulário pai. O evento é recibido no método do objeto contenedor. Pode estar na origem de qualquer evento detectado pelo subformulário (clique, arrastar e soltar, etc.)
O código do evento é livre (por exemplo, 20 000 ou -100). Pode utilizar um código que corresponde a um evento existente (por exemplo, 3 para On Validate) ou utilizar um código personalizado. No primeiro caso, só se pode utilizar os eventos que foram selecionados na lista de propriedades para os contenedores de subformulário. No segundo caso, o código não deve corresponder a qualquer evento formulário existente. É recomendado usar um valor negativo para ter certeza de que este código não será utilizado por 4D en futuras versões.
O comando EXECUTE METHOD IN SUBFORM permite a un formulário ou a um de seus objetos solicitar a execução de um método no contexto da instância do subformulário, o que lhe dá acesso às variáveis, objetos, etc. del subfformulário. Este método também pode receber parâmetros.