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

Barbanel

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

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

  • Посещение

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

    36

Сообщения, опубликованные Barbanel

  1. Всем привет!

    Столкнулись с новой задачей: при копировании файла во внутреннюю память все идет хорошо, при копировании на SD-карту получаем отказ в доступе, что сегодня вполне ожидаемо.

    Умные люди говорят (и даже дают ссылку), что начиная с апи примерно 22, для того чтобы писать на карту памяти нужно просить у пользователя разрешение.

    https://stackoverflow.com/questions/33139754/android-6-0-marshmallow-cannot-write-to-sd-card

    Есть пример на Java, но я понятия не имею как это сделать на Delphi. Насколько я понимаю, выполнть Java-код из Delphi невозможно, так?

    Есть ли какой обходной путь, или встроенная возможность как запросить права у пользователя?

    Всем заранее спасибо!

  2. 23 минуты назад, FREEFAR сказал:

    на VCL вроде PAS файл Const был.

    Смотрели в ту сторону?

    Отредактированный файл в корень проекта потом класть надо

    Огромное спасибо за наводку, это именно оно!

    Файл FMX.Consts нужно отредактировать и прописать в путях проекта.

  3. Всем привет!

    Под андроидом использую код типа:

        MessageDlg(rsLocalised_DeleteMsg,
                   System.UITypes.TMsgDlgType.mtConfirmation,
                  [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], 0,
                    procedure(const AResult: TModalResult)
                    begin
                        bla bla bla
                    end);

    Диалог отображает английские надписи на кнопках [Yes] и [No]

    Нужно чтобы кнопки подписывались локальным системным языком, вроде [Да] [Нет], [Ja] [Nein] и т.д.

    Вопрос: это возможно? Куда копать, подтолкните меня плиз!

    Всем спасибо!

  4. 1 минуту назад, kami сказал:

    у нас в качестве сборщика - какой-то древний макмини.

    До iOS11 напрягало, что симулятор для отладки запускается безумно медленно.

    А как перешли на Токио + IOS11 - эта проблема перестала играть роль, поскольку симулятор теперь просто не работает :D . Радикальное такое решение проблемы :)))

    Да, ребята в эмбаркадеро стараются, прогресс налицо)))

    Сейчас тестируете на реальном телефоне?

  5. Во, вот это уже по существу, спасибо!

    Неработающий дебаг - это конечно боль, а без условной компиляции под различные платформы имхо вообще никак...

    Под хакинтошем дебаг работает? Какая у вас конфигурация компа для сборки в виртуалке?

  6. 2 минуты назад, FREEFAR сказал:

    Возможно кто-то может вам просто написать под iOS приложение и это выйдет гораздо дешевле закупки железа + трудочасы на разработку, отладку, публикацию. Все зависит от целевого проекта и наличия потребности в его сопровождении и развитии.

    Боюсь что если я скажу такое шефу - меня уволят)))

    Приложение уже написано на Дельфи и успешно работает на андроид-устройствах. Осталось скомпилировать его под iOS и протестировать. Задача стоит именно так: скомпилировать, отладить если необходимо, выложить в магазин Эппла.

    Понятно что для тестов нужен айфон, купим, не проблема.

    Слышали что нужно также и макбук. Шеф говорит купим, скажи только какой. А с ними дел никогда не доводилось иметь, и какой нужен - я хз))) Шеф говорит купим, грех говорить что не нужно)))

    Вот, спрашиваю вашего совета)

  7. Доброго времени!

    Есть разработанное под Андроид приложение. Начальство поставило задачу выложить это же приложение в Apple AppStore.

    Было озвучено мнение что для этого необходимо купить Макбук или что-то аналогичное эппла.

    У меня нет опыта работы с эппловскими девайсами и операционками вообще, в связи с чем вопрос:

    - какое железо необходимо для нормальной и желательно комфортной разработки под iOS?

    "Свежесть" железа играет роль (год выпуска или еще чего-нить)?

    Всем спасибо!

  8. Здравствуйте!

    Стоит задача загружать фотографии и отображать их в списке. Казалось бы, как два пальца, но...

    Код работал долгое время, все грузилось и отображалось. Спустя какое-то время, фото грузиться перестали. Дебаггинг выявил, замкнутый бесконечный цикл в этой процедуре:

    procedure TBitmap.AssignFromSurface(const Source: TBitmapSurface);
    var
      BitmapData: TBitmapData;
      MaxSize: Integer;
      ResampledSurface: TBitmapSurface;
      I: Integer;
      SourceRect: TRectF;
    begin
      MaxSize := CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize); <-- MaxSize = 0
      if (Source.Width > MaxSize) or (Source.Height > MaxSize) then
      begin
        SourceRect := TRectF.Create(0, 0, Source.Width, Source.Height);
        SourceRect.Fit(TRectF.Create(0, 0, MaxSize, MaxSize));
        ResampledSurface := TBitmapSurface.Create;
        try
          ResampledSurface.StretchFrom(Source, Trunc(SourceRect.Width), Trunc(SourceRect.Height), PixelFormat);
          AssignFromSurface(ResampledSurface); <-- infinity loop here
        finally
          ResampledSurface.Free;
        end;
      end
      else
      begin
        SetSize(Source.Width, Source.Height);
        if Map(TMapAccess.Write, BitmapData) then
        try
          for I := 0 to TBitmapSurface(Source).Height - 1 do
            Move(TBitmapSurface(Source).Scanline[I]^, BitmapData.GetScanline(I)^, BitmapData.BytesPerLine);
        finally
          Unmap(BitmapData);
        end;
      end;
    end;

    В самом начале процедуры MaxSize получает значение 0 (ноль!), размеры картинки больше нуля и процедура влетает в бесконечный цикл на строке

          AssignFromSurface(ResampledSurface);
     

    Кто-то сталкивался? Есть мысли как лечить?

    Всем спасибо!

  9. 5 минут назад, kami сказал:

    Вам же дали ссылку на Conditional Defines. Это именно то, что вы спрашивали - что под какой платформой неявно задефайнено.

    Да. А я больше ничего и не прошу, я поясняю чтобы было понятнее.

  10. 1 час назад, Равиль Зарипов (ZuBy) сказал:

    честно не совсем понял о чем речь. директивы стандартные можно найти в справке ембы

    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Conditional_compilation_(Delphi)

    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Delphi_Compiler_Directives_(List)_Index

    ну и так далее

    1 час назад, krapotkin сказал:

    обычно хватает того, что находится в Build Configuration

    выбираем Debug или Release и всё. Но можно и плодить свои конфиги

    Попытаюсь пояснить.

    Я не вижу в настройках IDE (в опциях проекта), какие у меня определены директивы компилятора для каждой системы (для Win/Android, и Debug/Release).

    Либо это баг ИДЕ в целом, либо баг конкретно моей версии - я хз.

    При переключении целевой платформы, поля в настройках проекта просто не обновляются. Соотв. я не знаю, какие директивы актуальны для текущей сборки, и какие будут актуальны, если я впишу свой набор директив в эти необновленные поля.Поэтому и спрашиваю, есть ли некие предустановленные компилятором/средой директивы, актуальные в каждой из целевых платформ, для дебага и релиза соответственно.

    Как вариант - пошариться в файле .dproj но его формат малопонятен. Я имею ввиду, какие параметры относятся к какой платформе и версии.

    Screenshot_5.png

  11. Здравствуйте!

    Подскажите пожалейста, устанавливаются ли какие-либо стандартные Define при компиляции приложения для Play Store?

    Понятно что можно установить свои дефайны, разные для дебага и релиза, но хочется знать, существуют ли стандартные.

    Спасибо, всем хорошего дня =)

  12. В 25.3.2017 в 21:26, ENRGY сказал:

    Сделал решение для описанного выше варианта.

    Добавил его на Stackoverflow

    Поставили такую же задачу - удалять оставшиеся фото из галереи.

    Взяли за основу твое решение - работает через раз, и только при отладке:

    - перед созданием фото получаем id последнего фото (id_last)

    - фотографируем

    - ищем все id которые больше id_last и удаляем их.

    На последнем шаге и получаем фейл - из под работающего приложения никогда не возращаются id больше id_last. Из под отладки - получаем лишь иногда. Причем если в момент отладки переключиться в галерею, то там есть свежие фото.

    Есть идеи, в какую сторону копать? Может перед vCursor := vContent.query(...) нужно какой кеш обновить?

  13. Есть такой код:

        if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService, Service) then
        begin
            Params.Editable := True;
            Params.NeedSaveToAlbum    := False;
            Params.RequiredResolution := TSize.Create(self.ClientHeight, self.ClientHeight);
            Params.OnDidFinishTaking  := actTakePhotoFromCameraDidFinishTaking;
            Service.TakePhoto(btnInfoAddPhoto, Params);
        end
        else
            ShowMessage('This device does not support the camera service');

    После того как фото сделано, появляется ошибка EBitmapLoadingFailed 'Loading bitmap failed (/storage/emulated/0/DCIM/Camera/IMG_20170503_170826.jpg).'
    Появилась после того как убрал из проекта права READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE.

     

    Вопрос: можно ли получать фото от камеры минуя их сохранение в память утсройства?

    PS спрашиваю, т.к. стоит задача избавиться от ненужных прав в манифесте.

    Всем заранее спасибо!

  14. В 13.3.2017 в 13:35, Menkos1 сказал:

    ага вижу - вот мне так же хочется сделать, подозреваю что у меня по дефалту настройки идут не те, что у вас у проекта.

    Скорее всего увас в конфиге IDE прописан флаг WAIT_2_SECONDS_BEFORE_FMX_STARTS. Уберите его - и проблема исчезнет.

  15. Здравствуйте уважаемые,

    есть форма с множеством TEdit, при этом они не помещаются на один экран и помещена на TScrollBox.

    При скороллинге если скроллить нажимая на подложку (т.е. сам TScrollBox) все работает идеально, если же нажимать на сам TEdit и таким образом скроллить, то выезжает клавиатура, что вобщемто неудобно.

    Вопрос: как настроить приложение/форму/ТСкроллБокс так, чтобы при зажатии и движении пальца вверх/вниз на ТЕдите клавиатура не выезжала?

    На нативных приложениях описанного выше поведения я не замечал.

     

    Заранее спасибо!

     

  16. Я определяю так:

     

    var
        FFirstDistance, FLastDistance: integer;
    ..
    
    procedure TformMainMenu2.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
    begin
        case EventInfo.GestureID of
        igiZoom :
            begin
                if (not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags)) and
                  (not(TInteractiveGestureFlag.gfEnd in EventInfo.Flags)) then
                    FLastDistance := EventInfo.Distance;
    
                if (TInteractiveGestureFlag.gfBegin in EventInfo.Flags) then
                    FFirstDistance := EventInfo.Distance;
    
                if (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then
                begin
                    // zoom out
                    if ( FFirstDistance > FLastDistance ) then
                    begin
                        Plan.Scale := 0.5;
                    end;
    
                    // zoom in
                    if ( FFirstDistance < FLastDistance ) then
                    begin
                        Plan.Scale := 1.0;
                    end;
                end;
            end;
        end;
    end;
  17. В 9.11.2016 в 18:36, Rokweb сказал:

    Доброго времени суток. Сразу к делу, ситуация: имеется TImage, который должен обрабатывать как долгое нажатие, так и короткое. Как это реализовать? Сделал по событиям через OnGesture и OnTap - срабатывают оба, пробовал и OnClick - тоже срабатывает. Чем вообще отличаются друг от друга OnClick и OnTap?

    У изображения нужно настроить на какие жесты он реагирует. Кинь на форму TGestureManager, потом настрой поля как показано ниже в коде.

    OnClick - срабатывает при касании объекта, срабатывает и в виндовс и на мобильных устройствах.

    OnTap - срабатывает несколько интеллектуальнее, причем только на мобильных устройствах (в виндовс не срабатывает).

    Упрощенно, он срабатывает только если ты коротко тапнул на контрол, если ты нажал на контрол и повел пальцем, скроля контент или скроля родительский ScrollBox, OnTap НЕ сработает.

    // инициализация
        Image.Touch.GestureManager := gestManager;
        Image.Touch.InteractiveGestures := [TInteractiveGesture.LongTap];
        Image.OnGesture := FormGesture;
    ..
    
    // обработка жеста
    procedure TfrmMain.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
    begin
        case EventInfo.GestureID of
        igiLongTap :
            begin
                DoSomething();
            end;
        end;
    end;

     

×
×
  • Создать...