一个tabset控件,上面生成很多tabs页的时候,会自动产生左右滚动条,这个时候在mousemove方法中通过itematpos函数得到某个tabs页的Index时会不正确,tabset控件函数itematpos代码如下:
function TTabSet.ItemAtPos(Pos:TPoint):Integer;
var
TabPos:TTabPos;
I:Integer;
Begin
Result:=-1;
If (Pos.Y<0) or (Pos.Y>ClientHeight) then exit;
For I:=0 to TabPositions.Count-1 do
begin
Pointer(TabPos):=TabPositions[I];
if (Pos.X>=TabPos.StartPos) and (Pos.X<=TabPos.StartPos+TabPos.size) then
begin
Result:=I;
Exit;
end;
end;
End;
function TTabSet.ItemAtPos(Pos:TPoint):Integer;
var
TabPos:TTabPos;
I:Integer;
Begin
Result:=-1;
If (Pos.Y<0) or (Pos.Y>ClientHeight) then exit;
For I:=0 to TabPositions.Count-1 do
begin
Pointer(TabPos):=TabPositions[I];
if (Pos.X>=TabPos.StartPos) and (Pos.X<=TabPos.StartPos+TabPos.size) then
begin
Result:=I;
Exit;
end;
end;
End;
function ItemAtPos(Pos: TPoint; IgnoreTabHeight: Boolean = False): Integer;实现
function TTabSet.ItemAtPos(Pos: TPoint; IgnoreTabHeight: Boolean): Integer;
var
TabPos: TTabPos;
I: Integer;
YStart: Integer;
Extra: Integer;
MinLeft, MaxRight: Integer;
begin
Result := -1;
if (Pos.X < 0) or (Pos.X > ClientWidth) or
(Pos.Y < 0) or (Pos.Y > ClientHeight) then
Exit; case FTabPosition of
tpBottom:
YStart := 0;
tpTop:
YStart := ClientHeight - FTabHeight;
tpLeft:
begin
{ Switch the X and Y }
I := Pos.X;
Pos.X := Pos.Y;
Pos.Y := I;
YStart := ClientWidth - FTabHeight; { Really the "X" start }
end;
tpRight:
begin
{ Switch the X and Y }
I := Pos.X;
Pos.X := Pos.Y;
Pos.Y := I;
YStart := 0; { Really the "X" start }
end;
else
YStart := 0;
end; if IgnoreTabHeight or ((Pos.Y >= YStart) and (Pos.Y <= YStart + FTabHeight)) then
begin
if Pos.Y < YStart + FTabHeight div 2 then
Extra := FEdgeWidth div 3
else
Extra := FEdgeWidth div 2; for I := 0 to FTabPositions.Count - 1 do
begin
Pointer(TabPos) := FTabPositions[I];
MinLeft := TabPos.StartPos - Extra;
MaxRight := TabPos.StartPos + TabPos.Size + Extra;
if (Pos.X >= MinLeft) and (Pos.X <= MaxRight) then
begin
Result := FirstIndex + I;
Break;
end;
end;
end;
end;