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

Yarpda

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

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

  • Посещение

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

    8

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

  1. Like
    Yarpda отреагировална nassl в Координата в процессе свайпа   
    Отвечу сам себе, чтобы не потерять .
    Итак, хочется ловить жесты влево, вправо и после лонгтап считывать координаты точки касания. В частности изменяется размер TImage, который скрывается по окончании свайпа запуском анимации в которой Opacity меняется от 1 до 0}.
    TPointF P, OldP;
    void __fastcall TForm1::FormGesture(TObject *Sender, const TGestureEventInfo &EventInfo,
              bool &Handled)
    {
     if (EventInfo.Flags.Contains(TInteractiveGestureFlag::gfBegin))
     {  switch (EventInfo.GestureID)  { case igiLongTap: OldP.y=EventInfo.Location.y;   OldP.x=EventInfo.Location.x; }
     }
     else if(EventInfo.Flags.Contains(TInteractiveGestureFlag::gfEnd))
           {//Жест закончен - не убирать, иначе не сработает TTouchAction::Up   }
     else
      {switch (EventInfo.GestureID)
       {case sgiRight:  DosomethingRight(); break;
        case sgiLeft:     DosomethingLeft();   break;
        case igiPan:      P.y=EventInfo.Location.y;   P.x=EventInfo.Location.x;  break;
       }
     }
    }
     //---------------------------------------------------------------------------
    void __fastcall TForm1::FormTouch(TObject *Sender, const TTouches Touches, const TTouchAction Action)
    {if (Action==TTouchAction::Up)  //Палец убран
      {// Обработка концовки свайпа, например
       FloatAnimation1->Start(); 
      }
    }
    void __fastcall TForm1::FloatAnimation1Finish(TObject *Sender)
    { Image->Visible=false;Image->Opacity=1;}
    ...........................................................
    PS советы по улучшению кода приветствуются, но у меня получилось так.
     
     
  2. Like
    Yarpda отреагировална Brovin Yaroslav в Как убить кнопку кликнув на нее саму   
    @kami все правильно написал. Используйте просто ForceQueue. А внутри либо отлинкуйте контрол от родителя и вызовите Free, либо брутально дергайте DisposeOf.
    P.S. документация http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.ForceQueue
  3. Like
    Yarpda получил реакцию от petyaas в Ура! Вышла 10.3 Rio!   
    Если планируется выставлять на playmarket то Рио (поддержка 26 targetsdk), если нет то Берлин постабильнее как по мне. Хотя если начинать то лучше сразу на Рио. Переходить все равно придется ..
  4. Like
    Yarpda получил реакцию от Ingalime в Ура! Вышла 10.3 Rio!   
    Если планируется выставлять на playmarket то Рио (поддержка 26 targetsdk), если нет то Берлин постабильнее как по мне. Хотя если начинать то лучше сразу на Рио. Переходить все равно придется ..
  5. Like
    Yarpda отреагировална Евгений Корепов в Как застать TWebBrowser обрабатывать адреса эл. почты (Android)   
    Прошу прощения, я ввел вас в заблуждение (тестировал на одном своем проекте). Открытие подобных ссылок вы должны делать самостоятельно, обрабатывая событие браузера ShouldStartLoadWithRequest.
    Вот код:
    uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, {$ENDIF ANDROID} FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser, FMX.Controls.Presentation; ..... const ConstMainURL = 'http://www.docme.ru/contacts'; .... procedure THeaderFooterForm.WebBrowser1ShouldStartLoadWithRequest( ASender: TObject; const URL: string); begin if Not URL.StartsWith(ConstMainURL) then // Если ссылка перехода отличается от базовой, то открываем ее через активити begin WebBrowser1.Stop; OpenURL(URL); end; end; procedure THeaderFooterForm.OpenURL(const AUrl: string); {$IFDEF ANDROID} var Uri: Jnet_Uri; OpenLinkIntent: JIntent; {$ENDIF ANDROID} begin {$IFDEF MSWINDOWS} ShellExecute(0, 'open', PChar(AUrl), nil, nil, SW_SHOWNORMAL); {$ENDIF MSWINDOWS} {$IFDEF ANDROID} Uri := StrToJURI(AUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); TAndroidHelper.Activity.startActivity(OpenLinkIntent); {$ENDIF ANDROID} end; И прикрепляю ваш проект с моими изменениями
    WebPrj.zip
  6. Like
    Yarpda отреагировална slav_z в Работа с атрибутами текста   
    Как сделать текст с подобными атрибутами? Очень просто!
    (Цвет текста не работает в XE8) Вот весь код:
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.UIConsts, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.TextLayout; type TForm1 = class(TForm) Button1: TButton; Text1: TText; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} type TTextAccess = class(TText); procedure ClearTextAttribute(Text: TText); begin TTextAccess(Text).Layout.ClearAttributes; end; procedure AddTextAttribute(Text: TText; Pos,Length: Integer; FontStyles: TFontStyles; FontColor: TAlphaColor); var Font: TFont; begin Font:=TFont.Create; Font.Assign(Text.Font); Font.Style:=FontStyles; TTextAccess(Text).Layout.AddAttribute( TTextRange.Create(Pos,Length), TTextAttribute.Create(Font,FontColor)); end; procedure TForm1.Button1Click(Sender: TObject); begin AddTextAttribute(Text1,10,17,[TFontStyle.fsBold],claRed); AddTextAttribute(Text1,34,8,[TFontStyle.fsUnderline],claBlue); AddTextAttribute(Text1,47,8,[TFontStyle.fsStrikeOut],claGreen); Text1.Repaint; end; end.  
  7. Like
    Yarpda получил реакцию от Ingalime в В 10.2 работает, а в RIO зависает при присвоении медиа-файла   
    Нет, там права ни при чем. Даже внутренние файлы проекта (прописанные в деплоймент) под Адндроид перестает нормально играть, хотя и открывает. Но любая навигация, остановка и снова воспроизведение выдает невиданные глюки. (звуки задваиваются, видео то стоит то то вдруг начинает идти, потом просто вылетает приложение... Но связь четкая. Ставишь Tarket SDK 23 - нормально, ставишь 24 и выше - привет. ( это я еще на берлине заметил), а в RIO по умолчанию 26, там сразу что-попало...
  8. Like
    Yarpda отреагировална Tumaso в В 10.2 работает, а в RIO зависает при присвоении медиа-файла   
    TMediaPlayer в android и ios вообще никогда стабильно не работал, и targetSDK тут даже не причем. Он кривой сам по себе изначально, смиритесь.
    Стабильное решение медиаплейера есть в библиотеке alcinoe,  но там поддерживается пока только tokyo, поддержка rio будет позже.
  9. Like
    Yarpda отреагировална #WAMACO в Работа с календарем Google   
    описание
    http://www.tmssoftware.biz/Download/Manuals/tmsfmxcloudpackdevguide.pdf
     
  10. Like
    Yarpda отреагировална #WAMACO в Работа с календарем Google   
    Работал только через TMS FMX Cloud Pack, там все просто.
  11. Like
    Yarpda отреагировална Евгений Корепов в Проигрывание стандартных звуковых эффектов 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
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  12. Like
    Yarpda получил реакцию от Brovin Yaroslav в Не могу вывести локальное уведомление   
    Ну это я видел. Хотелось бы все-таки рабочий пример на FireMonkey (мы же на специализированном форуме FM)...
    Пытался на основе официального примера по наитию так:
    Var Notification: TNotification; Channel :TChannel; begin { verify if the service is actually supported } Notification := NotificationC.CreateNotification; try Channel := NotificationC.CreateChannel('MyCh','Описание'); Channel.Importance := TImportance.Default; Notification.Name := 'MyNotification'; Notification.AlertBody := 'Delphi for Mobile is here!'; Notification.ChannelId := 'MyCh'; Notification.FireDate := Now; { Send notification in Notification Center } NotificationC.PresentNotification(Notification); { also this method is equivalent if platform supports scheduling } //NotificationC.ScheduleNotification(Notification); finally Notification.DisposeOf; end; В таком случае ничего не выводится. Подозреваю что что-то не хватает. Но что именно...
    P.S. как вообще можно делать подобные вещи не оставляя каких-либо описаний или рабочих примеров в новом функционале?
  13. Like
    Yarpda отреагировална Yuriy2606 в API level 26 ??? Всё таки как выложить приложение на Play Market?   
    Большое спасибо за ответ. Еще раз внимательнее все проверив у меня все таки получилось динамически запросить разрешения при помощи KastriFree  в Berline
       
    Запрос сделал так
    {cPermissionACCESS_COARSE_LOCATION = 'android.permission.ACCESS_COARSE_LOCATION'; cPermissionACCESS_FINE_LOCATION = 'android.permission.ACCESS_FINE_LOCATION'; cPermissionACCESS_NETWORK_STATE = 'android.permission.ACCESS_NETWORK_STATE'; cPermissionCALL_PHONE = 'android.permission.CALL_PHONE'; cPermissionCAMERA = 'android.permission.CAMERA'; cPermissionINTERNET = 'android.permission.INTERNET'; cPermissionREAD_EXTERNAL_STORAGE = 'android.permission.READ_EXTERNAL_STORAGE'; cPermissionREAD_PHONE_STATE = 'android.permission.READ_PHONE_STATE'; cPermissionWAKE_LOCK = 'android.permission.WAKE_LOCK'; cPermissionWRITE_EXTERNAL_STORAGE = 'android.permission.WRITE_EXTERNAL_STORAGE'; } FRequester.RequestPermissions([cPermissionACCESS_FINE_LOCATION,cPermissionACCESS_COARSE_LOCATION,cPermissionREAD_EXTERNAL_STORAGE, cPermissionWRITE_EXTERNAL_STORAGE, cPermissionCAMERA], cPermissionsCodeExternalStorage); Обработка так
    procedure TForm1.PermissionsResultHandler(Sender: TObject; const ARequestCode: Integer; const AResults: TPermissionResults); begin case ARequestCode of cPermissionsCodeExternalStorage: begin if AResults.AreAllGranted then DoShow; //Что-то делаем else ShowMessage('You need to grant all required permissions for the app to be able to take photos!'); end; cPermissionsCodeSMS: begin if AResults.AreAllGranted then ShowMessage('SMS permissions granted') else ShowMessage('You need to grant all required permissions for the app to be able to handle SMS!'); end; end; end; Там в коде примера KastriFree все описано более подробно
    https://www.delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/
    Вот ссылка, это для тех, у кого Berlin
  14. Like
    Yarpda отреагировална tLink в изменение targetSdkVersion и артефакты на экране   
    Может это  поможет.
  15. Like
    Yarpda отреагировална rareMax в [Android] как вы решаете проблему с таймаутом?   
    System.Net.HttpClient.THttpClient попробуй
  16. Like
    Yarpda отреагировална Tumaso в Переход на новую модель разрешений   
    @Alex7wrt,
    устанавливают в том числе и новые пользователи на старых версиях андроида, и у них работает. minSdkVersion для этого.
    Что касается targetSDK, то этим значением приложение уведомляет операционку, что возможно будет использовать api вплоть до данной версии. targetSDK 27 пока не использовал, только 26, и все что надо работает.
    В самом коде делаю анализ текущей версии SDK, и в зависимости от нее возможно делаю дополнительные действия. Вот например, работа с правами:
    {$IFDEF ANDROID} // для Android 6+ требуется дополнительная работа с правами if TJBuild_VERSION.JavaClass.SDK_INT >= 23 then begin if (TAndroidHelper.context.checkSelfPermission( StringToJString(PERMISSION_FILE_READ) ) = TJPackageManager.JavaClass.PERMISSION_DENIED) or (TAndroidHelper.context.checkSelfPermission( StringToJString(PERMISSION_FILE_WRITE) ) = TJPackageManager.JavaClass.PERMISSION_DENIED) then begin // необходимо запросить разрешение на использование галереи LIsWaitPermissions := True; TAndroidHelper.Activity.requestPermissions( CreateJavaStringArray([PERMISSION_FILE_READ, PERMISSION_FILE_WRITE]), BUTTON_FILE ); end; end; {$ENDIF}  
  17. Like
    Yarpda отреагировална WebPuper в Механизм работы с APK Extension file (OBB)   
    В FMX, насколько я смог удостовериться, нет нормальных директив чтобы работать с OBB. Видимо посчитали это излишним, т.к. по сути речь идет о работе с обычной файловой системой.
    После распаковки приложения в каталоге внешнего хранилища (карты или, если нет, внутренней памяти)  Android/obb/<application ID>/ появится файл дополнений с расширением *.obb 
    Это обычный архив ZIP и его можно распаковать, например, в GetDocumentsPath средствами TZipFile
    Проблема в том, что в FMX нет процедуры возвращающей путь к файлу obb. 
    Пришлось написать костыль: 
    UnicodeString GetObbFile() { UnicodeString str = StringReplace(System::Ioutils::TPath::GetPublicPath(), "/data/", "/obb/", TReplaceFlags()); str = StringReplace(str, "/files", "/", TReplaceFlags()); TSearchRec sr; FindFirst(str + "*.obb", faAnyFile, sr ); return str + sr.Name; } Теперь у вашего приложения есть путь к единственному obb
  18. Like
    Yarpda отреагировална mmover в Компонент для отображения текста с форматированием или HTML   
    Судя по картинкам, вот эта библиотека умеет : https://github.com/Zeus64/alcinoe
  19. Like
    Yarpda отреагировална x11 в Подключение к БД Firebird из Android   
    Библиотеку нужно не забыть добавить в Deployment (release и debug).
    У меня рядом с папкой проекта есть, т.е. на одном уровне, папка media, где лежат иконки, картинки, so-библиотеки и прочий мусор для деплоя.
    В столбце Remote path указываем ".\assets\internal\db". Открываем "Project/Deployment", выбираем конфигурацию над таблицей,  жмякаем слева + и выбираем файл. Только обрати внимание ,что галочка слева должна быть отключена.
    В проекте, в процедуре подключения к базе есть строка:
    ClientLibrary := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db' + PathDelim + 'libfbclient.so.3.0.2'; ну или "'libfbclient.so.2'", в зависимости от версии Firebird сервера: 2.5 или 3.0.
    Не забудь добавить в USES модуль System.IOUtils.
     
    Сразу напишу, что Андроид, как и Линукс туповаты, поэтому подключиться к хост-машине с Firebird по имени компьютера не получится.
    По крайне мере у меня не получилось.
    Поэтому в качестве адреса (параметр "Data Source") выступает IP адрес.
     
    Собираем строку подключения:
     
    UniConnectionFB.ConnectString := 'Provider Name=InterBase;' + 'Data Source=' + server +';' + 'Database=' + Database + ';' + 'Port=' + port +';' + 'User ID=' + Username +';' + 'Password=' + Password + ';'+ 'Client Library=' + ClientLibrary + ';' + 'Character Set='+ CharacterSet + ';' + 'Use Unicode=True;Login Prompt=False';  

  20. Like
    Yarpda отреагировална Вадим Смоленский в Обработка анимированных GIF по рецепту китайского коллеги   
    Год назад в одной из веток проскочила ссылка на китайский сайт (http://www.raysoftware.cn/?p=559), где предлагалось готовое решение для показа анимированных гифок средствами FireMonkey на любых платформах. Сейчас эта ссылка, как и весь сайт raysoftware.cn, упорно не открывается; по счастью, контент сохранился в гугловском кэше. Я скопировал оттуда код юнита и перевел гуглом все китайские комментарии на английский, добавив их в скобках. Там был еще сопроводительный текст, в котором автор излагал мотивы, побудившие его взяться за эту проблему; каких-то важных технических деталей я в этом тексте не увидел.
    Привожу весь юнит ниже и очень надеюсь, что кто-нибудь из продвинутых коллег объяснит мне, как именно этим кодом можно воспользоваться, чтобы показать пользователю анимированный файл в формате GIF. Моей программерской квалификации, к сожалению, не хватает.
     
  21. Like
    Yarpda получил реакцию от Rusland в Узнать отображаемый размер видео на контроле Mediaplayer   
    В копилку знаний. Напишу как решил задачу. Может кому-то будет интересно.
    Таких как мне надо параметров у  MediaPlayer'a конечно нет. Но есть свойство VideoSize.X и Y там можно посмотреть реальный размер воспроизводимого видео в пикселях. 
    Берем эти значения, делим высоту на ширину и выясняем астект (соотношение сторон). После чего берем ширину контейнера в котором отображает видео на форме и умножаем на этот аспект. Получаем нужную высоту контейнера. В итоге если у вас контейнер видео с привязкой Top, Bottom то его размер всегда будет пропорционально равным размеру проигрываемого видео-файла, что избавит от ненужный черных рамок.
     
  22. Like
    Yarpda получил реакцию от FREEFAR в Узнать отображаемый размер видео на контроле Mediaplayer   
    В копилку знаний. Напишу как решил задачу. Может кому-то будет интересно.
    Таких как мне надо параметров у  MediaPlayer'a конечно нет. Но есть свойство VideoSize.X и Y там можно посмотреть реальный размер воспроизводимого видео в пикселях. 
    Берем эти значения, делим высоту на ширину и выясняем астект (соотношение сторон). После чего берем ширину контейнера в котором отображает видео на форме и умножаем на этот аспект. Получаем нужную высоту контейнера. В итоге если у вас контейнер видео с привязкой Top, Bottom то его размер всегда будет пропорционально равным размеру проигрываемого видео-файла, что избавит от ненужный черных рамок.
     
  23. Like
    Yarpda получил реакцию от #WAMACO в Узнать отображаемый размер видео на контроле Mediaplayer   
    В копилку знаний. Напишу как решил задачу. Может кому-то будет интересно.
    Таких как мне надо параметров у  MediaPlayer'a конечно нет. Но есть свойство VideoSize.X и Y там можно посмотреть реальный размер воспроизводимого видео в пикселях. 
    Берем эти значения, делим высоту на ширину и выясняем астект (соотношение сторон). После чего берем ширину контейнера в котором отображает видео на форме и умножаем на этот аспект. Получаем нужную высоту контейнера. В итоге если у вас контейнер видео с привязкой Top, Bottom то его размер всегда будет пропорционально равным размеру проигрываемого видео-файла, что избавит от ненужный черных рамок.
     
  24. Like
    Yarpda получил реакцию от Ingalime в Вопрос по интерфейсу (в Андроид)   
    LB можно сделать каким угодно, наверное даже сразу с TEdit (сам правда не проверял, более опытные форумчане поправьте меня, если я ошибаюсь), но это надо знать как со стилями работать. В целом там ничего сложного (на форуме даже есть видое-курсы по этому поводу, но к сожалению платные...). Имхо без понимания принципа работы со стилями в FMX довольно сложно, хотя и можно... но в итоге лично у меня вышло, что пришлось городить огород из 3 страниц кода, чтобы нужные данные в LB выводить, а в итоге оказалось, что можно было тоже самое 5 кликами мышки сделать в дизайнере стилей...
  25. Like
    Yarpda получил реакцию от Равиль Зарипов (ZuBy) в TListView: последовательная загрузка айтемов под Андроидом   
    Вот здесь например есть пример решения, там же есть ссылка на проект (это ModernLV. http://blog.rzaripov.kz/2016/11/0-modernlistview.html), но думаю что и из стандартного LV можно тоже самое добиться при желании. Тут конечно проще.
×
×
  • Создать...