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

Андрей Рулин

Пользователи
  • Постов

    53
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Андрей Рулин стал победителем дня 9 октября 2019

Андрей Рулин имел наиболее популярный контент!

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения Андрей Рулин

  1. Можете тестовый пример скинуть, как вы читаете?
  2. В итоге решил проблему обходным путём. Сделал проверку репаинта. procedure TForm2.Label1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin RepaintFlag := True; end; В процедуре с таймером добавил. if not RepaintFlag then exit; К сожалению , как и говорил GASCHE пришлось убрать внешний цикл и заменять на 10 вызовов по таймеру, без убирания , увы не работает.
  3. Там у меня выше как раз 2 разных потока. Основной код в одно, обновление в другом. Или вы хотите , чтобы я вычисления вынес в дополнительный поток. К сожалению так не получится, т.к. у меня в реальной задаче идёт чтение из файла вместе с вычислениями. А на адройде чтение из файла идёт только в основном потоке. Я этот вопрос уже задавал в другой ветке, пока ни у кого не получилось чтение файла в побочном потоке. См. выше. К сожалению в побочном потоке не читаются файлы на Android. Только в основном. Я попробую выложить тестовую задачу, где будет это видно.
  4. Правильно. И после каждого inc(pc) ожидается , что будет ОТОБРАЖАТЬСЯ +1% Ну извините, это в тестовом коде можно убрать, а не в реальных. Данный код , это максимальное упращение кода в сотни строк, и в это упрощении ошибка всё ещё появляется. Cуть в том, чтобы выполнять вычисления и параллельно отображаеть ход этих вычислений. Если убрать цикл, это значит просто последовательно вести СНАЧАЛА вычисления, а ПОТОМ отображение. А если вычисления идут час. И что , мы должны час оставлять пользователя с зависшей программой? Это не дело! Наверное я очень плохо обясняю, попытаюсь то же сказать более формальный языком. УСЛОВИЯ ТЕСТИРОВАНИЯ. Delphi 10.4 , системы Windows , Android приведённый тестовый код. ОЖИДАЕМЫЙ РЕЗУЛЬТАТ для цикла for i := 0 to 9 do после КАЖДОГО изменения inc(pc); должно отображаться изменение на 1%, например 49%...50%...51% ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ (для Android) для цикла for i := 0 to 9 do изменения отображается ПОСЛЕ ЗАВЕРШЕНИЯ ЦИКЛА. В виде 40%...50%...60% (для всех вариантов кода). ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ (для Windows) cовпадает с ОЖИДАЕМЫМ РЕЗУЛЬТАТОМ для кода в посте от 29.12.2021 15:02
  5. Вот такой код работает в Windows. Но в андройде , увы и ах... По 10% прибавляет. unit Unit2; 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 TForm2 = class(TForm) Timer1: TTimer; Label1: TLabel; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; TThreadRenew = class(TThread) MainFlag : Boolean; constructor Create; Destructor Destroy; procedure Execute; override; procedure ChangeL2; end; var Form2: TForm2; ThreadRenew : TThreadRenew; pc: integer; Busy : Boolean = False; implementation {$R *.fmx} procedure TForm2.FormCreate(Sender: TObject); begin ThreadRenew := TThreadRenew.Create; end; procedure TForm2.Timer1Timer(Sender: TObject); var i,j,k:Integer; a:Double; begin if Busy then exit; Busy := True; if pc >=100 then begin Timer1.Enabled := false; ThreadRenew.MainFlag :=False; end else for i := 0 to 9 do begin for j := 0 to 5000 do for k := 0 to 10000 do begin a:=a+k/1000+k/500; end; inc(pc); Application.ProcessMessages; end; //inc(pc); Busy := False; end; constructor TThreadRenew.Create; begin inherited Create(False); //Автозапуск потока MainFlag := True; end; destructor TThreadRenew.Destroy; begin inherited Destroy; end; procedure TThreadRenew.ChangeL2; begin Form2.Label1.Text := format('%d%%', [pc]); // Form2.Invalidate; end; procedure TThreadRenew.Execute; begin while MainFlag do begin Synchronize(ChangeL2); //Synchronize(Form2.Invalidate); //Synchronize(Application.ProcessMessages); //if Stage>=4 then MainFlag := False //else Sleep(100); end; end; end.
  6. Да, вот выкладываю Debug.rar Там по 10% изменяется при максимальном j в 5000
  7. Вот как у вас и должно быть, чтобы по 1%. А у меня изменяется по 10% . А если вы j до 10 000 или 15 000 делаете , всё равно по 10% изменяется? Может у вас процессор быстрый? И я, если что компилировал в 10.4.
  8. Ну почему же, вот мы ваш код модифицируем и введём вычисления. procedure TForm2.Timer1Timer(Sender: TObject); var i,j,k:Integer; a:Double; begin if pc >=100 then begin Timer1.Enabled := false; exit; end; for i := 0 to 9 do begin for j := 0 to 5000 do for k := 0 to 10000 do begin a:=a+k/1000+k/500; end; inc(pc); Label1.Text := format('%d%%', [pc]); end; //inc(pc); end; Он даже в Windows будет обновляться по десяткам процентов , а надо , чтобы по единицам, причём даже если j до 10000 и более поставить, когда он не успевает завершить вычисления за отведённое время.
  9. Вот кстати по этому методу я написал следующий код procedure TThreadRenew.ChangeL2; begin Form2.Label2.Text:=IntToStr(CalibPercentw)+'%'; end; procedure TThreadRenew.Execute; begin while MainFlag do begin Synchronize(ChangeL2); //Synchronize(Form2.Invalidate); Sleep(1000); end; end; В Windows всё работает изменения идут ровно раз в секунду. В Андройде, увы... Как только вычисления заканчивается, тогда да, обновляет.
  10. Нет, так не работает. Возможно потому, что у меня основные вычисления идут в обработчике Timer1 Помогает добавить в обработчик if Timer1Busy then exit; Timer1Busy := True; И в цикле Application.ProcessMessages;
  11. Вот я по GetScreenScale нашёл интересную тему, тут разработчик подтверждает, что экран растягивает, если выставить разрешение меньше фактического. https://fire-monkey.ru/topic/24-получаем-разрешение-экрана-устройства-логические-и-физические-размеры-экрана-в-firemonkey/ Но если выставить больше, он не говорит, что происходит. Судя по документации https://docwiki.embarcadero.com/Libraries/Sydney/en/FMX.Platform.IFMXScreenService.GetScreenScale Коэффициент может быть только больше И плюс непонятно какие могут быть значения. В одном топике говорилось про 1, 1.5 ,2 . Тут фиксированный ряд или они могут быть любыми?
  12. У меня до этого все приложения были для ориентации Landscape. Я ставил разрешение, например 800x450 . После этого приложение растягивалось на любом телефоне, и всё работало. Теперь я сделал приложение с портретной ориентации и разрешением 720x1280 . И оно не помещается на экран - в телефоне отображается только часть экрана. Почему в одном случае растягивается , а в другом нет, и что нужно сделать для исправления ситуации?
  13. Версия Дельфи 10.4. Я создаю в assets папку img , и итоге при запуске приложения в лог у меня пишется /storage/emulated/0/Android/data/com.embarcadero.ИмяПриложения/files/img/имя_файла.jpg То есть , что надо, то он и пытается читать. Но при этом в Android32 всё происходит успешно, а в Android64 программа зависает. Кто виноват и что делать? ? P.S. В версии Android32 работает так(второй вариант ниже не проверял). WriteDebug('Image '+S+' will read'); TempStream := TFileStream.Create(S,0); //Может так всё же лучше //TempStream.LoadFromFile(S); Image2.MultiResBitmap.LoadItemFromStream(TempStream,1); TempStream.Free; В Android64 не работает ни так как выше , ни так: WriteDebug('Image '+S+' will read'); Image2.Bitmap.LoadFromFile(S); В Windows 32 работают оба варианта.
  14. Да, там одна картинка растягивалась , а при переносе кода я изменение размера удалил, так что мой глюк , не заметил.
×
×
  • Создать...