1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| procedure DoTabDragDrop(Sender, Source: TPageControl; X,
Y: Integer);
const TCM_GETITEMRECT = $130A;
var TabRect: TRect;
i: Integer;
SourceIndex,TargetIndex:Integer;
ATabSheet:TTabSheet;
begin
if Sender=Source
then begin
for i := 0 to Sender.PageCount - 1 do
begin
Sender.Perform(TCM_GETITEMRECT, i, LParam(@TabRect)) ;
if PtInRect(TabRect, Point(X, Y)) then
begin
if Sender.ActivePage.PageIndex <> i then
Sender.ActivePage.PageIndex := i;
Exit;
end;
end;
end
else begin
SourceIndex:=Source.ActivePage.PageIndex;
TargetIndex:=-1;
i:=0;
while ((i<Sender.PageCount) and (TargetIndex=-1)) do
begin
Sender.Perform(TCM_GETITEMRECT, i, LParam(@TabRect)) ;
if PtInRect(TabRect, Point(X, Y))
then begin
TargetIndex:=i;
if x>((TabRect.Left+TabRect.Right) div 2) then Inc(TargetIndex);
end;
Inc(i);
end;
ATabSheet:=Source.Pages[SourceIndex];
ATabSheet.PageControl:=Sender;
if TargetIndex<>-1 then ATabSheet.PageIndex:=TargetIndex;
end;
end;
procedure TForm1.PageControl1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Sender is TPageControl)
then (Sender as TPageControl).BeginDrag(False);
end;
procedure TForm1.PageControl1DragDrop(Sender, Source: TObject; X,
Y: Integer);
begin
if (Sender is TPageControl) and (Source is TPageControl) then
//utilisation de notre procedure magique
DoTabDragDrop((Sender as TPageControl), (Source as TPageControl),X,Y);
end;
procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
if (Sender is TPageControl) then Accept := True;
end; |
Partager