一个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;

解决方案 »

  1.   

    delphi 2007:声明
    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;
      

  2.   

    delphi7里怎样实现?这个适合Delphi7吗?
      

  3.   

    有没有高手呢,上面那个FTabPosition 是不是delphi2007里系统自带的数据成员,Delphi7里没有这个数据成员
      

  4.   

    没有人来回答吗?高手真少,这个CSDN人气不高