Pergunta

When using VirtualTreeView drag operation by default is [doCopy,doMove]. Move operation is indicated by arrow pointer with small box and Copy operation is indicated by same pointer icon but with added [+] next to it.

By default VT uses copy operation and if you press modifier key (SHIFT key) it modifies operation to move therefore removing the [+] from pointer.

Here is what I need:

  • reverse the operations (default would be move, with modifier key pressed - copy) and thus reverse pointer arrow too
  • replace modifier key - CTRL instead of SHIFT
  • read in an event which of the two operations occurred and start copy or move operation

Any pointers into right direction(s) appreciated.

Foi útil?

Solução

More than change a modifier, you should in the OnDragOver event handler change the operation you'll be going to perform. So, to add a CTRL key as a copy operation modifier you would write something like follows. The Effect parameter value set in this event also changes the drag cursor, depending on the chosen operation. Except that is that value passed to the OnDragDrop event, where you can according that determine what to do with the dropped source:

procedure TForm1.VirtualStringTree1DragOver(Sender: TBaseVirtualTree;
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
  Accept := True;
  if Shift = [ssCtrl] then
    Effect := DROPEFFECT_COPY;
end;

In the OnDragDrop event handler you can determine the effect that was used:

procedure TForm1.VirtualStringTree1DragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
begin
  case Effect of
    DROPEFFECT_COPY: ShowMessage('DROPEFFECT_COPY');
    DROPEFFECT_MOVE: ShowMessage('DROPEFFECT_MOVE');
  end;
end;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top