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

Лидеры

Популярный контент

Показан контент с высокой репутацией 23.07.2016 во всех областях

  1. Добрый день, коллеги! Хочу рассказать о выходе нашего нового продукта 1С-Рарус:Мобильное РМК Приложение написано в 10 версии Delphi (Seatlle), предназначено для автоматизации рабочего места кассира. Есть встроенный демо режим. Работа пока возможна только на планшетах, поддержка смартфонов в будущем. Готов воспринять критику, пожелания и ответить на вопросы.
    2 балла
  2. Итак, год спустя описываю решение проблемы. Исследования проводил в Берлине, но думаю рецепт подойдет и для младших версий. 1. Ошибка существует в файле FMX.TextLayout.GPU, поэтому копируем его в проект. 2. Убираем мусор при отрисовке кропнутого символа. Ищем в файле следующий фрагмент: ColoredGlyph := TFontGlyphStyle.ColorGlyph in Rec.Glyph.Style; if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := $FFFFFFFF; ACanvas.DrawBitmap(Rec.Bitmap, SrcR, R, Opacity); if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := LRun.Color; и заменяем его на if not R.IsEmpty then begin // Disable draw empty rect ColoredGlyph := TFontGlyphStyle.ColorGlyph in Rec.Glyph.Style; if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := $FFFFFFFF; ACanvas.DrawBitmap(Rec.Bitmap, SrcR, R, Opacity); if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := LRun.Color; end; Пояснение: при расчете области отрисовки R символа, мы можем получить "отрицательный размер", где Bottom будет меньше чем Top. Соответсвенно такой же неправильной становиться область источника SrcR и на экран вылазит мусор. 3. От мусора избавились, но если присмотреться к нижней границе текста, то можно увидеть, что отрезка не ровная, одни символы отрезаны больше, другие меньше. Для этого нужно исправить алгоритм расчета области отсечения. Для этого ищем комментарий //Checking for lines lower than bottom border - с него начинается ветка, в которую нужно внести изменения. Чуть далее ищем код Rec := AddOrGetChar(nil, Run.Chars[K], ChDic, Run.Font); X := MaxSize.Y - FFrame.Last.TopLeft.Y - Rec.Glyph.VerticalAdvance * FScaleFactor; и меняем его на Rec := AddOrGetChar(LayoutCanvas, Run.Chars[K], ChDic, Run.Font); X := MaxSize.Y - FFrame.Last.TopLeft.Y - ((Rec.SrcRect.Height + Rec.Glyph.Origin.Y) * FScaleFactor); Здесь пояснения дать сложнее, скажу только, что разработчики проигнорировали тот момент, что символы имеют разные размеры (например . и Ж) и считают отсечение не по размеру глифа символа а по экранному размеру символа, т.е. он будет одинаковый для всей строки, что неправильно, так как в дальнейшем данное отсечение применяется к глифу символа. P.S. А куда переехал CodeCentral, не нашел его в Берлине?
    2 балла
  3. Как узнать сколько свободного места на внутренней и внешней памяти (SD-карте)?
    1 балл
  4. На StackOverflow подсказали решение, адаптировал для Delphi (модуль для работы с процессами Android описан здесь): if TOSVersion.Check(5, 0) then begin TAndroidHelper.Activity.finishAndRemoveTask; Log('- finishAndRemoveTask - OK'); end else if TOSVersion.Check(4, 1) then begin TAndroidHelper.Activity.finishAffinity; Log('- finishAffinity - OK'); end else begin TAndroidHelper.Activity.finish; Log('- finish - OK'); end; TJProcess.JavaClass.killProcess(TJProcess.JavaClass.myPid); Log('- killProcess - OK');
    1 балл
  5. На вкладе Effects есть столько Эффектов, но зачем они нужны и как их использовать неизвестно. Хотелось бы узнать их возможности.
    1 балл
  6. Попробуйте запустить в режиме Debug-a запустить - прежде чем приложение умрет, оно выдаст ошибку, нажмите Break и посмотрите Call stack - возможно там будет видно где происходит ошибка.
    1 балл
  7. Ответ со Stackoverflow действительно помог! Из папки source/fmx берем FMX.Platform.Android.pas кладем в папку с проектом. Меняем в нем следующие процедуры: procedure TPlatformAndroid.RunOnUIThread(Proc: TThreadProcedure); begin //MainActivity.runOnUiThread(TSimpleProcedureRunner.Create(Proc)); CallInUIThread( procedure() begin Proc; end); end; procedure TPlatformAndroid.SynchronizeOnUIThread(Proc: TThreadProcedure); //var // Runner: TSimpleProcedureRunner; begin // CallInUIThread( // procedure() // begin // Runner := TSimpleProcedureRunner.Create(Proc); // MainActivity.runOnUiThread(Runner); // Runner.Event.WaitFor; // end); CallInUIThreadAndWaitFinishing( procedure() begin Proc; end); end; procedure TPlatformAndroid.SetClipboard(Value: TValue); //var // Setter: TClipboardSetter; //begin // Setter := TClipboardSetter.Create(Value.ToString); // TAndroidHelper.Activity.runOnUiThread(Setter); // Setter.Done.WaitFor(INFINITE); var Setter: TClipboardSetter; begin Setter := TClipboardSetter.Create(Value.ToString); CallInUIThread( procedure() begin SharedActivity.runOnUiThread(Setter); end); Setter.Done.WaitFor(INFINITE); end; function TPlatformAndroid.GetClipboard: TValue; //var // Getter: TClipboardGetter; //begin // Getter := TClipboardGetter.Create; // TAndroidHelper.Activity.runOnUiThread(Getter); // Getter.Done.WaitFor(INFINITE); // Result := Getter.Value; var Getter: TClipboardGetter; begin Getter := TClipboardGetter.Create; CallInUIThread( procedure() begin SharedActivity.runOnUiThread(Getter); end); Getter.Done.WaitFor(INFINITE); Result := Getter.Value; end; Запускаем и при нажатии на Edit или Memo клавиатура нормально появляется. PS. Надеюсь Embarcadero исправит эту проблему в новой версии. Да, помогло Видимо словить такой глюк могут аппараты Lenovo - что-то в их виртуальной клавиатуре не как у всех PS. Вопрос Бровину Ярославу: Будет ли исправлен Androidapi.Helpers.pas? Постоянно с ним какие-нибудь проблемы. В сервисах его даже подключать опасно, обязательно вылезают ошибки касающиеся TAndroidHelper.Activity С уважением, ... дата... подпись
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...