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

Anatoliy

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

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

  • Посещение

Активность репутации

  1. Like
    Anatoliy отреагировална Barbanel в Компоненты вкладки с другой формы/фрейма   
    Возможно: рывок происходит от того, что при смене владельца контролы отрисовываются первый раз (первый, это важно) на табконтроле.
    В момент первой отрисовки (емнип) компоненту создается и присваивается стиль, что ессно занимает некоторое время. При повтороной отрисовке стиль уже создан, потому все происходит быстро.
    Повторюсь, это мои догадки.
    Чтобы побороть именно этот случай, нужно компонентам заранее присваивать стиль программно, до первой отрисовки, т.е. до того как вы меняете родителя.
    Либо (я так не пробовал, не знаю сработает ли) отрисовать компоненты куданить в буффер, или в скриншот (или прямо на текущем родителе). Не уверен что это хороший вариант, пусть коллеги меня напинают).
    Мы в своем проекте все эти контролы расположили прямо на табах главной формы. Немного дольше длится первая загрузка, а потом все работает довольно плавно.
  2. Like
    Anatoliy отреагировална Tumaso в Обновить приложение   
    @Anatoliy
    разобрался? после Google Play быстро забываешь, что в AppStore (как и во всех продуктах Apple) ВСЁ через заднее место.
    Для уже опубликованных приложений в appstore обновление получается нужно через создание новой версии делать, а не через удаление текущей сборки.
  3. Like
    Anatoliy отреагировална Евгений Корепов в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  4. Like
    Anatoliy отреагировална dnekrasov в Компонент для вывода текста   
    TRectangle для цвета, TBevelEffect для утопленности и TText для текста. А можно сделать кастомный стиль для TLabel по тому же сценарию.
    Родителем. TText позволяет просто вывести текст, а TLabel, например, позволяет вывести текст с определённым стилем, указав StyleLookup.
     
  5. Like
    Anatoliy отреагировална jornada в Доступ к Yandex.Disk   
    Лучше поздно, чем никогда) Например так
    // RESTRequest1.AddFile(FileName);
     AStream := TMemoryStream.Create();
     AStream.LoadFromFile('D:\1.mp4');   
     RESTRequest1.AddBody(AStream, ctVIDEO_MP4);
  6. Like
    Anatoliy отреагировална Barbanel в Отправка кнопкой текущего приложения на задний фон в ios   
    Ну, по гайдам Эппла такая кнопка уже есть внизу по центру телефона, и ее не нужно изобретать заново.
    По гайдам, чтобы закрыть приложение нужно нажать на физическую кнопку "домой".
    Все.
    Все остальное делает ОС. Именно так, как вы описали.
    Мы тоже хотели сделать в приложении кнопку "выход", но посовещавшись отказались от нее.
     
    PS если же вам необходимо именно "выключить" приложение, чтобы оно не выполняло какие-либо действия в фоне - ловите событие перехода приложения в фон, и реагируйте соответственно.
     
  7. Like
    Anatoliy отреагировална Maka в Работа с TInAppPurchase   
    добавление поддержки подписки в FMX: http://delphitoptips.blogspot.com/2018/03/supporting-in-app-purchase.html
  8. Like
    Anatoliy отреагировална Slym в Артефакты на экране (Android)   
    Боролись как-то с артефактами отображения (мы их прозвали "крокодилами" из-за сходства на первом скриншоте с этим багом)...
    Могли отображаться также левые спрайты, или обрезки скролившихся контролов...
    Коллега выяснил что не надо трогать Form.Fill, из-за переключения в недрах FMX нативной и не нативной канвы: если нужен фон - брось Rect по контенту и в нем делай заливку...
  9. Like
    Anatoliy отреагировална beeoz в TExpander глюки при при isExpanded=False   
    Проблема сохранилась и в IDE Delphi Rio 10.3 . Причиной оказалось то, что в модуле FMX.StdCtrls в процедуре TExpander.UpdateControlSize указана переменная FContentHeight вместо FContent.Height
    procedure TExpander.UpdateControlSize(const ChangingState: Boolean); begin FChangingState := ChangingState; try if FIsExpanded then begin FContent.Visible := FIsExpanded; if FButton <> nil then Height := FButton.Height + FContent.Height; // здесь заменил FContentHeight на FContent.Height и заработало Repaint; end else begin Repaint; FContent.Visible := FIsExpanded; if FButton <> nil then Height := FButton.Height; end; finally FChangingState := False; end; end;  
  10. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в [Андроид] TAniIndicator   
    https://github.com/rzaripov1990/ZMaterialComponents
  11. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Создание канала для Пуша   
    http://docwiki.embarcadero.com/Libraries/Rio/en/System.Notification.TCustomNotificationCenter.CreateChannel
  12. Like
    Anatoliy отреагировална Tumaso в Обновить приложение   
    @Anatoliy
    сначала удалите текущую версию - мышкой подвести к колонке даты/времени текущей сборки, появится круглая красная иконка удаления. нажать и сборка удалится.
    после этого выбрать новую сборку - там и будет ваша новая версия. выбираете ее и отправляете на проверку
  13. Like
    Anatoliy отреагировална Tumaso в Обновить приложение   
    @Anatoliy
    сорри, я видимо наверное не правильно понял тебя. В консоли AppStore, когда загружаешь новую версию, нужно старый пакет удалить и там же выбрать пакет с новой версией. После этого отправляешь на проверку.
    После проверки, если она будет успешна, приложение обновится в магазине AppStore. Клиентам же оно попадет не сразу, тут нужно будет просто подождать.
  14. Thanks
    Anatoliy отреагировална Tumaso в Обновить приложение   
    Просто нужно подождать.
  15. Like
    Anatoliy отреагировална Nick Peterson в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    По итогу месяца работы на FMX хочу сказать - это глюкодром адский!:)) Вернулся бы обратно на VCL, но жаль потраченного месяца работы :))
    Несколько моментов, может кому будет интересно, кто пойдет по этому пути перевода проекта с VCL:
    1) рисование в буфере перед выводом на PaintBox (знаю что не обязательно, но именно в моей проге нужно, разные куски картинки готовятся в разное время)
    Инфы в одном месте не найти. Даже на этом форуме она не полна и в одном месте ошибочна:)
    XScale := GetWndScale(FormToHWND(OwnerForm)); // только так! Другие методы получения Scale не работают при // перетаскивании проги на другой монитор. w:=trunc(XScale * Image.Width); h:=trunc(XScale * Image.Height); // при перетаскивании на второй мониторе с другим масштабом Image.Width и Image.Height могут станут неверными. // Помогает только пересоздание хэндла формы (баг) If (bm.Width<>w) or (bm.Height<>h) then bm.SetSize(w,h); bm.Canvas.BeginScene; bm.Canvas.SetMatrix(TMatrix.CreateScaling( XScale, XScale) * Matrix); 1.1) Как нарисовать линию толщиной 1 пиксель? Этот простой вопрос отнял у меня пол дня:) Пришлось править код FMX.Canvas.D2D, по-другому никак не отключить антиалиасинг в битмапе. На форме его можно отключить свойством Quality, вот только его значения перепутаны - HighQuality на самом деле означает худшее качество с размытой графикой.
    Даже после отключения AA нужна еще 1 хитрость - чтобы линия (горизонтальная или вертикальная) получилась толщиной ровно 1 пиксель,  у меня получился примерно такой код
    procedure TCanvasHelper.LineToPix(xFrom, yFrom, xTo, yTo, Opacity: single); var pFrom, pTO: TPointF; xs: single; begin xs := Max(1, Matrix.m11); If xs > 1.1 then begin pFrom := PointF(xFrom, yFrom).Round; pTO := PointF(xTo, yTo).Round; end else begin pFrom := PointF(round(xFrom) + 0.5, round(yFrom) + 0.5); pTO := PointF(round(xTo) + 0.5, round(yTo) + 0.5); end; Stroke.Thickness := 1/xs; DrawLine( pFrom, pTO, Opacity); end; 2) Шрифты. Это жуть!:) Впрочем об этом пишут везде.
    Заставить в D2D канве (винда) работать ClearType не удалось
    (хотя при рисовании в битмапе как написано выше он у меня заработал, путем очередной правки FMX.Canvas.D2D. Надо еще отметить, что править системные коды я никогда не любил, и на VCL приходилось всего 1 раз, тут же у меня исходники очень быстро лишились девственности:))
    2.2) Шрифты и так выглядят не очень, но еще круче их портит свойство TAlign.Scale, из-за которого позиции контролов принимают не целые значения. Просто киньте на форму пару Label'ов с TAlign.Scale , запустите и начните медленно растягивать, наблюдая как мерцают и размыливаются буковки:))
    Вообще по итогу шрифты оказались самым неприятным моментом, все остальное кое-как правится, кроме внешнего вида приложения с замыленными шрифтами... (отключать D2D канву не предлагать!)
    Почему не доделали SetTextRenderingParams в FMX.Canvas.D2D.pas, почему не работает SetTextAntialiasMode - для меня пока загадка.
    3) Сворачивание приложения кликом по таскбару. Оно не работает:) (Почему за столько лет существования FMX никто этого не заметил? всем плевать, или никто не пользуется?) Да, на форуме есть пара решений, но они не идеальны, если у вас внимательные юзеры, они обязательно заметят странное мелькание приложения при разворачивании. Очередная правка системных кодов.
    4) FMX.TrayIcon.Win - штатного нет, но код выложенный на этом форуме работает идеально. Респект его автору. С ужасом думаю, что буду делать на MacOS..:)
    5) Если в TEdit нажать CTRL-V при пустом буфере, вылезает AV:) Правится не сложно, но блин, очередной системный юнит легко лишился девственности:))
    6) Выделение дабл-кликом на TEdit не работает..... (10.3) Хорошо что FMX.Edit.pas уже лежит в папке с проектом, долго искать не пришлось:))
    7) А на этот с виду несложный вопрос я так и не нашел ответа..
     
  16. Like
    Anatoliy отреагировална Barbanel в Сеть и энергосбережение   
    Писать сервис.
    Примеры были кажется даже на этом форуме.
  17. Like
    Anatoliy отреагировална FeLDMARShaL в [iOS] Полноценная фоновая работа приложения   
    В душе не знаю :), ниразу не пользовал и даже не устанавливал. Предполагаю проверить камунибуть и отписаться о результате. Вдруг что то забыл рассказать, но вроде все упомянул.
  18. Like
    Anatoliy отреагировална FeLDMARShaL в [iOS] Полноценная фоновая работа приложения   
    Расскажу о том как я добился нормальной фоновой работы приложения. В моем понимании нормальная фоновая работа приложения - это сохранять геокоординаты и систематически (по мере их накопления передавать на сервер). По сути у нас получился трекер. Те кто считают что iOS такое не умеет делать, и все что будет написано ниже это фейк лучше закройти эту тему. Итак начнем, по пунктам:
    1) Добавляем к проекту ключ NSLocationAlwaysAndWhenInUseUsageDescription - для новых иОС это обязательно, начиная с 11 или 12 версии уже не помню

    2) Сообщаем приложению о намерении что мы будем использовать геокоординаты в фоне (редактируем ключ UIBackgroundModes выставляя галочку напротив location)

    3) Далее  для того чтобы не поломать другие приложения которые используют геолокацию создаем специальную дерективу, которая будет сообщать о том что наше приложение будет использовать геолокацию в фоне, я ее назвал iOS_RequestAlwaysAuthorization

    4) Дальше намного сложнее, нам нужно исправить исходники самой Delphi, а именно System.iOS.Sensors. Изменять будем процедуру TiOSLocationSensor.DoStart, все что отличается от стандартного у меня в рамках описания моей директивы:
    function TiOSLocationSensor.DoStart: Boolean; var I: Integer; begin {$ifdef iOS_RequestAlwaysAuthorization} if TOSVersion.Check(8) and (FLocater <> nil) then FLocater.requestAlwaysAuthorization; {$else iOS_RequestAlwaysAuthorization} if TOSVersion.Check(8) and (FLocater <> nil) then FLocater.requestWhenInUseAuthorization; {$endif iOS_RequestAlwaysAuthorization} // check authorization if Authorized = TAuthorizationType.atUnauthorized then SensorError(SLocationServiceUnauthorized); // check if location sensor is enabled if not FLocater.locationServicesEnabled then SensorError(SLocationServiceDisabled); // start location updates if (LocationChange = TLocationChangeType.lctLarge) and CanUseSignifChangeNotifs then FLocater.startMonitoringSignificantLocationChanges else FLocater.startUpdatingLocation; // start heading updates if CanUseHeading then begin FLocater.startUpdatingHeading; end; // start monitoring regions if CanMonitorRegions then for I := 0 to Regions.Count - 1 do FLocater.startMonitoringForRegion(ConvLocationRegion(Regions[I])); Result := FLocater.locationServicesEnabled; if Result then Result := Authorized = TAuthorizationType.atAuthorized; {$ifdef iOS_RequestAlwaysAuthorization} FLocater.setAllowsBackgroundLocationUpdates(True); FLocater.setPausesLocationUpdatesAutomatically(False); {$endif iOS_RequestAlwaysAuthorization} end; Собственно усе, можно наслаждаться фоновой работой. Все это работает под Delphi 10.2.3. На телефоне iPhone 6s под управлением iOS 11. Как было сказано выше, работает как геолокация так и инет и вообще все остальные процессы внтури приложения, такие как TTimer
    Собственно вот результат данного трекера:

     
    Если приблизить то можно увидеть насколько точно и часто он обновляет координаты:

     
    И да, огромное спасибо человеку с ником Artyom Karapetyan, именно он натолкнул на мысль того как надо правильно все сделать
  19. Like
    Anatoliy отреагировална Alex7wrt в Передача звука с микровона в потоке от клиента серверу   
    Когда-то приводил пример в другой теме, но он на Delphi
     
  20. Like
    Anatoliy отреагировална haword в [IOS]Доступ к геоданным   
    а просто при запуске спрашивать пользователя что он из колорадо и предупретить что если врет то нарушает закон сша, не прокатит разве? обязательно вылавливать его местоположение по gps?
    да кстати, есть сервисы определяющие местоположение по ip адресу. 
  21. Like
    Anatoliy отреагировална FREEFAR в [IOS]Доступ к геоданным   
    А если так попробовать?
      if (NewLocation.Latitude.ToString = '0')
          or (NewLocation.Longitude.ToString = '0')
          or (NewLocation.Longitude.ToString = 'NAN')
          or (NewLocation.Longitude.ToString = 'NAN')
            then
              accessToAnyFrames := False
  22. Thanks
    Anatoliy отреагировална FREEFAR в [IOS]Доступ к геоданным   
    c apple все сложно ))) мне они тоже нервы потрепали.
    Я бы сделал так. Если Сенсор возвращает NAN или 0 то не отображал бы какой-нибудь функционал
  23. Thanks
    Anatoliy отреагировална FREEFAR в [IOS]Доступ к геоданным   
    Sensor не будет отдавать данные - такой вариант не подходит?
  24. Like
    Anatoliy отреагировална Brovin Yaroslav в Announcing the New Embarcadero Developer Community   
    Community is a huge part of what makes our products so useful. Many of us have been around since the CompuServe forums days. Today our community is spread out across many different locations, and in many different languages. We have huge Delphi communities on Google+ and Facebook, not to mention everyone on Stack Overflow answering questions, plus many C++Builder communities too.
    Our community site here is the central hub where we connect with you, publish blog posts, provide updates, etc. This current iteration of the community site has had a number of problems, so we've decided to retire it and move to a new community. In part of this move we are consolidating our Developer community onto IDERA's community. This doesn't mean we will mix database tools and developer tools. There are two different communities at the community.idera.com site. If you jump straight to community.idera.com/developer-tools/ you fill find yourself in our new developer tools community.
    Much of the content on this community site has been migrated to the new community. Effective today this community is read-only, and redirects will be in place soon, so head over to the new community and we will see you online!
     
     
    Просмотр полной статьи
  25. Like
    Anatoliy отреагировална Дениска в Как корректно завершить приложение?   
    Я решил это 2 способами!!
     
    Закрытие приложения по кнопке "Home":
     
    нужно в "...\iOSDevice\Release\myapp.info.plist" после строки "<string>ResourceRules.plist</string>" добавить строку "<key>UIApplicationExitsOnSuspend</key><true/>".
     
    Закрытие приложения по кнопке из приложения:
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin   Halt(0); //аварийное завершение end;     Удачи =)
×
×
  • Создать...