В этом коде есть проблема с утечкой памяти. Не могли бы вы её указать?
function CalcTextSize(const AFont: TFont; const AText: String): TSize; var Test: TBitmap; begin Test := TBitmap.Create; try Test.Canvas.Font := AFont; Result := Test.Canvas.TextExtent(AText); finally FreeAndNil(Test); end; end;Как бы вы исправили этот код?
Ответ на задачку будет выложен, как обычно, через месяц.
Ответ.
на вскидку
ОтветитьУдалитьOldFont := Test.Canvas.Font;
try
...
finally
Test.Canvas.Font := OldFont;
end;
вместо Test.Canvas.Font := AFont;
ОтветитьУдалитьнадо
Test.Canvas.Font.assign(AFont);
В Delphi XE2 утечка не наблюдается (проверено на 1000000 вызовах CalcTextSize). Потенциально утечка возможна в месте присвоения шрифта:
ОтветитьУдалитьTest.Canvas.Font := AFont;
Однако назначение шрифта Canvas'у выполняется с помощью Assign:
procedure TCanvas.SetFont(Value: TFont);
begin
FFont.Assign(Value);
end;
При этом в Assign происходит копирование свойств одного шрифта в другой, без перезаписи самого FFont, что не влечет за собой утечку.
1 апреля, мб? :)
ОтветитьУдалитьНет там ошибок.
ОтветитьУдалитьНа первый взгляд (без Delphi): меня сразу смутило, что это делается через BitMap, DeviceContext для которого выбирается по умолчанию, а значит и ценность функции сомнительна (а если несколько устройств вывода, типа принтера и т.п.?) Правильнее было бы передавать Canvas "сверху"... ну или хотябы HDC. Ну и при работе с Canvas рекомендуется использовать блокировки.
ОтветитьУдалитьНа второй взгляд (с Delphi, но без тестирования): покопавшись в Graphics.pas, я нашёл в каких случаях этот код может приводить к некорректному результату... но не к утечке памяти.
Хм... а хотя, может быть даже и к утечке, но это надо чтобы "повезло" :с)
Нет там ошибок =)
ОтветитьУдалитьВсе правильно сказал FLABER, во всех встроенных классах присваивание свойств TFont делается с помощью Assign поэтому утечек там нет. Это начиная с 6 делфи (как минимум).
ОтветитьУдалить