Einzelnen Beitrag anzeigen

daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

AW: FMX: Memory Leak: TMemo

  Alt 21. Nov 2011, 12:09
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;
Lars

Geändert von daywalker9 (21. Nov 2011 um 12:19 Uhr)
  Mit Zitat antworten Zitat