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

Кривяков Виталий

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

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

  • Посещение

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

    12

Сообщения, опубликованные Кривяков Виталий

  1. Добрый день!

    Все проще, гораздо.

      Net := THTTPClient.Create;
      Net.BeginPost(
        procedure (const Value : IAsyncResult)
        begin
          AsyncResult(Value); // Вот тут можно вызвать любую процедуру, или просто обработать результат.
        end, URL, InputStream, OutputStream, Headers);

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

  2. В 24.09.2017 в 16:54, POV сказал:

    Ну, видимо там ничего хитрого, просто надо потыркаться, варианты поискать. Если камеру остановлю заранее, то закрывается приложение норм. А вот в onClose остановка не работает не работает.

    Реализация данного механизма кривая. Внутри захват изображения с камеры в отдельном потоке идет, и через синхронизацию десятки раз в секунду выбрасывается на экран. В 99 процентах случаев завершения работы программы без остановки камеры или реже при остановке камеры вы получите взаимоблокировку основного потока и потока граббера с камеры. К сожалению, это зарыто глубоко в FMX и без того, чтобы перекурочить исходники не получится исправить работу.

  3. Добрый день!

    1. Посмотрите стек при возникновении "stack overflow", та будет видно, что привело к проблеме.

    2. Анимации не будет. Анимация работает в основном потоке приложения. Создание формы тоже происходит в основном потоке, т.е на время создания формы анимация остановиться.

  4. Я отказался пока от SVG, так как рассматривал его как вариант для отображения картинок кнопок - некрасиво, на маленьких размерах PNG выигрывает в качестве. Поэтому не заморачивался с тем когда вызывать код. Более правильно было бы сделать заплатку для FMX, но там такая реализация (через одно место), что только переносить исходники в проект, а это не дело.

    Для примера скриншот изображения 24х24 для Windows и Android
     

    Win_SVG_PNG.PNG

    Android_SVG_PNG.PNG

  5. Добрый день!

    Коллеги, хочу озвучить одну из причин, из-за которой может возникать ситуация " Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно"

    Дело в том, что существуют сокращения в представлении данных и не все из низ TPath понимает, вот с чем столкнулся:

    Есть команда 'c' - рисование кривой. не буду вдаваться в подробности, можно найти в интернете описание, скажу только то, что данная команда содержит 6 чисел. В идеале должно быть:

    сX1 X2 X3 X4 X5 X6

    Но очень часто (например в иконках Material Design) можно встретить:

    c-1.1 0-1.99.9-1.99 2

    И на этой строчке парсер TPath падает с ошибкой, так как пытается сконвертировать '-1.99.9' в число, что не верно. В реальности данная запись соответствует двум числам -1.99 и 0.9.

     

    Для обхода проблемы я загружаю SVG в рантайме, и сроку пропускаю через корректор:

    function CorrectSVG(const Value: String): String;
    var
      SB : TStringBuilder;
      I: Integer;
      C : Char;
    begin
      SB := TStringBuilder.Create;
      try
        I := 0;
        for C in Value do
        begin
          if C='.' then
            Inc(I) else
            if not CharInSet(C, ['0'..'9']) then
              I := 0;
          if I=2 then
          begin
            SB.Append(' 0.');
            I := 0;
          end else
            SB.Append(C);
        end;
        Result := SB.ToString;
      finally
        FreeAndNil(SB);
      end;
    end;

     

  6. Добрый день!

    Есть приложение под iOS. Если запускать из Delphi (Berlin), то все нормально. Как можно получить, или где найти ipa файл? 

    В сертификат(developer) прописаны два устройства, как запустить приложение на другом айпаде, без его подключения к компу?

  7. Добрый день!

    Столкнулся с проблемой вывода текста разного размера по одной линии. Не получается использовать BaseLine доступную для Firemonkey. 

    Baseline -   воображаемая прямая линия, проходящая по нижнему краю прямых знаков без учёта свисаний и нижних выносных элементов. В строке символы текста стоят на базовой линии, а нижние выносные элементы текста «свисают» с неё.

    Из описанного выше ясно, что выводимые символы должны лежать на это линии, но в реале как то все некорректно выводится.

    Сделал два примера VCL (черный фонт) и FireMonkey(черный полупрозрачный фонт), оказалось, что вывод текста осуществляется по разному, при одном и том же значении размера шрифта. Базовая линия в обоих примерах 356.

    Совмещаем отображение символов: GlyphsEqual.png Символы совпали, но базовая линия смещена.

    Совмещаем базовую линию: PosEqual.png Базовая линия совпала, как и верхний край контролов, а вот текст (серый) значительно ниже.

    А теперь собственно вопрос вопрос, где ошибка? Как рассчитать базовую линию для FMX?

     

    P.S.

    Про attributes у TTextLayout знаю.

    GlyphsEqual.PNG

    PosEqual.PNG

    BaseLine.rar

    DancingGlyphs.PNG

  8. Добрый день!

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

  9. Добрый день!

    Было такое. Боюсь, что деталей не вспомню, но:

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

  10. function GetDefaultFilePath(const FileName: string): string;
    begin
    {$IFDEF Android}
      Result := TPath.Combine(TPath.GetSharedDocumentsPath, FileName);
    {$ENDIF}
    {$IFDEF IOS}
      Result := TPath.Combine(TPath.GetDocumentsPath, FileName);
    {$ENDIF}
    {$IFDEF MSWindows}
      Result := TPath.Combine(TPath.GetDocumentsPath, FileName);
    {$ENDIF}
      ForceDirectories(ExtractFilePath(Result));
    end;
    
    procedure TForm.ShowPDF;
    var
    {$IFDEF Android}
      Intent: JIntent;
    {$ENDIF}
      FilePath, tmpStr: string;
    begin
      FilePath := GetDefaultFilePath(Filename);
    
    {$IFDEF Android }
      try
        Intent := TJIntent.Create;
        Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
        Intent.setDataAndType(StrToJURI('file:' + FilePath),
          StringToJString('application/pdf'));
        Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NO_HISTORY);
        Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
        SharedActivity.startActivity(Intent);
      except
        on E: Exception do
          ShowToast(E.Message);
      end;
    
    {$ENDIF}
    {$IFDEF IOS}
      wbViewPDF.Visible := True;
      wbViewPDF.URL := 'file:/' + FilePath;
    {$ENDIF}
    end;

    Приблизительно так...

  11. Вся проблем в катастрофически не быстрой графике. Все попытки сделать живой интерфейс обречены. Приходится осознано отказываться от морфинга и трансформаций, так приложение целостнее выглядит.

  12. Добрый день!

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

    Немного руководства от яблока.

    Нашел библиотеку для работы с JWT
    https://github.com/paolo-rossi/delphi-jose-jwt

    Но вот как подписывать токен алгоритмом  ECDSA и какие сертификаты использовать не могу понять. Кто занимался похожем вопросом? Поделитесь знаниями.

    Спасибо

  13. Привет!

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

  14. Добрый день!

    Не получается отправить файлы из приложения в проводник Windows средствами firemonkey. 

    Код:

    
    procedure DragAndDropFiles;
    var
      DDService : IFMXDragDropService;
      D : TDragObject;
      ABitmap : TBitmap;
    begin
    ...
        D.Files := [];
        D.Source := self;
        ABitmap := CreateMyBitmap;
        gvIcons.DisableScroll;
    	AddFiles(D.Files);
        
        if TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, DDService) then
          DDService.BeginDragDrop(Self, D, ABitmap);
    
        FreeAndNil(ABitmap);
    end;

    Файлы в списке есть, картинка перемещается с курсором, но над проводником знак запрета и drop не срабатывает.

    P.S.

    Как сделать под VCL знаю, интересует, возможно ли это в FMX.

     

  15. Добрый день!

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

    Спасибо.

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