• 0
ENERGY

Не оптимизированный TLabel и TText (решение)

Вопросы

Есть такая процедура, function DelAmp(const Text: string): string; в FMX.Types.

Которая 2 раза выделяет память для всей строки, и сканирует все символы в строке, в поисках &.

 

TLabel.Text  := 'Text';  - эта процедура  выполнится 2 раза, на любой платформе. Чтобы она выполнилась 1 раз, нужно сделать

TLabel.PrefixStyle := TPrefixStyle.NoPrefix;

 

TText 

TText.Text  := 'Text'; Процедура DelAmp выполниться в любом случае на любой платформе

procedure TText.SetText(const Value: string);
[..]
begin
  if Text <> Value then
  begin
    NewText := ConvertText(DelAmp(Value));

[..]

Стили состоят из множества TText элементов. Теперь представьте сколько ресурсов тратиться впустую.

 

function DelAmp(const Text: string): string;
var
  I, J: Integer;
  Sb: TCharArray;
begin
  Result := '';
  if Text <> '' then
  begin
    SetLength(Sb, Text.Length);
    I := Low(Text);
    J := 0;
    while I <= High(Text) do
    begin
      if (Text[I] <> '&') then
      begin
        Sb[J] := Text[I];
        Inc(J);
      end
      else
      begin
        if ((I < High(Text)) and (Text[I + 1] = '&')) then
        begin
          Sb[J] := Text[I];
          Inc(J);
          Inc(I);
        end;
      end;
      Inc(I);
    end;
    Result := string.Create(Sb, 0, J);
  end;
end;

 

 

Решение - скопировать FMX.Types в папку с проектом, и переделать функцию на:
 

function DelAmp(const Text: string): string;
begin
  Result := Text;
end;

 

Изменено пользователем ENERGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0 ответов на этот вопрос

Ответы на этот вопрос пока отсутствуют

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу