Alex7wrt

Пользователи
  • Публикаций

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

  • Посещение

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

    23

Весь контент Alex7wrt

  1. Да Можете также попробовать комбинацию TRectangle + TText Утопленность и фон в таком случае задаете соответственно свойствами Stroke и Fill у TRectangle
  2. Добрый день Выводите текст в событии OnPaint
  3. Alex7wrt

    [Андроид] TAniIndicator

    Равиль Зарипов написал модуль для ровной отрисовки под Android, который здесь используется. Поищите по запросу FMX.ZNativeDrawFigure
  4. Когда-то приводил пример в другой теме, но он на Delphi
  5. Добрый день Знаю, что с ноября в Google Play можно обновлять приложения только для TargetSDK не ниже 26. Но до этого момента этой функцией я не пользовался, оставляя в Манифесте все по дефолту, то есть и minSDK и targetSDK равны 14. Понятно, что от этого никуда не уйти, но в связи с этим меня больше всего интересует вопрос, если я обновлю приложение с targetSDK равным 26 или 27, смогут ли это приложение установить новые пользователи? При загрузке версии в Google Play появляется предупреждение, но из него ответ конкретно на мой вопрос не ясен. На данный момент около 25% пользователей, ежедневно устанавливающих данное приложение, имеют SDK 22 (Android 5.1) и ниже. И меня интересует, смогут ли такие пользователи устанавливать версию приложения, если я обновлю его до targetSDK 26 или 27? И также, есть ли разница, если выставить targetSDK 26 или 27? P.S. В данном приложении не используются никакие разрешения. Только доступ в интернет
  6. Alex7wrt

    Вопрос "События OnClick в MyClass"

    В первом примере, когда создаете наследника какого-либо класса (в вашем случае TObject), не забывайте наследовать параметры от родительского класса и переопределять базовые методы Constructor Create(NewId:integer;NewNGP:string); overload; constructor MyType.Create(NewId:integer;NewNGP:string); Var RectForButt:TRectangle; begin inherited Create; ......
  7. Написанию 64-битных приложений не удовлетворяет ни одна версия Rad Studio, включая и ту, которая еще не вышла (10.3). В планах Embarcadero добавить поддержку 64 бит под Android позже в 19-м году. Думаю, механизм внедрения этой фичи будет такой же, как сейчас с TargetSDK. То есть старые приложения, уже размещенные в маркете, никто трогать не будет, но обновления и новые приложения уже нельзя будет выпускать только в 32-битном исполнении.
  8. Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android. Может быть, эта информация кому-нибудь поможет В документации Android высота баннера должна вычисляться так: Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом: const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким: procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;
  9. Если не ошибаюсь, автор писала, что OpenDialog работает нормально, но ей нужен диалог выбора папки, а не файла. SelectDirectory не устраивает по интерфейсу, поэтому пришлось использовать TFileOpenDialog из VCL, с которым и проблемы. Но у меня есть подозрения, что при использовании TFileOpenDialog из VCL, SelectDirectory берется из модуля VCL.FileCtrl, а не FMX.Dialogs, из-за чего у него "устаревший" интерфейс. Для автора: попробуйте такой код, посмотрите, изменится ли внешний вид диалога procedure TForm1.Button1Click(Sender: TObject); var st: string; begin FMX.Dialogs.SelectDirectory('Открыть папку','C:\',st); end;
  10. Не совсем понятно насчет неудобного дизайна SelectDirectory (В первом сообщении темы вы пишете, что у него слишком устаревший вид) Вот выбор файла через TOpenDialog А вот выбор папки через SelectDirectory: По-моему дизайн у них один и тот же. UPD. Может быть, вы используете Vcl.FileCtrl.SelectDirectory, а не FMX.Dialogs.SelectDirectory?
  11. Возможно, проблема в том что в VCL и FMX по-разному реализована работа с окнами. Пока в голову приходят два варианта и оба касаются исходного кода компонентов TFileOpenDialog либо TOpenDialog: 1. В исходниках кода TFileOpenDialog переделать работу с контекстом родительского окна под FMX. Вместо Handle окна использовать WindowHandleToPlatform(Handle).Wnd 2. В исходниках TOpenDialog разрешить нажатие на 'ОК' без выбора файла. Для этого скопируйте в папку проекта модули, в которых реализован функционал TFileOpenDialog или TOpenDialog и поэкспериментируйте с ними.
  12. Добрый день Проверил поведение TOpenDialog в своей программе в полноэкранном режиме. При переключении на другие программы и обратно окно диалога никуда не исчезает. Сложно сказать, чем вызвано подобное поведение диалога в вашем случае. Возможно стоит проверить код в обработчиках событий формы. Также, рекомендую поиграться со свойствами формы BorderStyle, FullScreen, WindowState. В частности, попробуйте BorderStyle = None; FullScreen = true; WindowState = wsMaximized.
  13. var Player: JMediaPlayer; Единожды создаете плеер и готовите файл: Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('Путь_к_файлу')); Player.prepare; И, когда потребуется, запускаете воспроизведение Player.start; В uses нужно добавить что-то из этого: FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.AdMob, Androidapi.JNI.App, Androidapi.JNIBridge, FMX.Advertising, FMX.Platform.Android, Androidapi.JNI.Embarcadero Не помню уже, что именно. Ненужные уберите
  14. Alex7wrt

    Размеры формы на разных устройствах

    var ScreenService: IFMXScreenService; scale: single; begin if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then scale:=ScreenService.GetScreenScale; end; Эту фишку придумали не разработчики FireMonkey. Коэффициент масштаба экрана используется и в iOS, и в Android. Введен он для более удобного перевода ПО под новые экраны. Смысл в том, что оперируя тем же логическим размером экрана, ПО автоматически отрисовывает изображение на другом физическом разрешении.
  15. Alex7wrt

    Реализовать рейтинг

    Да все норм. Мне самому рисунок не очень понравился )) Рисовал его в ворде года два назад, когда хотел понять, как удобнее рисовать звезду. Когда понял, то рисунок уже не было смысла доводить до ума, так что таким он и остался. Но вот щас все-таки решил доделать. Исправил изображение )
  16. Alex7wrt

    Реализовать рейтинг

    Не приходилось )) Это рисунок звезды вызывает такие ассоциации? )
  17. Alex7wrt

    Реализовать рейтинг

    Надеюсь, что в предыдущем посте помог ответить на первую часть вопроса. Если каждая звезда организована отдельным компонентом, то, соответственно, вы всегда можете узнать по какой звезде был клик и раскрасить все звезды до нее (включительно) в желтый цвет. Ниже скинул программку для герерации TPathData звезды, может пригодится star generator.zip Можно использовать генерируемую строку TPathData, или использовать код procedure star; var i: byte; a1,a2: single; begin Path.Clear; Path.MoveTo(PointF(0,-r)); a1:=Pi/5-Pi/2; a2:=-Pi/2; for i:=1 to 5 do begin Path.LineTo(PointF((r*cos(Pi/5)-d)*cos(a1+(i-1)*2*Pi/5),(r*cos(Pi/5)-d)*sin(a1+(i-1)*2*Pi/5))); Path.LineTo(PointF(r*cos(i*2*Pi/5+a2),r*sin(i*2*Pi/5+a2))); end; Path.ClosePath; path.Translate(r*cos(Pi/10),r); end; Где R - радиус описанной окружности вокруг звезды. В програме он равен 100. d - Разность радиусов внешней и внутренней окружности согласно рисунка
  18. Alex7wrt

    Реализовать рейтинг

    Не совсем понял, какой рейтинг имеется ввиду. Внутренний рейтинг в приложении? Добавить 5 переменных целочисленного типа, которые будут хранить количество выставленных оценок от 1 до 5. С помощью TPathData нарисовать звезду. Создать 5 компонентов TPath и в обработчике OnTap или OnClick каждого увеличивать соответствующую переменную на единицу. И для оценки рейтинга вычислять среднее арифметическое: (a1 + a2*2 + a3*3 + a4*4 + a5*5)/(a1 +a2 +a3 + a4 + a5)
  19. Спасибо за ответ. Правильно ли я вас понял, что ваши приложения с TargetSDK 26 именно устанавливают новые пользователи с Android 5.1 и ниже, а не обновляют уже установленное приложение? И как насчет TargetSDK 26 или 27 - будет ли разница в этом плане?
  20. Такого обработчика нет. Можете написать аналогично обработчику OnResize в FMX.Controls.pas. Для этого в тех методах, которые вызывают изменение положения контрола, нужно проставить соответствующие маркеры, чтобы менять значение свойства типа: property OnChangePosition: TNotifyEvent read FOnChangePosition write FOnChangePosition;
  21. Уточнение: после обновления до MIUI 10 снова появилась черная полоса снизу. При этом в сторонних приложениях ее не наблюдалось. Следовательно, приведенное выше решение неполноценно. Решение: добавить строку android:resizeableActivity="true" в секцию Activity <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <%application-meta-data%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:resizeableActivity="true" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <meta-data android:name="android.max_aspect" android:value="2.1" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  22. Так происходит потому что вы делаете проверку с помощью ShowMessage. При этом панель теряет фокус и любое движение мыши над ней снова вызывает OnMouseEnter. Проверяйте так: добавьте на форму компонент TText и в обработчике панели OnMouseEnter напишите: text1.Text:=text1.Text+#13+'asdasd'; Вы увидите, что событие срабатывает корректно
  23. Ответил в личку, так как это уже другая тема