unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, Grids;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
StringGrid1: TStringGrid;
procedure Button1StartDrag(Sender: TObject; var DragObject: TDragObject);
procedure Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure StringGrid1StartDrag(Sender: TObject; var DragObject: TDragObject
);
private
{ private declarations }
public
{ public declarations }
end;
{ TMyDragObject }
TMyDragObject = class(TDragControlObject)
private
FDragImages: TDragImageList;
protected
function GetDragImages: TDragImageList; override;
public
constructor Create(AControl: TControl); override;
destructor Destroy; override;
end;
var
Form1: TForm1;
implementation
{$R unit1.lfm}
{ TForm1 }
procedure TForm1.Button1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
// user started dragging on Button1
// create our own TDragControlObject which provides an image.
DragObject := TMyDragObject.Create(Sender as TControl);
end;
procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
ShowMessage('Congratulations. You dropped button on me :)')
end;
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
Control: TControl;
begin
if Source is TControl then
Control := Source as TControl
else
if Source is TDragControlObject then
Control := (Source as TDragControlObject).Control
else
Control := nil;
Accept := Control is TButton;
end;
procedure TForm1.StringGrid1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
DragObject := TMyDragObject.Create(Sender as TControl);
end;
{ TMyDragObject }
function TMyDragObject.GetDragImages: TDragImageList;
begin
Result := FDragImages;
end;
constructor TMyDragObject.Create(AControl: TControl);
var
ARect : TRect;
Bitmap : TBitmap;
Cropped : TBitmap;
begin
inherited Create(AControl);
FDragImages := TDragImageList.Create(AControl);
AlwaysShowDragImages := True;
Bitmap := TBitmap.Create;
Bitmap.Width := AControl.Width;
Bitmap.Height := AControl.Height;
if AControl is TWinControl then
(AControl as TWinControl).PaintTo(Bitmap.Canvas, 0, 0);
if AControl is TStringGrid then
begin
with (AControl as TStringGrid) do
ARect := CellRect(Col, Row);
Cropped := TBitmap.Create;
Cropped.SetSize(ARect.Width, ARect.Height);
Cropped.Canvas.CopyRect
(Rect(0, 0, ARect.Width, ARect.Height), Bitmap.Canvas, ARect);
Bitmap.SetSize(ARect.Width, ARect.Height);
Bitmap.Canvas.Draw(0, 0, Cropped);
Cropped.Free;
end;
FDragImages.Width := Bitmap.Width;
FDragImages.Height := Bitmap.Height;
FDragImages.Add(Bitmap, nil);
FDragImages.DragHotspot := Point(Bitmap.Width, Bitmap.Height);
Bitmap.Free;
end;
destructor TMyDragObject.Destroy;
begin
FDragImages.Free;
inherited Destroy;
end;
end.