Thema: Delphi Drag&Drop in Listbox

Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Drag&Drop in Listbox

  Alt 17. Jun 2008, 07:25
Moin,

die Hilfe bietet dir (zumindest die von Delphi 5) folgendes Beispiel:
Delphi-Quellcode:
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var
 Accept: Boolean);

begin
  Accept := Source is TLabel;

end;

In der folgenden Ereignisbehandlungsroutine für OnDragDrop wird der Ablegevorgang implementiert.

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);

begin
  if (Sender is TListBox) and (Source is TLabel) then
  begin
    with Sender as TListBox do
    begin
      Font := (Source as TLabel).Font;
      Color := (Source as TLabel).Color;
    end;
  end;

end;
Im Ereignis DragOver kannst du über den Parameter Accept festlegen, ob das gezogene Element an der aktuellen Mausposition akzeptiert werden soll. Für dich sollte dort natürlich auf deine ListBox geprüft werden.

Im Ereignis DragDrop legst du fest, was mit deinem gezogenen Element passieren soll. Für dich heißt das dann, ermitteln, über welchem Eintrag die Maus los gelassen wurde und bewegen des gezogenen Eintrages an diese Position.

Welches Item sich an der aktuellen Position befindet kannst du mit ItematPos ermitteln, mit Items.Move bewegst du deinen Eintrag an die neue Position.

Delphi-Quellcode:
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var TargetIndex : Integer;
begin
  if (Sender is TListBox) and (Source is TListBox) then
  begin
    with Sender as TListBox do
    begin
      TargetIndex := -1;
      TargetIndex := ItemAtPos(Point(X, Y), True);
      if (ItemIndex > -1) and (TargetIndex > -1) then
      Items.Move(ItemIndex, TargetIndex);
    end;
  end;

end;
Ich hab das jetzt nicht getestet. ist vom Grundsatz aber wohl ok.

Gruß oki

[edit] Ach so, mein Beispielcode unterstellt natürlich, das diese Operation in der selben Listbox erfolgt! [/edit]
42
  Mit Zitat antworten Zitat