Example: TcxCustomGridView.OnStartDrag
- 3 minutes to read
This example shows how to create a custom drag object for drag-and-drop. The drag object will provide a drag image to display while dragging records of the tvItems View. If a user starts dragging within the View with the multi-selection feature enabled (the OptionsSelection.MultiSelect property is set to True), the drag image will display information on the number of selected records:
If the multi-selection feature is disabled, the drag image will look as follows:
To provide a custom drag object, you need to:
Implement your own class for the drag object by deriving from the TDragObject class or its descendants (TDragControlObjectEx, TDragControlObject);
Handle the OnStartDrag event of the View within which drag-and-drop starts;
Assign an instance of the custom drag object to the DragObject parameter in the OnStartDrag event handler.
The following is an example of implementing a custom drag object when dragging from the tvItems View. The OnStartDrag event handler just creates a drag object of the TMyDragControlObject class and assigns it to the DragObject parameter.
procedure TForm1.tvItemsStartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
DragObject := TMyDragControlObject.Create(Sender as TcxGridSite);
end;
The TMyDragControlObject class overrides the GetDragImages method inherited from TDragControlObject. This method should return a list containing the image to be displayed while dragging. The drag image is created by the private CreateImageList method, which will display information regarding the selected/focused records of the View in the form shown above.
TMyDragControlObject = class(TDragControlObjectEx)
private
FImageList: TImageList;
procedure CreateImageList;
protected
function GetDragImages: TDragImageList; override;
public
constructor Create(AControl: TControl); override;
destructor Destroy; override;
end;
//...
{ TMyDragControlObject }
constructor TMyDragControlObject.Create(AControl: TControl);
begin
inherited Create(AControl);
end;
procedure TMyDragControlObject.CreateImageList;
var
AView: TcxCustomGridTableView;
s: string;
ABmp: TBitmap;
begin
if (FImageList = nil) and (Control is TcxGridSite)then
begin
//Get the current View
AView := TcxCustomGridTableView(TcxGridSite(Control).GridView);
//Prepare the text to display within the drag image
if AView.OptionsSelection.MultiSelect then
s := ' Dragging ' + IntToStr(AView.Controller.SelectedRecordCount) + ' selected records from the ' + AView.Name + ' View'
else
s := ' Dragging the focused record from the ' + AView.Name + ' View';
//Create the drag image
ABmp := TBitmap.Create();
try
with ABmp.Canvas do
begin
ABmp.Width := TextWidth(s);
ABmp.Height := TextHeight(s);
TextOut(0, 0, s);
end;
FImageList := TImageList.CreateSize(ABmp.Width, ABmp.Height);
FImageList.AddMasked(ABmp, clNone);
finally
ABmp.Free();
end;
end;
end;
destructor TMyDragControlObject.Destroy;
begin
if FImageList <> nil then
FImageList.Free;
inherited;
end;
function TMyDragControlObject.GetDragImages: TDragImageList;
begin
if FImageList = nil then
CreateImageList();
Result := FImageList;
end;