Desenvolvimento - C/C++

Drag and drop no Cpp Builder - parte 6

O sistema de drag and drop do C++ Builder é muito fácil de usar, integrado que está com o sistema de classes e objetos do framework.

por Wanderley Caloni Jr



O sistema de drag and drop do C++ Builder é muito fácil de usar, integrado que está com o sistema de classes e objetos do framework. Tanto para o objeto de drag quanto para o objeto de drop tudo que temos que fazer é definirmos a propriedade DragMode para dmAutomatic como mostra a figura. Isso fará com que toda a troca de mensagens seja manipulada automaticamente pela VCL.

A parte (ridídula) do código fica por conta da manipulação do evento de drop. Para aceitar um objeto, devemos tratar o evento OnDragOver. Basta isso para que a variável Accept tenha seu valor default definido para true. Podemos, entretanto, escolher se iremos ou não tratar um possível drop de um objeto. Verificando seu tipo, por exemplo:

void __fastcall TMain::ListBoxDragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{
   if( TListBox* listBox = dynamic_cast<TListBox*>(Sender) )
   {
      TWinControl* winCtrl = static_cast<TWinControl*>(Source);

      if( listBox!= winCtrl )
      {
         listBox->Items->Add(winCtrl->Name);
         winCtrl->Visible = false;
      }
   }
}


void __fastcall TMain::FormDragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{
   if( TForm* form = dynamic_cast<TForm*>(Sender) )
   {
      TControl* ctrl = 0;

      if( TListBox* listBox = dynamic_cast<TListBox*>( Source ) )
      {
         for( int i = 0; i < listBox->Count; ++i )
         {
            if( listBox->Selected[i] )
            {
               ctrl = this->FindChildControl(listBox->Items->Strings[i]);
               listBox->Items->Delete(i);
               break;
            }
         }
      }
      else

         ctrl = dynamic_cast<TControl*>(Source);

      if( ctrl )
      {
         ctrl->Top = Y;
         ctrl->Left = X;
         ctrl->Visible = true;
      }
   }
}

E mais uma vez voilà! Pouquíssimas linhas de código e um movimentador e empilhador de controles. Dois detalhes merecem serem destacados:

  • O uso de dynamic_cast em cima dos ponteiros da VCL é uma maneira saudável de checar a integridade dos tipos recebidos - particularmente do Sender. O uso do primeiro parâmetro dos tratadores de eventos também torna o código menos preso à componentes específicos do formulário;
  • O método FindChildControl é deveras útil quando não temos certeza da existência de um controle. Geralmente é uma boa idéia confiar no sistema de gerenciamento de componentes da VCL. Não é à toa que existe um framework por baixo do ambiente RAD.

Artigo original retirado de "Drag and drop no C++ Builder", por Wanderley Caloni.

Wanderley Caloni Jr

Wanderley Caloni Jr