4D v16.3

DRAG AND DROP PROPERTIES

Página Inicial

 
4D v16.3
DRAG AND DROP PROPERTIES

DRAG AND DROP PROPERTIES 


 

DRAG AND DROP PROPERTIES ( srcObjeto ; srcElemento ; srcProcesso ) 
Parâmetro Tipo   Descrição
srcObjeto  Ponteiro in Ponteiro para o objeto fonte de arrastar e soltar
srcElemento  Inteiro longo in 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 in 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:

  • O parâmetro srcObjeto é um ponteiro até o objeto fonte (o objeto que foi arrastado e soltado). Note que este objeto pode ser o objeto de destino (o objeto para o qual o evento On Drag Over ou On Drop ocorre) ou um objeto diferente. Arrastar e soltar dados desde e até o mesmo objeto é útil nos arrays e listas hierárquicas, é uma maneira simples de permitir ao usuário ordenar um array ou uma lista manualmente.
  • Se os dados arrastados e soltados são um elemento de um array (sendo o objeto fonte um array), o parâmetro srcElemento retorna o número deste elemento. Se os dados arrastados e soltados são uma fila de um list box, o parâmetro srcElemento retorna o número desta fila. Se os dados arrastados e soltados são um elemento de lista (sendo o objeto fonte uma lista hierárquica), o parâmetro srcElemento retorna a posição deste elemento. Do contrário, se o objeto fonte não pertencer a nenhuma destas categorias, srcElemento é igual a -1.
  • As operações arrastar e soltar podem ocorrer entre processos. O parâmetro srcProcesso é igual ao número do processo ao qual pertence o objeto fonte. É importante provar o valor deste parâmetro. Pode responder a um arrastar e soltar dentro do mesmo processo simplesmente copiando os dados fonte no objeto de destino. Por outra parte, quando estiver tratando um arrastar e soltar interprocesso, deve utilizar o comando GET PROCESS VARIABLE para obter os dados fonte a partir da instância do objeto do processo fonte. Geralmente, o arrastar e soltar em uma interface usuário é efetuada desde as variáveis (arrays e listas) até as áreas de entrada de dados (campos ou variáveis). 
Nota de compatibilidade: a partir da versão 11 de 4D, é recomendado administrar as operações de arrastar e soltar, especialmente interprocesso, com a ajuda do evento On Begin Drag Over e dos comandos do tema Área de Transferência (Pasteboard).

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 &NBSP`Se aceita soltar
       Else
          $0:=-1 &NBSP`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:



Ver também 

Arrastar e Soltar
Drop position
Form event
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER

 
PROPRIEDADES 

Produto: 4D
Tema: Arrastar e Soltar
Número 607

 
HISTÓRIA 

Modificado: 4D 2004.2

 
ARTICLE USAGE

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)