TTreeView
2.08.1999
  • Przeciąganie z TTreeView do TListBox.

       W tym przykładzie zajmiemy się "przeciąganiem" z TreeView do ListBox. W konstruktorze do TreeView1 jest przypisywany główny węzeł "Samochody", zawiera on marki samochodów, te zaś zawierają poszczególne modele. ListBox1 jest tak zaprogramowany, że akceptuje wszystkie modele samochodów jeżeli zostały przeciągnięte "Samochody", albo modele danej marki, jeżeli to ona została przeciągnięta. Można również przeciągać poszczególne modele. ListBox1 i TreeView1 mają ustawione właściwość DragMode na dmAutomatic.

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

//Wypełniamy tutaj TreeView1 modelami samochodów...
  TTreeNode *Node1;

  TreeView1->Items->Add(NULL, "Samochody");

  Node1 = TreeView1->Items->Item[0];
  TreeView1->Items->AddChild(Node1,"Audi");
  TreeView1->Items->AddChild(Node1,"BMW");
  TreeView1->Items->AddChild(Node1,"Mazda");

  Node1 = TreeView1->Items->Item[1];

  TreeView1->Items->AddChild(Node1,"A4");
  TreeView1->Items->AddChild(Node1,"A8");
  TreeView1->Items->AddChild(Node1,"TT");

  Node1 = TreeView1->Items->Item[5];

  TreeView1->Items->AddChild(Node1,"320i");
  TreeView1->Items->AddChild(Node1,"524tdi");
  TreeView1->Items->AddChild(Node1,"740i");
  TreeView1->Items->AddChild(Node1,"850");

  Node1 = TreeView1->Items->Item[10];

  TreeView1->Items->AddChild(Node1,"121");
  TreeView1->Items->AddChild(Node1,"323");
  TreeView1->Items->AddChild(Node1,"626");

//ustawiamy DragMode na automatyczny
  TreeView1->DragMode = dmAutomatic;
  ListBox1->DragMode = dmAutomatic;
}
//--------------------------------------------------

void __fastcall TForm1::ListBox1DragDrop(TObject *Sender,
                           TObject *Source, int X, int Y)
{
if (Sender->ClassNameIs("TListBox") &&
             Source->ClassNameIs("TTreeView"))
 {
//=== przeciąganie "Samochodów" (główny węzeł)
   if (TreeView1->Selected->AbsoluteIndex == 0)
    {
     TTreeNode *Node = TreeView1->Items->Item[0]->GetNext();

     while (Node != NULL)
      {
        if (Node->Level == 2)
        ListBox1->Items->Add(Node->Text);
        Node = Node->GetNext();
      }
     }

//=== przeciąganie marki samochodu
if (TreeView1->Selected->Level == 1)
   {
    int count = 0;
    TTreeNode *Node = TreeView1->Selected->GetNext();

     while (Node != NULL && Node->HasChildren == false)
     {
       ListBox1->Items->Add(Node->Text);
      if (count < TreeView1->Selected->Count) Node = Node->GetNext();
       count ++;
     }
   }

//=== przeciąganie poszczególnych modeli
if (TreeView1->Selected->Level == 2)
   ListBox1->Items->Add(TreeView1->Selected->Text);
 }
}
//-----------------------------------------------

void __fastcall TForm1::ListBox1DragOver(TObject *Sender,
         TObject *Source, int X, int Y, TDragState State,
                                             bool &Accept)
{
//sprawdzamy czy źródłem jest TTreeView
//i akceptujemy operację Drag-and-Drop
if (Sender->ClassNameIs("TListBox") &&
    Source->ClassNameIs("TTreeView")) Accept = true;
}