procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  p:^string;
  bh:string;
  AnItem: TTreeNode;
  AttachMode: TNodeAttachMode;
  HT: THitTests;
begin
  if (sender is TTreeView) and (source is TListView) then
  begin
    p:=TreeView1.selected.Data;   ////这一句不对得到是始终是原先选中的那个结点而不是要落下的结点
    bh:=trim(ListView1.Selected.SubItems.GetText);
    bh:=Copy(bh,1,3);
    showmessage(bh);
    showmessage(p^);
    if bh=trim(p^) then
    begin
      MessageDlg('不能移动该用户!原因:源抄表本与目的抄表本相同!', mtInformation,[mbOk], 0);
      ListView1.EndDrag(False);
    end;
  end;end;

解决方案 »

  1.   

    var
        HT: THitTests;
        AnItem: TTreeNode;
      HT := TreeView1.GetHitTestInfoAt(X, Y);
      AnItem := TreeView1.GetNodeAt(X, Y);
      

  2.   

    void __fastcall TForm1::TreeView1DragDrop(TObject *Sender, TObject *Source,
          int X, int Y)
    {
        if(Sender->ClassNameIs("TTreeView") && Source->ClassNameIs("TTreeView"))
        {
            TTreeNode *TargetNode = TreeView1->GetNodeAt(X,Y);
            if(TargetNode != NULL)
            {
                TTreeNode *SourceNode;
                SourceNode = TreeView1->Selected;
                TreeView1->Items->BeginUpdate();
                try
                {
                    if((SourceNode->Level) < (TargetNode->Level))
                        exit;
                    else
                    {
                        CopyNodeUnder(TreeView1,SourceNode,TargetNode);
                        TargetNode->Expand(false);
                        TreeView1->Selected = TargetNode;
                    }
                }
                __finally
                {
                    TreeView1->Items->EndUpdate();
                }
            }
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,
          int X, int Y, TDragState State, bool &Accept)
    {
        TTreeNode *TargetNode = TreeView1->GetNodeAt(X,Y);
        //Accept = true;
        if((Source == Sender) && (TargetNode != NULL))
        {
            Accept = true;
            TTreeNode *SourceNode = TreeView1->Selected;
            while((TargetNode->Parent != NULL) && (TargetNode != SourceNode))
            {
                TargetNode = TargetNode->Parent;
            }
            if(TargetNode != SourceNode)
            {
                Accept = false;
            }
        }
        else
        {
            Accept = false;
        }
    }