Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
Delphi XE3 Professional
|
AW: FMX: Memory Leak: TMemo
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)
|
|
Zitat
|