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;