Delphi - Drag & drop
- Date:
- Author: Stefan Cruysberghs
- Deze pagina is enkel in het Engels beschikbaar
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;