Das ist zwar schon fast ein prähistorischer Thread ... hole den aber trotzdem noch mal hoch.
Weil: War auf der Suche nach eben so einer Funktion, aber das funzte alles nicht wirklich toll und war n.E.n. etwas überladen.
Hier mal meine (Kurz-) Version, die beim Live-Verschieben auch die Listbox richtig scrollt.
Delphi-Quellcode:
procedure TForm.OnDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState;
var Accept: Boolean);
var
Position, BotIndex : integer;
begin
with Sender
as TListBox
do // or TCheckListBox ...
begin
Position := ItemAtPos(point(x,y), true);
// get position
if (Position < 0)
then exit;
// position outside listbox ?
if (ItemIndex = Position)
then exit;
// position changed ?
BotIndex := TopIndex + ClientHeight
div ItemHeight;
// get act. bottom-index
if (TopIndex > 0)
AND ((Position - 1) < TopIndex)
then // pos. near top-index ?
SendMessage(
Handle,WM_VSCROLL,SB_LINEUP,0);
// scroll up line
// SendMessage(Handle,WM_VSCROLL,SB_PAGEUP,0); // scroll up page
if (BotIndex < (Count - 2))
AND ((Position + 2) > BotIndex)
then // pos. near bot-index ?
SendMessage(
Handle,WM_VSCROLL,SB_LINEDOWN,0);
// scroll down line
// SendMessage(Handle,WM_VSCROLL,SB_PAGEDOWN,0); // scroll down page
Items.Move(ItemIndex, Position);
// move entry
// move dependend data here same as item !
ItemIndex := Position;
// DO NOT FORGET: set index to new position !!!
end;
end;
Das funzt aktuell nur mit jeweils einem Eintrag, den man beliebig hin- und herschieben kann.
Werde noch daran basteln, das mit MulitSelect zu erweitern.