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

经排查发现是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一样了:

旧版本的方法:
打开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:

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

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

浙公网安备 33010602011771号