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

Лидеры

  1. Кривяков Виталий

    Кривяков Виталий

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


    • Баллы

      4

    • Постов

      79


  2. Pax Beach

    Pax Beach

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


    • Баллы

      2

    • Постов

      414


  3. rareMax

    rareMax

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


    • Баллы

      1

    • Постов

      553


  4. AngryOwl

    AngryOwl

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


    • Баллы

      1

    • Постов

      394


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

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

  1. Как узнать сколько свободного места на внутренней и внешней памяти (SD-карте)?
    1 балл
  2. Добрый день, коллеги! Хочу рассказать о выходе нашего нового продукта 1С-Рарус:Мобильное РМК Приложение написано в 10 версии Delphi (Seatlle), предназначено для автоматизации рабочего места кассира. Есть встроенный демо режим. Работа пока возможна только на планшетах, поддержка смартфонов в будущем. Готов воспринять критику, пожелания и ответить на вопросы.
    1 балл
  3. Сейчас попробую на интерфейсы перевести. Если не получится - буду вашим способом пользоваться(хотя для конечного пользователя гемор лишний будет). Спасибо за совет.
    1 балл
  4. Наверное самый простой способ, это поменять прототип функции на function TTelegramBot.API<T>(const Method: String; Parameters: TDictionary<String, TValue>): TtgApiResponse<T>; И возвращать Result := TtgApiResponse<T>.FromJSON(lHttpResponse.ContentAsString); Ну и соответственно уничтожать объект в вызывающем методе, после того, как он не нужен.
    1 балл
  5. Pax Beach

    Медиа громкость

    Управление громкостью звуковых потоков в Android: Модуль Androidapi.OpenSles.pas содержит готовые константы для управления громкостью с помощью метода контекста setVolumeControlStream: { Audio playback stream type values } { same as android.media.AudioManager.STREAM_VOICE_CALL } SL_ANDROID_STREAM_VOICE: SLint32 = $00000000; {$EXTERNALSYM SL_ANDROID_STREAM_VOICE} { same as android.media.AudioManager.STREAM_SYSTEM } SL_ANDROID_STREAM_SYSTEM: SLint32 = $00000001; {$EXTERNALSYM SL_ANDROID_STREAM_SYSTEM} { same as android.media.AudioManager.STREAM_RING } SL_ANDROID_STREAM_RING: SLint32 = $00000002; {$EXTERNALSYM SL_ANDROID_STREAM_RING} { same as android.media.AudioManager.STREAM_MUSIC } SL_ANDROID_STREAM_MEDIA: SLint32 = $00000003; {$EXTERNALSYM SL_ANDROID_STREAM_MEDIA} { same as android.media.AudioManager.STREAM_ALARM } SL_ANDROID_STREAM_ALARM: SLint32 = $00000004; {$EXTERNALSYM SL_ANDROID_STREAM_ALARM} { same as android.media.AudioManager.STREAM_NOTIFICATION } SL_ANDROID_STREAM_NOTIFICATION: SLint32 = $00000005; {$EXTERNALSYM SL_ANDROID_STREAM_NOTIFICATION} А библиотека Androidapi.JNI.Media.pas описывает специальный класс TJAudioManager для работы с медиа.
    1 балл
  6. На 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 балл
  7. Итак, год спустя описываю решение проблемы. Исследования проводил в Берлине, но думаю рецепт подойдет и для младших версий. 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, не нашел его в Берлине?
    1 балл
  8. Сталкивались. По началу очень много)) Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize. Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов. НО! Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки. Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок. Тут есть еще одно НО ))) Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза! Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них... Как-то так)
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...