Перейти к содержанию
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
16 минут назад, krapotkin сказал:

и где расположен код

procedure TSplashForm.FormShow(Sender: TObject);
begin
{$IFDEF IOS}
 SplashForm.StartupTimer.Enabled:=true;
{$ELSE}
 SplashForm.LoadProgramm;
{$ENDIF}
end;

 

17 минут назад, krapotkin сказал:

интересно, а какая форма у вас получается главной?

Главной будет Form1. После загрузки приложения выполняется код

TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        SplashForm.StartUpLabel.text := 'Старт программы';
        application.MainForm := Form1;
        Form1.Show;
        SplashForm.Close;
      end);

 

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

а зачем тогда создавать form1?
может, дать потоку отработать, а на выходе он ее и создаст?

кроме того, я не уверен, что 

application.MainForm := Form1;

уже в процессе работы что-то там изменит. да еще и в андроиде.

раньше это точно не работало...

вообще понятие главной формы на андроид нафиг не сдалось.

мое видение -
1. создать обычным образом SplashForm. Она пусть и будет главной. неважно
2. запустить поток,
3. на выходе поток создает и показывает следующую форму. (при этом все равно будет тормозок на время создания формы)

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

а зачем тогда создавать form1

На ней подготавляваются объекты. 

Но вопрос то не в этом, вопрос, почему я не вижу изменений на сплэше? При чем тут form1?

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

возможно потому что это слишком быстро, или нужно просто видеть код целиком. потому что в начале все висит при создании form1

а потом запускается поток.

без полного кода и отладки тут нечего сказать, кроме упрощения 
вот это точно бессмысленно полностью
 

SplashForm.StartUpLabel.text := 'Старт программы';
...
SplashForm.Close;
Ссылка на комментарий
  • 0
В 14.05.2019 в 15:43, krapotkin сказал:

нужно просто видеть код целиком

ох))) тяжело это)))

 

У меня есть смутные сомнения, что придуманная мною конструкция работает в главном потоке.

Вот накидал пример, но он фризит приложение((

Если не трудно, посмотрите пожалуйста

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.StdCtrls, FMX.Controls.Presentation;

type
  TClient = class(TThread)
  public
    procedure Logic;
    constructor Create; Overload;
    destructor Destroy; Overload;
  end;

var
  Client: TClient;


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

var
  Form1: TForm1;

implementation

{$R *.fmx}

constructor TClient.Create;
begin
  inherited Create;

end;

destructor TClient.Destroy;
begin
  inherited;
end;

procedure TClient.Logic;
var
i:integer;
a:real;
begin
 for i := 0 to 100000000 do
   begin
     a:=i/3;
     if i mod 1000000 = 0  then
      begin
       TThread.Synchronize(nil,
        procedure
        begin
         form1.ProgressBar1.Value:=form1.ProgressBar1.Value+1;
        end);
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.ProgressBar1.Value := 0;
Client.Logic;
end;

end.

 

Ссылка на комментарий
  • 0
procedure TForm2.Button1Click(Sender: TObject);
var Iters:integer;
begin
  Iters:=100000000;
  TThread.CreateAnonymousThread(
    procedure
    var
    i:integer;
    a:real;
    begin
     for i := 0 to Iters do
     begin
       a:=i/3;
       if i mod 1000000 = 0  then
       begin
         TThread.Queue(nil,
          procedure
          begin
            ProgressBar1.Value:=ProgressBar1.Value+1;
          end);
       end;
      end;
    end).Start;
end;

и не надо никаких доп классов...
еще есть TTask... тоже полезно

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

"не надо никаких доп классов" и пошел спагетти-код)
если задача не в три строки, то доп. класс - это отличный выбор в сторону ремонтопригодности. тем более под капотом происходит ровно то же самое

@gonzales

главное в классе потока это procedure Execute; override; вот ее то и нет...

и вынос класса потока в отдельный модуль не даст вам ходить в form1, что несомненно, благо.

 глобальная переменная Client - зло

Обращение к переменной Form1 в методе класса Tform1 - не меньшее зло

procedure TForm1.ThreadTermProc(Sender:TObject);
begin
  showmessage('ой всё');
end;

procedure TForm1.Button1Click(...);
var th:TClient;
begin
  th := TClient.Create(true);
  th.pbar := ProgressBar1;
  th.OnTerminate:=TreadTermProc;
  th.Start;
end;
TClient=class(TThread)
public
  pbar: TProgressBar;
  procedure Execute; override;
end;

procedure TClient.Execute;
begin
  for i:=0 to xxxxxx do
  begin
    if i mod 1000 = 0 then 
    begin
      Synchronize(procedure begin pbar.position := i; end);
    end;
end;

писал на коленке. не проверял

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

и не надо никаких доп классов...
еще есть TTask... тоже полезно

Так понятно, что можно сделать. Но это лишь пример оторванный от реальности. Хочется понять, почему класс типа TThreat не работает в своем потоке.

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

главное в классе потока это procedure Execute; override; вот ее то и нет...

оо, спасибо. вот ее как раз и нет и в основной программе)))

13 минут назад, krapotkin сказал:

и вынос класса потока в отдельный модуль не даст вам ходить в form1, что несомненно, благо.

конечно, в основной программе именно так. но через синхронизацию в form1 все равно ходить надо))

14 минут назад, krapotkin сказал:

Обращение к переменной Form1 в методе класса Tform1 - не меньшее зло

а вот это не понял???

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

TForm1 это чертежи автомобиля
form1 это сделанный по этим чертежам экземпляр
не странно, если в чертежах будет упоминаться не колесо автомобиля вообще, а колесо конкретного авто А666ААА77РУ ?

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

в form1 все равно ходить надо

не надо

вы должны передать в поток ссылки на то, что ДЕЙСТВИТЕЛЬНО нужно. Мемо, лейбл, прогрессбар. А форму - не нужно.

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

вы должны передать в поток ссылки на то, что ДЕЙСТВИТЕЛЬНО нужно. Мемо, лейбл, прогрессбар. А форму - не нужно.

th.pbar := ProgressBar1;

Как тут?

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

Коллеги, добрый день!
Спасибо, что разобрали эту тему, спасибо за примеры кода и предложенные идеи. Убил на это неделю с лишним, и на самом деле во всем инете этот форум чуть ли не единственное место, где проблема обновления визуальных компонентов поднята и подробно рассмотрена.

Единственное, чего не хватает, это итогового примера кода. Ваш, Krapotkin, вариант (zip) не особо понятен, и в нем нет ProgressBar-а для наглядности. Восполняю этот пробел для потомков, у которых скоро кончится год отсрочки на 32битные приложения.

1787999948_.png.e9bdd16ef3bc15dc873fe744a8c37e5a.pngSplashForm example 10.3.3.zip

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

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

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

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

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

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

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

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

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

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

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

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