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

ENERGY

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

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

  • Посещение

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

    57

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

  1. Что то мне кажется это связано с этим багом https://quality.embarcadero.com/browse/RSP-18210

    Загружайте картинки в ImageList - и затем отображайте в TGlyph. Таким образом у вас будут все картинки в едином хранилище, которое можно обновить.

    Глобальный ImageList можно хранить в DataModule, который должен загружаться раньше всех форм (в dpr файле).  

     

  2. Есть такая процедура, function DelAmp(const Text: string): string; в FMX.Types.

    Которая 2 раза выделяет память для всей строки, и сканирует все символы в строке, в поисках &.

     

    TLabel.Text  := 'Text';  - эта процедура  выполнится 2 раза, на любой платформе. Чтобы она выполнилась 1 раз, нужно сделать

    TLabel.PrefixStyle := TPrefixStyle.NoPrefix;

     

    TText 

    TText.Text  := 'Text'; Процедура DelAmp выполниться в любом случае на любой платформе

    procedure TText.SetText(const Value: string);
    [..]
    begin
      if Text <> Value then
      begin
        NewText := ConvertText(DelAmp(Value));
    
    [..]

    Стили состоят из множества TText элементов. Теперь представьте сколько ресурсов тратиться впустую.

     

    function DelAmp(const Text: string): string;
    var
      I, J: Integer;
      Sb: TCharArray;
    begin
      Result := '';
      if Text <> '' then
      begin
        SetLength(Sb, Text.Length);
        I := Low(Text);
        J := 0;
        while I <= High(Text) do
        begin
          if (Text[I] <> '&') then
          begin
            Sb[J] := Text[I];
            Inc(J);
          end
          else
          begin
            if ((I < High(Text)) and (Text[I + 1] = '&')) then
            begin
              Sb[J] := Text[I];
              Inc(J);
              Inc(I);
            end;
          end;
          Inc(I);
        end;
        Result := string.Create(Sb, 0, J);
      end;
    end;

     

     

    Решение - скопировать FMX.Types в папку с проектом, и переделать функцию на:
     

    function DelAmp(const Text: string): string;
    begin
      Result := Text;
    end;

     

  3. Автор, мне кажется, если бы вы прикрепили пример проекта, где баг воспроизводится (напр на TImage.Bitmap), было бы больше помощи, втч и тем кто будет спрашивать в будущем об этом.

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

     

  4. Попробуйте сделать ресайз не мышкой, а спец. отдельной функцией в редакторе картинок (в Photoshop, Photoimpact). Там можно выбрать Resample метод напрямую - Bicubic. 

    Если после этого все равно размытый, то можно добавить немного четкости (Sharp ).

     

    А вообще, обычно делается один большой файл с большим разрешением, и с него уже делается ресайз в маленькие разрешения. Так качество будет лучше, чем если делать наоборот.

     

    Маленькие картинки - иконки всмысле, лучше ресайзить из больших картинок не в PS, а в спец. программах, напр. Axialis IconWorkshop  - качество будет лучше.

  5. Я бы на вашем месте сначала вывел текст в Timage.Bitmap, чтобы исключить другие направления. 

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

     

  6. Если на Timage то 

     Image1.WrapMode := TImageWrapMode.Original;

    Чтобы не растягивало. 

     

    Также обратите внимание на параметр BitmapScale.

    Он должен быть равен текущему scale, иначе изображение будет тоже искажено.

    var
      lScale: Single;
      lScreenService: IFMXScreenService;
    begin            // FMX.Platform
      if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, lScreenService) then
         lScale := lScreenService.GetScreenScale
      else
        lScale := 1;

    Если у вас свой компонент от TControl , то там есть переменная Scene. и конструкция выше не нужна.

      Result := TBitmap.Create(Trunc(AWidth), Trunc(AHeight));
      Result.BitmapScale := lScale;

     

    Есть одно но, если указать правильный Scale в Bitmap - то на Windows (если там scale > 1) часть рисунка на канве будет отрезаться, видимо какой то баг с просчетом координат с новым Scale в FMX, при это на мобильных системах все прекрасно работает и корректно рисуется и масштабируется с разными Scale. Я так рисую со сглаживанием через NativeDraw - сначала на Bitmap, для кэша, затем на канву. 

    Возможно  Ярослав знает в чем дело. 

    Используйте этот метод BitmapScale на Android\iOS (рендер GlobalUseGPUCanvas := true; чтобы посмотреть на Win, но без сглаживания). 

     

  7. В любом.

     

    Цитата

    Я создал проект в иллюстраторе, и мне необходимо выгрузить png файлы в четырех разрешениях, но когда я выгружаю, границы у прямоугольных объектов становятся размытыми.

    Причем здесь стили Delphi? Если иллюстратор размывает финальный png? 

    Что означает "выгружаю"?

  8. В 08.02.2017 в 11:10, POV сказал:

    Когда задал компоненте новый TextSettings функция TextWidth возвращает ширину текста для шрифта по умолчанию. Хотя отрисовывает с моими новыми настройками.

    Отчего?

    Оттого, что ширина текста определяется для шрифта и размера указанного в Canvas, а не для шрифта из компонента.

    Например, в TLabel.TextSettings.Font  и в его TLabel.Canvas.Font размер шрифта будет разный (в Canvas он дефолтный - 12).

    В FMX компонентах Canvas, кстати, общий и один и тот же - это Canvas формы.

    Если в OnResize чего-либо, сделать так: 

      Label.Canvas.Font.Size := Label.Font.Size;
      или 
      Label.Canvas.Font.Assign(Label.Font); (чуть дольше)
    
      lRealWidth := Label.Canvas.TextWidth(Label.Text); 

    То размер будет корректный.

  9. 20 минут назад, ra.eremeev сказал:

    Доброго времени суток!

    Может кому пригодится: конфигурация Berlin отлично работает с MacOS High Sierra + SKD 11

    Виртуалка для Hight Sierra доступна по ссылке

    А SDK iOS точно 11.x выбрано? А Xcode какой? При билде не возникает ошибка Linker Error 1 или т.п. ?

    Кстати, ссылка у вас на какой то фейковый рутрекер. Вот тот же релиз на оригинальном рутрекере. 

    https://rutracker.org/forum/viewtopic.php?t=5461837

  10. Программа на  iOS 10.3 будет работать, единственное что опубликовать не получиться в магазине, т.к. Apple может не пропустить (но может и пропустить).

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

    Насчет компиляции с iOS 11.4 лучше спросить в чате телеграмм. По идее должно работать, проверьте.

    XCode - да поверх. 

  11. В 18.07.2018 в 21:22, Ivan B. сказал:

    Alex, а как лучше организовать многопоточность? Создать класс TThread или использовать iTask?

    Лучше не наследоваться в отдельный класс от TThread, как это делалось раньше в Delphi.

    Это громоздкий и запутанный код. 

    Лучше используйте анонимные потоки. Вот вам шаблон:

     

    http://blog.marcocantu.com/blog/2014_may_background_delphi_android_threads.html

    TThread.CreateAnonymousThread(
        procedure
        begin
    
     // выполняется в потоке
    
          TThread.Queue(nil,
            procedure
            begin
    
      /// выполняется в главном потоке, когда завершиться анонимный поток.
    
            end);
        end
      ).Start;
    
    procedure TForm5.Button3Click(Sender: TObject);
    begin
      TThread.CreateAnonymousThread(procedure ()
      begin
             // выполняется в потоке
            TThread.Synchronize (TThread.CurrentThread,
              procedure ()
              begin
    
     // выполняется в главном потоке, но при этом анонимный поток еще продолжит работать, но сейчас приостановлен
    
              end);
    
      end).Start;
    end;


    И помните что с элементами GUI нельзя работать из другого потока, только из главного ( TThread.Queue,  TThread.Synchronize). Иначе будет Access Violation, который будет выскакивать случайным образом.

  12. Мне кажется нужно вообще исключить iPhone 5 и UBF, и компилить только на x64 - 5s или выше, чтобы исключить другие баги.

    Вообще Universal Binary File мне не нравится, т.к. файл получается очень большой, под 30 мб - в 2 раза больше.

    Я компилирую только под x64. Делать неудобства остальным пользователям (большинству), в виде большого размера не хочу. iPhone 5 уже отошли.

  13. Что-то мне кажется проблема в эмуляторе устройства\клавиатуре. Никогда такого не замечал под Android\iOS на реальных устройствах, и на форуме никто не писал про такое.

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