4D v16.3DRAG AND DROP PROPERTIES |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
DRAG AND DROP PROPERTIES
|
DRAG AND DROP PROPERTIES ( srcObjeto ; srcElemento ; srcProcesso ) | ||||||||
Parâmetro | Tipo | Descrição | ||||||
srcObjeto | Ponteiro |
![]() |
Ponteiro para o objeto fonte de arrastar e soltar | |||||
srcElemento | Inteiro longo |
![]() |
Número do elemento do array arrastado ou Número da fila da list box arrastada ou Elemento da lista hierárquica arrastada ou -1 se o objeto arrastado não é um elemento de array nem do list box nem da lista hierárquica | |||||
srcProcesso | Inteiro longo |
![]() |
Número de processo fonte | |||||
O comando DRAG AND DROP PROPERTIES permite obter informação sobre o objeto fonte quando um evento On Drag Over ou On Drop ocorre para um objeto “complexo” (array, list box ou lista hierárquica).
Geralmente, é utilizado DRAG AND DROP PROPERTIES desde dentro do método de objeto do objeto (ou desde uma das subrotinas que chama) para o qual o evento On Drag Over ou On Drop ocorre (o objeto de destino).
Importante: os dados podem ser soltados em um objeto de formulário se a propriedade Soltável for selecionada. Igualmente, seu método de objeto deve ser ativado por On Drag Over ou On Drop, para processar estes eventos.
Depois da chamada:
Se chama a DRAG AND DROP PROPERTIES quando não há nenhum evento arrastar e soltar, srcObjeto retorna um ponteiro NIL, srcElemento retorna -1 e srcProcesso retorna 0.
Conselho: 4D administra automaticamente o aspecto gráfico de arrastar e soltar. Então você deve responder ao evento de maneira apropriada. Nos seguintes exemplos, a resposta é copiar os dados que foram arrastados. De maneira alternativa, pode implementar interfaces de usuário sofisticadas onde, por exemplo, arrastar e soltar um elemento de array de uma janela flutuante faz com que a janela de destino seja preenchida (a janela onde o objeto de destino está localizado) com dados estruturados (como vários campos que originam de um registro único identificado pelo elemento de array fonte).
Se utilizar DRAG AND DROP PROPERTIES durante um evento On Drag Over para decidir se o objeto de destino aceita a operação arrastar e soltar, dependendo do tipo ou a natureza do objeto fonte (ou de qualquer outra razão). Se aceitar arrastar e soltar, o método de objeto deve devolver $0:=0. Se não aceita arrastar e soltar, o método de objeto deve devolver $0:=-1. A aceitação ou recusa de arrastar e soltar é refletida na tela, o objeto é ressaltado ou não como destino potencial da operação arrastar soltar.
Em vários dos formulários de seu banco, há áreas de rolagem onde você pode querer reordenar manualmente os elementos simplesmente arrastando-os e soltando-os ao interior de cada área. Ao invés de escrever código específico para cada caso, pode implementar um método de projeto genérico que maneje todas as áreas de rolagem. Pode escrever um código como este:
` Método de projeto Manejo arrastar e soltar interno em um array
` Manejo arrastar e soltar interno em um array ( Ponteiro ) -> Booleano
` Manejo arrastar e soltar interno em um array ( -> Array ) -> É um arrastar e soltar interno em um array
Case of
:(Form event=On Drag Over)
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
If($vpSrcObj=$1)
` Aceitar arrastar e soltar se é interno do array
$0:=0
Else
$0:=-1
End if
:(Form event=On Drop)
` Obter a informação sobre o objeto fonte de arrastar e soltar
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
` Obter o número do elemento de destino
$vlDstElem:=Drop position
` Se o elemento não foi soltado sobre si mesmo
If($vlDstElem #$vlSrcElem)
` Guardar o elemento arrastado no elemento 0 do array
$1->{0}:=$1->{$vlSrcElem}
` Apagar o elemento arrastado
DELETE FROM ARRAY($1->;$vlSrcElem)
` Se o elemento de destino estava mais além do elemento arrastado
If($vlDstElem>$vlSrcElem)
` Decremento do número do elemento de destino
$vlDstElem:=$vlDstElem-1
End if
` Se arrastar e soltar ocorre mais além do último elemento
If($vlDstElem=-1)
` Definir o número do elemento de destino para um novo elemento ao final do array $vlDstElem:=Size of array($1->)+1
End if
` Inserir este novo elemento
INSERT IN ARRAY($1->;$vlDstElem)
` Fixar seu valor o qual foi armazenado previamente no elemento zero do array
$1->{$vlDstElem}:=$1->{0}
` O elemento é convertido no novo elemento selecionado do array
$1->:=$vlDstElem
End if End case
Quando tiver implementado este método de projeto, pode utilizá-lo da seguinte forma:
` Método de objeto da área de rolagem anArray
Case of
`...
:(Form event=On Drag Over)
$0:=Manejo arrastar e soltar interno em um array(Self)
:(Form event=On Drop)
Manejo arrastar e soltar interno em um array(Self)
` ...
End case
Em vários dos formulários de seu banco, tem áreas de texto editáveis nas quais pode desejar arrastar e soltar dados de várias fontes. Ao invés de escrever código específico para cada caso, pode implementar um método de projeto genérico que maneje todas as áreas de texto editáveis. Pode escrever o método seguinte:
` Método de projeto Tratamento de soltar em variável Texto
` Tratamento de soltar em variável Texto ( Ponteiro )
` Tratamento de soltar em variável Texto ( -> variável texto ou string)
Case of
` Uso deste evento para aceitar ou recusar o arrastar e soltar
:(Form event=On Drag Over)
` Inicializar $0 para recusar
$0:=-1
` Obter a informação sobre o objeto fonte de arrastar e soltar
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
` Neste exemplo, não permitimos arrastar e soltar desde um objeto até si mesmo
If($vpSrcObj # $1)
` Obter o tipo dos dados arrastados
$vlSrcType:=Type($vpSrcObj->)
Case of
:($vlSrcType=Is text)
` OK para as variáveis texto
$0:=0
:($vlSrcType=Is string var)
` OK para as variáveis string
$0:=0
:(($vlSrcType=String array) | ($vlSrcType=Text array))
` Ok para os arrays string e texto
$0:=0
:(($vlSrcType=Is longint) | ($vlSrcType=Is real)
If(Is a list($vpSrcObj->))
` OK para as listas hierárquicas
$0:=0
End if
End case
End if
` Uso de este evento para efetuar realmente a ação de arrastar e soltar
:(Form event=On Drop)
$vtDraggedData:=""
` Obter a informação sobre o objeto fonte de arrastar e soltar
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
` Obter o tipo dos dados arrastados
$vlSrcType:=Type($vpSrcObj->)
Case of
` Se é um array
:(($vlSrcType=String array) | ($vlSrcType=Text array))
If($vlPID # Current process)
` Ler o elemento desde a instância da variável no processo fonte
GET PROCESS VARIABLE($vlPID;$vpSrcObj->{$vlSrcElem};$vtDraggedData)
Else
` Copiar o elemento do array
$vtDraggedData:=$vpSrcObj->{$vlSrcElem}
End if
` Se for uma lista
:(($vlSrcType=Is real) | ($vlSrcType=Is longint))
` Se for uma lista de outro processo
If($vlPID # Current process)
`Obter a referência da lista no outro processo
GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vlList)
Else
$vlList:=$vpSrcObj->
End if
` Se a lista existir
If(Is a list($vpSrcObj->))
`Obter o texto do elemento cuja posição foi obtida
GET LIST ITEM($vlList;$vlSrcElem;$vlItemRef;$vsItemText)
$vtDraggedData:=$vsItemText
End if
Else
` É uma variável string ou texto
If($vlPID # Current process)
GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vtDraggedData)
Else
$vtDraggedData:=$vpSrcObj->
End if
End case
` Se houver algo realmente para soltar(o objeto fonte pode estar vazio)
If($vtDraggedData # "")
$1->:=$1->+$vtDraggedData
End if
End case
Quando tiver implementado este método de projeto, pode utilizá-lo desta forma:
` Método de objeto do campo de texto [anyTable]aTextField
Case of
` ...
:(Form event=On Drag Over)
$0:=Handle dropping to text area(Self)
:(Form event=On Drop)
Handle dropping to text area(Self)
` ...
End case
Se quisermos preencher uma área de texto (por exemplo, uma etiqueta) com os dados arrastados de uma list box.
Este é o método de objeto de etiqueta1:
Case of
:(Form event=On Drag Over)
DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
If($source=Get pointer("listbox1"))
$0:=0   `Se aceita soltar
Else
$0:=-1   `Se recusa arrastar
End if
:(Form event=On Drop)
DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
QUERY([Empregados1];[Empregados1]Sobrenome=arrSobrenomes{$arrayrow})
If(Records in selection([Empregados1])#0)
etiqueta1:=[Empregados1]Nome+" "+[Empregados1]Sobrenome+Char(Carriage return)+[Empregados1]Direção+Char(Carriage return)+[Empregados1]Cidade+","+" "+[Empregados1]Departamento+" "+[Empregados1]Codigopostal
End if
End case
Depois é possível realizar a seguinte ação:
Arrastar e Soltar
Drop position
Form event
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER
Produto: 4D
Tema: Arrastar e Soltar
Número
607
Modificado: 4D 2004.2
Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)