Home » Tutorials » VCL » Drag’n’Drop in Delphi

Drag’n’Drop in Delphi

Listbox als Quelle

Nachdem wir jetzt die Grundlagen von Drag’n’Drop verstanden haben, können wir uns an einer etwas komplizierteren Aufgabe versuchen. Diesmal wird als Quelle eine Listbox verwendet. Wir fügen dem Formular deshalb eine TListbox-Komponente hinzu.
Zuerst füllen wir die Listbox mit einigen Werten:

const
   wochentage: array[1..7] of String = 
    ('Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag',
    'Samstag', 'Sonntag');

procedure TForm1.FormCreate(Sender:TObject);
var
  i: Integer;
begin
  for i := Low(wochentage) to High(wochentage) do
    Listbox1.Items.Add(wochentage[i]);
end;

Als nächstes geben wir der Listbox die Fähigkeit, als Drag’n’Drop-Quelle zu dienen:

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
    Listbox1.BeginDrag(False);
end;

Jetzt müssen wir noch die beiden bereits vorhandenen Eventhandler OnDragOver und OnDragDrop von Label1 erweitern:

procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if (Source is TEdit) or (Source is TListbox) then
    Accept := True;
end;

procedure TForm1.Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  index: Integer;
begin
  if (Source is TEdit) then
    Label1.Caption := TEdit(Source).Text
  else if (Source is TListbox) then
  begin
    index := TListbox(Source).ItemIndex;
    Label1.Caption := TListbox(Source).Items[index];
  end;
end;

Für das Beenden des Ziehvorgangs nutzen wir den bereits vorhanden Eventhandler von Edit1. Wir benennen ihn im Objektinspektor jedoch in EndDrag um:

procedure TForm1.EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  if (Target = nil) then
    MessageBeep(0);
  // Wenn Drag'n'Drop-Operation nicht erfolgreich abeschlossen wurde...
end;