delphi vcl 的 TPageControl 控件,实现对页签的拖动


本文整理自网络,侵删。

 

我们在TPageControl 控件里 放了几个页签,但很多时候我们的需求是把某个页签放前面 和 另一个旁边的方便切换做对比。这个可以有更好的体验,类似Delphi IDE编辑器一样切换页签。

分别 在 DragDrop 、DragOver 、MouseDown 事件写上对应代码

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Label1: TLabel;
    TabSheet3: TTabSheet;
    Label2: TLabel;
    procedure PageControl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure PageControl1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure PageControl1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PageControl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  //拖动标签
  if (Sender is TPageControl) then
  if ssLeft in Shift then begin
    TPageControl(Sender).BeginDrag(False);
  end;
end;

procedure TForm1.PageControl1DragDrop(Sender, Source: TObject; X, Y: Integer);
const
  TCM_GETITEMRECT = $130A;
var
  TabRect: TRect;
  Idx: Integer;
begin
  //拖动标签
  if (Sender is TPageControl) then
  for Idx := TPageControl(Sender).PageCount - 1 downto 0 do
  begin
    TPageControl(Sender).Perform(TCM_GETITEMRECT, Idx, LParam(@TabRect));
    if PtInRect(TabRect, Point(X, Y)) then // 搜索 每个Tab的区域并判断鼠标区域
    begin
      if TPageControl(Sender).ActivePage.PageIndex <> Idx then begin
        TPageControl(Sender).ActivePage.PageIndex := Idx;
      end;
      Exit;
    end;
  end;
end;

procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  // 判断调用者为 TPageControl 类型可以拖动标签
  Accept := (Sender is TPageControl);
end;

end.

运行效果如下

来源:http://www.delphifmx.com/node/69

相关阅读 >>

Delphi 通过 arp 协议获取局域网内指定 ip 地址的机器的 mac 地址

Delphi idhttp组件+idhttpserver组件实现文件下载服务

Delphi ioutils单元查找文件夹下所有文件

Delphi 几个日期操作

Delphi调用java编写的webservice

Delphi xe10 对 json的解析应用

Delphi �c 如何使用datasnap获取作为标头传递的标记?

Delphi scrollbox1滚动框鼠标滚轮

Delphi线程的创建、挂起、激活与终止

md5.pas

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...