News
Photos
Articles
Components
Applications
Kleinkunst

Delphi - Drag & drop

Drag & drop van componenten in run-time is vrij eenvoudig te maken. Drag en drop betekent dat je een component versleept en loslaat op een ander component.

Componenten verslepen

Bij de componenten die je wil verslepen (drag) moet je de property DragMode op dmAutomatic zetten. Bij het component waarop de componenten losgelaten kunnen worden (drop) moet je eerst bij het event OnDragOver controleren of je het component wil aanvaarden. Als dit het geval is, verandert de muispijl. In het event OnDragDrop kan je dan opvangen welk component er gedropt wordt.

Bij deze events moet je heel vaak een object typecasten. Dit betekent dat je moet aangeven van welke klasse (class) het algemene object afstamt. De Source parameter is bij deze events de algemene klasse TObject waarvan alle andere objecten afstammen. Je moet Source dan typecasten naar bijvoorbeeld een TLabel of TShape.

Voorbeeld

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Alle beschikbare scherm-lettertypes in listbox plaatsen 
  Listbox1.Items:=Screen.Fonts;
end;

procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  // Accept:=True;
  if Source is TLabel then
    Accept:=Source is TLabel
  else
    if Source is TShape then
      Accept:=Source is TShape
    else
      Accept:=Source is TListBox;
end;

procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source is TLabel then
    Memo1.Font.Size:=StrToInt((Source as TLabel).Caption);
  if Source is TShape then
    Memo1.Font.Color:=(Source as TShape).Brush.Color;
  if Source is TListbox then
    Memo1.Font.Name:=Listbox1.Items[Listbox1.ItemIndex];
end;

Wil je meer controle om te beslissen wanneer drag en drop mogelijk is, dan kan je best DragMode op dmManual zetten. In een OnMouseDown event kan je dan zelf een drag-actie starten met de BeginDrag methode.

Voorbeeld

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Label1.BeginDrag(True);
end;

Bestanden verslepen

Vele Windows applicaties laten het ook toe om bestanden vanuit de Windows Verkenner naar een programma te slepen. Dit is echter niet zo eenvoudig en kan niet met de standaard events. Je dient hiervoor Windows messages (WM_DROPFILES) op te vangen en Windows API functies (zoals DragQueryFile en DragFinish) te gebruiken.

Met het gratis Delphi TscFileDrop (of het .NET FileDrop) component dat je op deze website kan vinden, kan je het verslepen van bestanden naar je applicatie op een eenvoudige manier implementeren. Meer nog, je kan ook opgeven welke extenties toegelaten mogen worden. Het componentje heeft een event waarin je de lijst met bestanden kan raadplegen.

TscFileDrop component (Delphi, VCL)

FileDrop component (C#, .NET 2.0)

Voorbeeld

procedure TForm1.scFileDrop1Drop(Sender: TObject; X, Y: Integer);
var
  i : Integer;
begin
  for i:=0 to scFileDrop1.FileCount-1 do
  begin
    Memo1.Lines.Add(ExtractFileName(scFileDrop1.Files[i]));
  end;
end;