Перейти к содержанию
Fire Monkey от А до Я
  • 0

Переход 10.3.3 -> 10.4.1


slav_z

Вопрос

Переход с Delphi 10.3.3 на версию 10.4.1 вызвало проблемы во всех ОС без исключения.

Начну с простых случаев:

Linux (Ubuntu)

При компиляции вылезла ошибка: ld-linux.exe: error: cannot find -lgcc_s

Помогла установка (с последующим обновлением SDK) на ubuntu: sudo apt install gcc

При компиляции вылезла ошибка: ld-linux.exe: error: cannot find -lz

Помогла установка (с последующим обновлением SDK) на ubuntu: sudo apt install zlib1g-dev

iOS

Приложение при запуске стало занимать 2/3 экрана по высоте (в новом приложении хелловорд все было хорошо).

Для решения проблемы надо добавить следующую строку в "старый"  файл info.plist.TemplateiOS.xml

1359285540_.png.128475a18daa1cb13e14c4c248a41554.png

Windows

В приведенном ниже коде перестал освобождаться интерфейс Response. При выходе программа сообщала о не освобожденных объектах (ReportMemoryLeaksOnShutdown:=True)

1251593442_.png.88451281d2c8729b49462b5019969296.png

Вот код (помечена строка которую пришлось добавить для решения проблемы... сломали подсчет ссылок для интерфейсов, а это уже плохо...):

603888666_.png.63a55237ba8eb2d4db72fa16f577d5b6.png

macOS

При деплое вылезло следующее:

[PAClient Error] Error: E0264 Unable to execute '"/usr/bin/codesign" --entitlements "/Users/macbookpro/PAServer/...../Contents/xxxx.entitlements" -s "-" -f "/Users/macbookpro/PAServer/scratch-dir/xxxx.app"' (Error 1)
[PAClient Error] Error: E0264 Failed to parse entitlements: AMFIUnserializeXML: duplicate dictionary key near line 19

Не знаю почему и как, но помогло убрать галочку здесь:

80631873_.png.93be4e05bed623651022c38b991ae2ac.png

Android

Самые большие проблемы. В двух словах: ошибка при компиляции F2084 Internal Error: URW1237 или G14486 при использовании обобщенных классов (тот же код для других OC компилируется без проблем).

Позже покажу пример кода и как получилось уговорить компилятор.

 

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

несколько странно выглядит код

response = get();
if (...) then
  Synchronize(...   response := nil;)

а если else, то что с response ?

10.4.4 Win64/Win32
тестовый код

procedure TForm1.btn1Click(Sender: TObject);
begin
  ttask.Run(
    procedure
      var
        http: THTTPClient;
        resp: IHTTPResponse;
    begin
      http := THTTPClient.Create;
      resp := http.Get('http://www.google.com');
      TThread.Synchronize(nil,
      procedure
      begin
        m1.Lines.Text := resp.ContentAsString();
      end
      );
      http.Free;
    end
    );
end;

утечек не нашел

если поставить breakpoint на http.free то в отладчике вызовы IntfClear видны. так что не все так однозначно, как любят говорить в некоторых местах)

Ссылка на комментарий
  • 0
6 часов назад, krapotkin сказал:

утечек не нашел

хорошо... если вам комфортнее работать со своим кодом, то попробуйте сделать так:

1739338164_.png.8664746702796d097def3cb650d8f709.png

будет утечка? я привел пример кода который вызывает проблемы, конечно, его можно переписать иначе и проблема исчезнет.. но с точки зрения языка проблем в коде нет... Response:=nil (уменьшение количества ссылок на интерфейс) это костыль который решает проблему (его быть не должно, и в версии 10.3.3 он не нужен - там все хорошо) при else этот костыль не нужен.... (только не говорите "зачем объявлять переменные в теле процедуры?" - это допустимо в языке...  почему надо делать именно так - это отдельная тема)

Ссылка на комментарий
  • 0

да, в случае объявления переменных в коде баг в наличии, видимо, есть

очевидно, что связан он с механизмом захвата переменных в поток

эти новые фичи - они всегда такие) 

Ссылка на комментарий
  • 0

Android

Ниже код который компилируется без проблем во всех ОС и в версии 10.3.3 и в версии 10.4.1 (тут нет никакого подвоха, код непростой для понимания, но верный... )

type
  TChain = class abstract
  end;

  TBaseChain<T: record> = class abstract (TChain)
  public type
    BlockType = T;
  end;

  TDataBlock<T> = record
  end;

  TDataChain<T: record> = class(TBaseChain<TDataBlock<T>>)
  end;

  TBlockMaster = record
  end;

  TMasterChain = class(TDataChain<TBlockMaster>)
  end;

procedure TForm1.Button4Click(Sender: TObject);
var A: TMasterChain.BlockType;
begin

end;

Проблема возникает если объявление типов перенести в отдельный модуль.

1242354909_.png.c2bab8d55468b30f89f776cb656283b0.png

Решение в данном случае зависит от дальнейшего способа использования переменной A. Расписывать дальше не буду, т.к мало кто создает свои обобщенные типы, а с использованием встроенных типов (TArray<T>, TList<T> и прочее) я проблем не заметил.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...