Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   FMX: Memory Leak: TMemo (https://www.delphipraxis.net/164595-fmx-memory-leak-tmemo.html)

BlackSeven 21. Nov 2011 08:18

FMX: Memory Leak: TMemo
 
Folgender Code verursacht Memory Leaks:

Delphi-Quellcode:
Memo.Lines.Add('Test');


TTextServiceWin
TLineMetricInfo

Kann das jemand reproduzieren?

Stevie 21. Nov 2011 10:09

AW: FMX: Memory Leak: TMemo
 
Inkl Update 2?

BlackSeven 21. Nov 2011 10:26

AW: FMX: Memory Leak: TMemo
 
Hallo Stefan,

Update 2 ist drauf.

daywalker9 21. Nov 2011 11:09

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 (QC#101188 für an.

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 05:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz