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

Переезд на 10.3 Rio


gonzales

Вопрос

Доброго времени суток!

Возникла необходимость переехать на 10.3 (дабы поддерживались пуши на устройствах с андроид8 ну и вообще) 

 Ну и как водится огребаю кучу багов и несовместимостей. В этой теме буду писать и том, что нашел, как боролся. Может еще кто-то что напишет.

Во первых, под Винду все запустилось нормально, по крайней мере явных косяков я сходу не увидел, уже плюс.

А вот с Андроидом куча проблем

1. Не смог запустить программу на Андроид 6.1. У меня реализован SplashScreen, так вот при показе главной формы получаю 

Cannot create OpenGL context for 'eglMakeCurrent'

откуда ноги растут пока не понятно. На Андроид 8.0 все запустилось нормально. Пробывал понижать версию SDK - не помогло, есть подозрение, что глючит какой-то из визуальных компонентов, дебаг не помог, весь код по onshow главной формы отрабатывает, а затем делфа начинает показывать окно CPU и в какой-то момент выскакивает ошибка.

2. На Андроид 8 не работает SplashScreen - то есть вообще. Показывает заставку и затем сразу главное окно, пока не ясно что это.

3. Не работают ПУШи - не формируется Токен, вообще не стартует сервис пушей, говорит, чего-тоне хватает, буду разбираться. 

4. Есть у меня прозрачная форма, на которой лежит прямоугольник с прозрачностью (Opacity). Так вот он показывается просто черным, прозрачность не отрабатывает, хотя на непрозрачной форме работает корректно. В параметрах Brush прямоугольника не отображаются правильно значения цвета.

Изменено пользователем gonzales
Ссылка на комментарий
  • Ответы 67
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

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

  • 0

Эти проблемы пробовали воспроизвестись на свежем проекте ? 
т.е. с нуля новый проект и к примеру сделать прозрачность из 4го пункта ? 

Мой переход был не то чтобы тоже гладким, мне пришлось снести dproj и позволить проекту с генерировать его снова.
Удалены были все файлы кроме *.dpr, *.pas, *.fmx 
В основном пока проблем не обнаружил, кроме iOS (TLocationSensor)

Изменено пользователем Паршенко Виктор
Ссылка на комментарий
  • 0
12 минут назад, Паршенко Виктор сказал:

Эти проблемы пробовали воспроизвестись на свежем проекте ? 
т.е. с нуля новый проект и к примеру сделать прозрачность из 4го пункта ? 

Пока нет, борюсь с первым пунктом, как самым критичным. За наводку с удалением проекта спасибо - буду пробывать

Ссылка на комментарий
  • 0
11 минут назад, gonzales сказал:

Пока нет, борюсь с первым пунктом

https://community.idera.com/developer-tools/programming-languages/f/delphi-language/37765/cannot-create-opengl-context-etc-under-android
 

If your Phone or tablet allows, try the:

FORCE 4X MSAA option.

 

Изменено пользователем Паршенко Виктор
Ссылка на комментарий
  • 0

Спасибо большое, Вы мне очень помогли, в самом низу комментариев нашел решение своей проблемы. Итак, все что нужно было сделать - выставить на форме Quality - SystemDefault

У меня стояло HighQuality

Итак первый пункт можно считать решенным!

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

Есть подозрение, что в 10.3. перестала работать функция Application.ProcessMessages. В 10.1 для Андроид она прекрасно работала, а теперь, как будто ее нет. Формы не перерисовываются, вовремя не отображаются те или иные вещи. На что можно заменить ее. Пример такой, создаю форму в рантайме и показываю ее пользователю. 

Application.CreateForm(TForm27, Form27);
  Form27.ProgressBar1.Visible := false;
  Form27.StartUpLabel.Text := 'Ждите...';
  Form27.Visible := true;
  Application.ProcessMessages;

 На андроид в 10.3. форму не вижу, хотя остальной код отрабатывает.

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

Попробуйте просто "обернуть" эту часть кода:

Application.CreateForm(TForm27, Form27); // можно это тоже внутрь Synchronize поместить

TThread.Synchronize(nil, procedure
begin

  Form27.ProgressBar1.Visible := false;
  Form27.StartUpLabel.Text := 'Ждите...';
  Form27.Visible := true;

end);

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

подниму тему, может у кого есть идеи

есть SplashScreen

по SplashScreen.onShow код

procedure TSplashForm.FormShow(Sender: TObject);
begin
  Application.CreateForm(TForm1, Form1);
  StartUpLabel.Text := 'Инициализация!!!';
  Label1.Text := VERSION;
end;

Соответственно я не только не вижу изменений, я вижу, что даже стиль из Stylebook, который лежит на Form1 не применяется.

procedure TSplashForm.FormShow(Sender: TObject);
begin
  Application.CreateForm(TForm1, Form1);
  Application.ProcessMessages;
  StartUpLabel.Text := 'Инициализация!!!';
  Label1.Text := VERSION;
  Application.ProcessMessages;
end;

Вот так все прекрасно работает на 10.1

Соответственно вопрос, как это добро переделать под Андроид на 10.3

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

10.3 не поддерживает processmessages. используйте поток.

Да, см пост от alexg. Но и в потоке тоже не работает, или я не правильно его применяю

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

Да, см пост от alexg. Но и в потоке тоже не работает, или я не правильно его применяю

Да, самое печальное, что и в потоке почему-то UI тоже через раз обновляется нормально, а через раз не хочет хоть убей и не поймешь почему.

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

