![]() |
FMX: Memory Leak: TMemo
Folgender Code verursacht Memory Leaks:
Delphi-Quellcode:
Memo.Lines.Add('Test');
TTextServiceWin TLineMetricInfo Kann das jemand reproduzieren? |
AW: FMX: Memory Leak: TMemo
Inkl Update 2?
|
AW: FMX: Memory Leak: TMemo
Hallo Stefan,
Update 2 ist drauf. |
AW: FMX: Memory Leak: TMemo
Das ist nicht nur das Lines.Add, sondern das Memo selber bzgl des TextService, ein blick in die Sourcen zeigt, das FTextService, sowie MetricLineInfo dort nicht freigeben werden. Ich lege dort mal ein QC-Eintag (
![]() TextService:
Delphi-Quellcode:
constructor TMemo.Create(AOwner: TComponent);
begin inherited Create(AOwner); FTextService := Platform.GetTextServiceClass.Create(self, True); end; destructor TMemo.Destroy; begin if FUnwrapLines <> nil then FUnwrapLines.Free; FSelectionFill.Free; FFontFill.Free; FFont.Free; FActionStack.Free; {$IFNDEF NOVCL} FMemoPopupMenu.Free; {$ENDIF} FLines.Free; inherited; end; MetricLineInfo:
Delphi-Quellcode:
function TMemo.FillLocalLinesBegs(PText: PString; ABegChar, AEndChar: Integer; TmpLinesBegs: PLinesBegins): Integer; var S: string; TmpSWidth: Single; LLongestLineWidth: Single; i: Integer; LMetrics: TLineMetricInfo; begin Result := 0; SetLength(TmpLinesBegs^, 0); if PText^ = '' then Exit; LMetrics := TLineMetricInfo.Create; S := Copy(PText^, ABegChar, AEndChar - ABegChar + 1); Canvas.Font.Assign(Font); Canvas.MeasureLines(LMetrics, ContentRect, S, FWordWrap, FillTextFlags, TTextAlign.taLeading, TTextAlign.taLeading); if LMetrics.Count = 0 then begin // no date??? Error?? // Result := 0; // SetLength(TmpLinesBegs^, 0); end else if LMetrics.Count = 1 then begin // Single line Result := 0; SetLength(TmpLinesBegs^, 0); end else begin // New lines are coming. SetLength(TmpLinesBegs^, LMetrics.Count - 1); LLongestLineWidth := TextWidth(Copy(S, 1, LMetrics.Metrics[0].Len)); Result := 0; for i := 0 to LMetrics.Count - 2 do begin TmpLinesBegs^[i] := LMetrics.Metrics[i+1].Index - 1 + ABegChar; TmpSWidth := TextWidth(Copy(S, LMetrics.Metrics[i+1].Index, LMetrics.Metrics[i+1].Len)); if TmpSWidth > LLongestLineWidth then begin LLongestLineWidth := TmpSWidth; Result := i; end; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz