秋·风

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

fastreport在windows11(lazarus)报表设计时出现的问题(2026-06-26更新)

fastreport 2023之后的版本在windows11(lazarus 4.4/4.6)报表设计时,如果文本框没完整显示文本框内容,鼠标在上面停放一会,会弹出以下错误信息(Position range overflow in .SendMoveSizeMessages: Left=19867780, Top=697,left的值超级大):

92466113e2e696d6193b800d60237454

经排查发现是fr使用自定义hint引起的,这次修复只是治标,没从问题源头修复。
2026-06-26更新:
这次从问题源头修复。
打开FastReport\FPC\Sources\fpxhint.pas,找到function TBaseHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
用下面的代码替代:

{$IFNDEF FPC}
procedure TBaseHintWindow.ActivateHintData(vRect: TRect; const AHint: string; AData: Pointer);
begin

  FreeAndNil(FBaseHintData);
  FBaseHintData := AData;
  FHintS := AHint;

  SetupDrawText(FDrawTextHeader, clWhite, HINT_TEXT_SIZE_HEADER, 0);
  FDrawTextHeader.SetOptions(True, True, False, True, False, True, 0);
  ResetText;
  FHeaderHeight := Round(FDrawTextHeader.CalcHeight) + HINT_PADDING;
  SetupDrawText(FDrawTextPlain, clBlack, HINT_TEXT_SIZE, FHeaderHeight + HINT_PADDING);
  SetPlainTextOptions;
  ResetText;

  inherited;

end;
{$else}
function TBaseHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
var
  WHeader, WText, WMax: Integer;
begin
  FreeAndNil(FBaseHintData);
  FBaseHintData := TBaseHintData(AData);
  FHintS := AHint;

  SetupDrawText(FDrawTextHeader, clWhite, HINT_TEXT_SIZE_HEADER, 0);
  FDrawTextHeader.SetOptions(True, True, False, True, False, True, 0);
  ResetText;
  FHeaderHeight := Round(FDrawTextHeader.CalcHeight) + HINT_PADDING;
  SetupDrawText(FDrawTextPlain, clBlack, HINT_TEXT_SIZE, FHeaderHeight + HINT_PADDING);
  SetPlainTextOptions;
  ResetText;

  WHeader := Round(FDrawTextHeader.CalcWidth);
  WText := Round(FDrawTextPlain.CalcWidth);
  if WHeader > WText then WMax := WHeader else WMax := WText;

  Result := Rect(0, 0, WMax + 2 + HINT_PADDING * 2,
                 FHeaderHeight + Round(FDrawTextPlain.CalcHeight) + HINT_PADDING * 2);
  if Result.Right > MaxWidth then Result.Right := MaxWidth;
end;
{$endif}

修改后重新编译fr_lazarus.lpk
修改后的hint不出错了,hint和delphi一样了:

QQ_1782440199548

旧版本的方法:

打开FastReport\FPC\Sources\frxDesgnWorkspace.pas,找到procedure TfrxDesignerWorkspace.RealHintShow(var Msg: TCMHintShow),然后按红色代码修改:
procedure TfrxDesignerWorkspace.RealHintShow(var Msg: TCMHintShow);
var
  Header, PropText: String;
  HMemoView: TfrxCustomMemoView;
begin
  if not (FLastObjectOver is TfrxCustomMemoView) then Exit;
  HMemoView := TfrxCustomMemoView(FLastObjectOver);
  if HMemoView.HasOutboundContent then
  begin
    Header := frxResources.Get('obText');
    PropText := HMemoView.Text;

    Msg.HintInfo.HintStr :={$ifdef fpc} Header + LineEnding + {$endif}PropText;
    {$ifndef fpc}Msg.HintInfo.HintWindowClass := TDesgnHintWindow;
    Msg.HintInfo.HintData := TDesgnHintData.Create('', Header, False, HMemoView);{$endif}
    Msg.HintInfo.HideTimeout := MaxInt;
  end;
end;

修改后重新编译就可以正常显示hint:

QQ_1774918771969
linux不报错,但显示的hint内容不完整:
image
修改后能完整显示[Customers."Contact"]

image

如果你有更好的修改方法,希望能和我分享,谢谢!

posted on 2026-03-31 09:01  秋·风  阅读(171)  评论(0)    收藏  举报