Да, см пост от alexg. Но и в потоке тоже не работает, или я не правильно его применяю

    tthread.CreateAnonymousThread(procedure
    begin
     //Асинхронная логика
     sleep(xxx);
     tthread.Synchronize(nil, procedure begin
       (*Oбращения к методам и свойствам визуальных компонентов*)
     end);
    end).Start;

 

Изменено пользователем IS1
Ссылка на комментарий
  • 0

также не работает((( 

procedure TSplashForm.LoadProgramm;
begin
  Application.CreateForm(TForm1, Form1);

  tthread.CreateAnonymousThread(
    procedure
    begin
      // Асинхронная логика
       sleep(100);
      tthread.Synchronize(nil,
        procedure
        begin
          StartUpLabel.Text := 'Инициализация!!!';
          Label1.Text := VERSION;
        end);
    end).Start;
end;

Вот кусок кода, LoadProgramm вызывается при показу Splash формы. Я хочу после создания формы Form1 показать на сплэше текст "Инициализация!!!"

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

Может я совсем тупой, но я не могу этого понять.

Вот банальный пример, одна кнопка, один лэйбл.

Вот весь код

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Text:='2';
//application.ProcessMessages;
sleep(5000);
label1.Text:='3';
end;

end.

Как заставить это все работать без ProcessMessages? Хочу увидеть при нажатии на кнопку "2", затем "3". Пипец задачка(((((

Ссылка на комментарий
  • 0
5 минут назад, gonzales сказал:

Пипец задачка(((((

Костыль-драйвен-девелопмент)))

Создаем список с коллбеками и задержками.
В таймере пробегаемся по задержкам, и после каждой вызываем соответствующий коллбек.

Это на правах шутки.
Если честно, я сам не очень понимаю как разрулить такое нововведение. Нужно читать что пишет сама эмбаркадеро о этом новшестве. Должен же быть какой-то альтернативный способ.

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

В таймере пробегаемся по задержкам, и после каждой вызываем соответствующий коллбек.

:D да, еще создаем вставки на асме, , всего стопиццот строк кода и всего делов

8 минут назад, Barbanel сказал:

Должен же быть какой-то альтернативный способ.

Уже неделю вспахиваю интернет, но пока ничего внятного.

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

также не работает((( 


procedure TSplashForm.LoadProgramm;
begin
  Application.CreateForm(TForm1, Form1);

  tthread.CreateAnonymousThread(
    procedure
    begin
      // Асинхронная логика
       sleep(100);
      tthread.Synchronize(nil,
        procedure
        begin
          StartUpLabel.Text := 'Инициализация!!!';
          Label1.Text := VERSION;
        end);
    end).Start;
end;

Вот кусок кода, LoadProgramm вызывается при показу Splash формы. Я хочу после создания формы Form1 показать на сплэше текст "Инициализация!!!"

"tthread.Synchronize(nil," исправь на "tthread.Synchronize(tthread.CurrentThread"
Изменено пользователем #WAMACO
Ссылка на комментарий
  • 0
5 часов назад, gonzales сказал:

Как заставить это все работать без ProcessMessages?

Можно так

procedure TForm1.Button1Click(Sender: TObject);
begin
   Label1.Text := '2';
  tthread.CreateAnonymousThread(
    procedure
    begin
       sleep(1000);
      tthread.Synchronize( tthread.Currentthread,
        procedure
           begin
              Label1.Text := '3';
           end);
    end).
  Start;

end;
 

Изменено пользователем GASCHE
Ссылка на комментарий
  • 0
В 07.03.2019 в 16:46, GASCHE сказал:

Можно так

Можно. Но этот выход не выход)))

procedure TForm1.Button1Click(Sender: TObject);
var
a,b:integer;
begin
a := 1;
b := 2;
label1.Text:=inttostr(a);
//application.ProcessMessages;
sleep(2000);
a := a + b;
label1.Text:=inttostr(a);
//application.ProcessMessages;
sleep(2000);
a := a + b;
label1.Text:=inttostr(a);
//application.ProcessMessages;
sleep(2000);
end;

Боюсь представить, какой код будет в таком случае

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

Можно. Но этот выход не выход

Полностью с вами согласен, но каков вопрос...

 

8 часов назад, gonzales сказал:

Боюсь представить, какой код будет в таком случае

Да все просто использовать application.ProcessMessages и sleep не есть хорошо, и если это убрать и использовать таймер, то код будет довольно прост

procedure TForm1.Button2Click(Sender: TObject);
begin
  IF NOT Timer1.Enabled THEN BEGIN
     Label1.Text := '0';
     Timer1.Enabled := True;
  END;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Inc( LT );
   Label1.Text := inttostr( LT );
   Inc( iI );
   IF iI = 5 THEN BEGIN
      Timer1.Enabled := False;
      iI := 0;
      LT := 0;
   END;
end;

 

Изменено пользователем GASCHE
Ссылка на комментарий
  • 0
29 минут назад, GASCHE сказал:

Да все просто использовать application.ProcessMessages и sleep не есть хорошо, и если это убрать, то код будет довольно прост

sleep здесь исключительно для наглядности, и вообще весь код. Реальная задача: имеется окно заставки, на нем отображается процесс загрузки приложения. Не могу добиться нормального функционирования, потоки не помогают. Разве что действительно таймер использовать)))

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

sleep здесь исключительно для наглядности, и вообще весь код

 

21 час назад, gonzales сказал:

Можно. Но этот выход не выход)))

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

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

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

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

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

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

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

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

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

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

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

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

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