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

Лидеры

  1. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      3

    • Постов

      2 124


  2. AngryOwl

    AngryOwl

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


    • Баллы

      1

    • Постов

      394


  3. zonik

    zonik

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


    • Баллы

      1

    • Постов

      6


  4. Belov.V.

    Belov.V.

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


    • Баллы

      1

    • Постов

      69


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

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

  1. AngryOwl

    Использование OpenGL?

    В итоге не совсем понятно - чего же Вы хотите добиться? Если перевести проект из VCL в Firemonkey, то посмотрите данную ссылочку (и соответственно) OpenGL? Если Вы используете в своем проекте, созданном под VCL, библиотеку OpenGL, то, думаю, будет немного сложнее... Если нет, то Вам ничего не нужно "делать". С Firemonkey Вам не нужно задумываться над тем - что и где используется. Потому-что создавая FMX проект, все происходит "автоматически". В смысле - под Windows Ваш проект сбилдится так, что будет работать с DirectX, под остальное - OpenGL. (в общем виде) Так-что либо уточните свой вопрос, либо более четко его сформулируйте. Иначе, не понятно, что Вы хотите узнать.
    1 балл
  2. Нет, поддержки выравнивания текста по ширине контейнера нету.
    1 балл
  3. Для получения «content» я сделал так var Intent: JIntent; Uri: Jnet_Uri; INStream: JInputStream; OUTStream: JOutputStream; outputfile: string; FFF: JFile; NumRead, NumWritten: Longint; Buffer: TJavaArray<Byte>; begin ... Intent := SharedActivity.getIntent; if (Pos('image/', JStringToString(Intent.getType))>0) or (Pos('audio/', JStringToString(Intent.getType))>0) or (Pos('video/', JStringToString(Intent.getType))>0) or (Pos('application/', JStringToString(Intent.getType))>0) or ('*/*' = JStringToString(Intent.getType)) then begin if JStringToString(Intent.getType) <> '' then begin Parcel := Intent.getParcelableExtra(TJIntent.JavaClass.EXTRA_STREAM); Uri := TJnet_Uri.Wrap(Parcel); if JStringToString(Uri.getScheme) = 'content' then begin if Pos('/mpeg', JStringToString(Intent.getType)) > 0 then outputfile := 'my.mp3' else if Pos('/jpeg', JStringToString(Intent.getType)) > 0 then outputfile := 'my.jpg' else outputfile := 'my.' + copy(JStringToString(Intent.getType), Pos('/', JStringToString(Intent.getType))+1, Length(JStringToString(Intent.getType)));//выдергиваем имя типа для того чтобы сделать его расширением //на случай если в Intent не уточнен тип, а указана *, например image/* if Pos('.*', outputfile) > 0 then outputfile := StringReplace(outputfile, '.*', '.tmp', [rfReplaceAll]); Buffer := TJavaArray<Byte>.Create(4096); INStream := SharedActivityContext.getContentResolver.openInputStream(Uri); try FFF := TJFile.JavaClass.init(StringToJString(<ИМЯ_ПАПКИ>), StringToJString(outputfile)); FFF.setWritable(true, false); OUTStream := TJFileOutputStream.JavaClass.init(FFF); repeat NumRead := inStream.read(buffer); if (NumRead <= 0) then Break; outStream.write(buffer, 0, NumRead); application.ProcessMessages; until NumRead <= 0; outStream.close; inStream.close; except on e: exception do raise Exception.CReate('Error. Can''t copy file'); end; end end end end может не самое оптимальное, но работает, в итоге у вас файл с именем outputfile и в папке <ИМЯ_ПАПКИ>
    1 балл
  4. Регистрируем намерение через файл манифеста (ниже для файлов с типом xml). Для Android 3.2 адекватнее работал второй фильтр: <activity … <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:mimeType="text/xml" /> <data android:mimeType="application/xhtml+xml" /> </intent-filter> <!-- Для 3.2 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:mimeType="*/*" /> <data android:host="*" /> <data android:pathPattern=".*\\.xml" /> <data android:pathPattern=".*\\..*\\.xml" /> <data android:pathPattern=".*\\..*\\..*\\.xml" /> <data android:pathPattern=".*\\..*\\..*\\..*\\.xml" /> <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.xml" /> </intent-filter> Регистрируем свой обработчик события для на событие смены состояния приложения: procedure TForm1.FormCreate(Sender: TObject); var ApplicationService: IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, ApplicationService) then ApplicationService.SetApplicationEventHandler(ApplicationEventChanged); end; Оформляем обработчик. Получение файла можно перенести в Form1.onCreate, но я для экспериментов с activity делал тут: function TForm1.ApplicationEventChanged(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var intent : JIntent; fileFullPath : String; begin intent := SharedActivity.getIntent; // BecameActive if AAppEvent = TApplicationEvent.BecameActive then begin if Assigned(intent) and TJIntent.JavaClass.ACTION_VIEW.equals(intent.getAction) then begin fileFullPath := JStringToString(intent.getData.getPath); if FileExists(fileFullPath) then begin // обработка файла fileFullPath // ... end; end; end // завершаем Activity при переводе приложения в "Background" else if AAppEvent = TApplicationEvent.EnteredBackground then SharedActivity.finish; // Result := True; end; Хочу обратить внимание, что привел только сам принцип. Очень важно корректно завершить активность (при сворачивании приложения, отключении экрана и т.д. ), т.к. при повторном вызове активности будет вызываться последний из стека. И если его не закрывать будем получить предыдущий, не закрытый activity. А если за приложением зарегистрировано несколько Activity (приложение можно вызвать из ланчера или как в примере, для обработки файла по типу).... в общем тут есть с чем поиграться. Для желающих посмотреть поведение и последовательность выкладываю пример, который формирует лог обработки. Нужно закоментировать: else if AAppEvent = TApplicationEvent.EnteredBackground then SharedActivity.finish; И посмотреть что и когда приложение получает в SharedActivity и AAppEvent. Ссылка в тему: http://developer.android.com/guide/topics/manifest/activity-element.html# Что не получилось: 1) Некоторые программы отдают файл в схеме «content» (к примеру Gmail v5.1 отдает). Как в этом случае получить содержание файла не разобрался. Поэтому в фильтре ограничил вид контента "file" 2) Не смог добраться до стека Activity. Если приложение в памяти и повторно вызывается с новой activity - возможно вот тут это могло пригодиться. (activity ... android:launchMode="singleTop" в этом случае не помог). ADD: было обсуждение, кто как закрывает приложения на андроид, чтобы не оставалось в памяти. Если добавлять SharedActivity.finish приложение 100% убирается из памяти. Intent_Get-File.zip
    1 балл
  5. Типы координат В FIreMonkey различают три вида координат: Локальные - это координаты в системе координат контрола. Абсолютные - это координаты в системе координат клиентской части формы. Экранные - это координаты в системе координат экрана. Соответственно, если речь идет о форме, то позиция формы задается в экранных координатах. Если речь идет о контролах, то в локальных координатах своего родительского контрола. Конвертация Локальные -> Абсолютные TControl.LocalToAbsolute(TPointF): TPointF Абсолютные -> Локальные TControl.AbsoluteToLocal(TPointF): TPointF Абсолютные -> Экранные TControl.Scene.LocalToScreen(TPointF): TPointF; Экранные -> Локальные TControl.Scene.ScreenToLocal(TPointF): TPointF;
    1 балл
  6. Здесь есть два варианта решения: 1. Использовать сервис FMX.Types.IFMXMouseService Этот сервис позволяет получить координаты последнего положения курсора мыши, нажатия или перемещения пальца по экрану. Однако если пользователь оторван палец от экрана, то сервис вернет последнее положение пальца на экране. Этот метод хорош тем, что позволяет узнать положение в любой момент в любом месте экрана. Метод возвращает абсолютные координаты в СК формы. При использовании этого варианта и при частой необходимости получать координаты, сервис лучше сохранить локально в отдельную переменную, чтобы каждый раз не выполнять запрос на получение сервиса. Так как эта функция требует дополнительных ресурсов. var MouseService: IFMXMouseService; MousePos: TPointF; begin // MouseService - лучше вынести отдельным полем класса и инициализировать ее например при создании формы. if TPlatformServices.Current.SupportsPlatformService(IFMXMouseService, IInterface(MouseService)) then MousePos := MouseService.GetMousePos end; 2. Использовать глобальный объект Screen: TScreen В FireMonkey есть глобальный объект, который предоставляет информацию о экране. Он внутри использует несколько сервисов. В частности, у него есть метод: Screen.MousePos Который использует 1 подход и вернет такой же результат. Но в отличии от первого способа, тут не нужно запрашивать сервис, это сделано в TScreen. 3. Использовать стандартные события OnMouseDown, OnMouseMove, OnMouseUp Собственно способ заключается в определении текущего положения пальца через событие OnMouseMove. Однако, этот способ подходит только для контролов, которые могут перехватывать события мыши (HitTest = True). Идея
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...