Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8957513
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 15, 20262026-06-15T15:00:28+00:00 2026-06-15T15:00:28+00:00

I’m implementing drag-and-drop functionality to a TTreeView . On a OnStartDrag Event of it,

  • 0

I’m implementing drag-and-drop functionality to a TTreeView. On a OnStartDrag Event of it, I’m creating the DragOcject of my derived class:

  TTreeDragControlObject = class(TDragObject)
  private
    FDragImages: TDragImageList;
    FText: String;
  protected
    function GetDragImages: TDragImageList; override;
  end;

procedure TfrmMain.tvTreeStartDrag(Sender: TObject;
  var DragObject: TDragObject);
begin
  DragObject := TTreeDragControlObject.Create;
  TTreeDragControlObject(DragObject).FText := tvTree.Selected.Text;
end;

And this is my override GetDragImages function of my DragObcject:

function TTreeDragControlObject.GetDragImages: TDragImageList;
var
  Bmp: TBitmap;
begin
  if FDragImages = nil then
  begin
    FDragImages := TDragImageList.Create(nil);
    Bmp := TBitmap.Create;
    try
      Bmp.Width := Bmp.Canvas.TextWidth(FText) + 25;
      Bmp.Height := Bmp.Canvas.TextHeight(FText);

      Bmp.Canvas.TextOut(25, 0, FText);

      FDragImages.Width := Bmp.Width;
      FDragImages.Height := Bmp.Height;
      FDragImages.SetDragImage(FDragImages.Add(Bmp, nil), 0, 0);
    finally
      Bmp.Free;
    end;
  end;

  Result := FDragImages;
end;

Everything works fine except it has a painting glitch while dragging over the tree nodes:

The node glitch

How can I avoid this behavior?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-15T15:00:29+00:00Added an answer on June 15, 2026 at 3:00 pm

    Based on @Sean’s and @bummi’s answers I would post the entire code and conclusions that worked for me in D5.

    On WinXP XPManifest is not a must – Hide/ShowDragImage are needed.

    On Win7 XPManifest is needed. Hide/ShowDragImage are not a must.

    Conclusion – use both XPManifest and HideDragImage and ShowDragImage to ensure TV will work both on XP/Win7.


    type 
      TTreeDragControlObject = class(TDragControlObject)
      private
        FDragImages: TDragImageList;
        FText: String;
      protected
        function GetDragImages: TDragImageList; override;
      public
        destructor Destroy; override;
        procedure HideDragImage; override;
        procedure ShowDragImage; override;
        property DragText: string read FText write FText;
      end;
    
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        procedure TreeView1StartDrag(Sender: TObject; var DragObject: TDragObject);
        procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
        procedure TreeView1EndDrag(Sender, Target: TObject; X, Y: Integer);
      private
        FDragObject: TTreeDragControlObject;
      public
      end;
    
    ...
    
    { TTreeDragControlObject}
    destructor TTreeDragControlObject.Destroy;
    begin
      FDragImages.Free;
      inherited;
    end;
    
    procedure TTreeDragControlObject.HideDragImage;
    begin
      GetDragImages.HideDragImage;
    end;
    
    procedure TTreeDragControlObject.ShowDragImage;
    begin
      GetDragImages.ShowDragImage;
    end;
    
    function TTreeDragControlObject.GetDragImages: TDragImageList;
    var
      Bmp: TBitmap;
    begin
      if FDragImages = nil then
      begin
        FDragImages := TDragImageList.Create(nil);
        Bmp := TBitmap.Create;
        try
          Bmp.Width := Bmp.Canvas.TextWidth(FText) + 25;
          Bmp.Height := Bmp.Canvas.TextHeight(FText);
          Bmp.Canvas.TextOut(25, 0, FText);
          FDragImages.Width := Bmp.Width;
          FDragImages.Height := Bmp.Height;
          FDragImages.SetDragImage(FDragImages.Add(Bmp, nil), 0, 0);
        finally
          Bmp.Free;
        end;
      end;
      Result := FDragImages;
    end;
    
    { TForm1 }
    procedure TForm1.TreeView1StartDrag(Sender: TObject; var DragObject: TDragObject);
    begin
      FDragObject := TTreeDragControlObject.Create(TTreeView(Sender));
      FDragObject.DragText := TTreeView(Sender).Selected.Text;
      DragObject := FDragObject;
    end;
    
    procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept := Source is TTreeDragControlObject;
    end;
    
    procedure TForm1.TreeView1EndDrag(Sender, Target: TObject; X, Y: Integer);
    begin
      FDragObject.Free;
    end;
    

    Note that in your code both FDragImages and var DragObject are leaking memory. I’d suggest using TDragControlObject instead of TDragObject (does your tvTreeEndDrag fire at all now? – it did not fire for me)

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a string like this: La Torre Eiffel paragonata all’Everest What PHP function
link Im having trouble converting the html entites into html characters, (&# 8217;) i
I am doing a simple coin flipping experiment for class that involves flipping a
I'm parsing an RSS feed that has an ’ in it. SimpleXML turns this
I'm trying to convert HTML to plain text. I get many &\#8217; &\#8220; etc.
Let's say I'm outputting a post title and in our database, it's Hello Y’all
I have a .ini file as follows: [playlist] numberofentries=2 File1=http://87.230.82.17:80 Title1=(#1 - 365/1400) Example
That's pretty much it. I'm using Nokogiri to scrape a web page what has
I have just tried to save a simple *.rtf file with some websites and
I want to count how many characters a certain string has in PHP, but

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.