Das ganze ist im Grunde recht einfach:
Du darfst nicht beim Drücken der Maustaste sofort einen Dragvorgang beginnen, denn das löst sofort das MouseUp aus. Stattdessen musst du das MouseMove benutzen und erst nach einer Bewegung mit gedrückter Maustaste (ggf. mit Toleranz von ein paar Pixeln) den Dragvorgang auslösen.
Außerdem benutzt du in ListBox1DragDrop und ListBox1DragOver wie schon genannt Sender (die Ereignisquelle für die Mausaktion, also die Listbox) statt Source (der Dragquelle, also das Label).
// EDIT:
Sprich:
Delphi-Quellcode:
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then // ggf. noch beim MouseDown die X- und Y-Koordinaten speichern und hier die Differenz ermitteln
begin
StartDragging := True;
Label1.BeginDrag(False, 8);
StartDragging := False;
end;
end;
procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if not StartDragging then
begin
if Button = mbRight then
ShowMessage('mbRight');
if Button = mbLeft then
ShowMessage('mbLeft');
end;
end;
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TLabel then
begin
ListBox1.Items.Add(TLabel(Source).Caption);
end;
end;
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source is TLabel then
Accept := True
else
Accept := False;
end;