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

Error

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

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

  • Посещение

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

    8

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

  1. Проголосовал, это просто эпик!

    ---

    Сильно подозреваю что баг не на всех компах воспроизводиться.

    У меня на виртуалке воспроизводится, надеюсь и у аутсорсеров тоже воспроизведется.

  2. 19 часов назад, ENRGY сказал:

    Error

    Да и без сглаживания это выглядит гораздо лучше чем растровые.

    Я не замечал там каких то заметных несглаженных искажений. К тому же можно приготовить в редакторе smooth картинку, скомбинировав ее из нескольких путей (слоев) и она будет вполне себе сглаженной .

     

    Да кстати, напишите то же самое разработчикам Windows. У них ужасное форсированное масштабирование на Win 8-10 для всех окон. Да оно сглаженное, но такое размытое, как будто сидишь с близорукостью.. Вот пример как не нужно сглаживать. Хорошо хоть эту "фичу" отключить можно, и то не везде.

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

    Про тормоза говорить не буду.

  3. 41 минуту назад, ENRGY сказал:

    Хорошая задумка, только уже ведь есть TimageList. C довольно неплохой идеей. 

    А вообще хотелось бы векторный TImageList, куда можно загрузить список TPath

     

    Сначала надо чтобы FMX научилась отрисовывать графические примитивы со сглаживанием, а для этого надо имплиминтировать на каждой платформе (iOS, Android) нативную канву...

    Начинаю сомневаться что это вообще когда-либо произойдёт.

  4. 6 часов назад, AlexG сказал:

    Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.

    Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".

    Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.

    Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?

    Самое очевидное, посмотреть как реализован TTaskBar и сделать аналог для FMX, или сильно урезанный аналог с необходимым вам функционалом.

  5. В 04.02.2017 в 17:51, rakhmet сказал:

    а) Выбор типа соединения (http/ftp) с поддержкой SSL.

    SSL поддерживается и является рекомендуемым способом.

    В 04.02.2017 в 17:51, rakhmet сказал:

    б) Возможность видеть текущую (используемую в настоящий момент) версию и ту, что доступна в обновлении.

    Версия в обновлении является одним из аргументов в функции-callback-а сообщающей о доступности обновления, текущую версию легко получить используя TFileVersion.CreateForFile()

    В 04.02.2017 в 17:51, rakhmet сказал:

    в) Доступный по нажатию на кнопку/ссылку какой-нибудь changelog/history - чтобы видеть, что конкретно несёт в себе обновление.

    Этого на данный момент нет, но может появиться в будущем.

    В 04.02.2017 в 17:51, rakhmet сказал:

    1. Обновление будет с полной заменой обновляемой файла, или же будет поддержка патчей (на тот случай, когда можно обойтись патчем на 0,5 мегабайта, чтобы не тянуть 50 мегабайт обновлённого файла)?

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

    В 04.02.2017 в 17:51, rakhmet сказал:

    2. Не понял, каким образом будет реализовано обновление для FMX - в обход мобильных магазинов?

    TurboUpdate предназначено исключительно для Windows, в будущем возможно появление поддержки MacOS.

  6. TurboUpdate Coming Soon.png

    TurboUpdate 2View.png

    Выложена альфа версия ErrorSoft TurboUpdate - библиотека для легкого добавления автообновления в ваши FMX и VCL приложения под Windows.

    Совместимость - Delphi Seattle и выше.

    Описания пока нет, но в репозитории есть примеры для ознакомления.

    Лицензирование - для OpenSource и не коммерческого использования данная библиотека абсолютно бесплатна, допустимо изменение и т.д.

    Для коммерческого применения - пока нет решения.

    https://github.com/errorcalc/TurboUpdate

    Перед использованием необходимо установить необходимые Packages:

    Это ранняя альфа, необходимы ваши отзывы, критика и т.д.

  7. 5 часов назад, Major сказал:

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

    http://www.gunsmoker.ru/2011/04/blog-post.html

  8. 10 часов назад, beegl сказал:

    Подскажите, чем заменить TGraphicControl в FMX?

     

    На Андроид переделать ScrollingText хочу)

     

      Скрыть контент
    
    
    unit ALScrollingText;
    
    interface
    
    uses
       System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls,
      FMX.WebBrowser, FMX.ScrollBox, FMX.Memo, FMX.Objects;
    
    type
      TTextLayout = (tlTop, tlCenter, tlBottom);
      TTextDirection = (tdLeftToRight, tdRightToLeft);
    
      TALScrollingText = class(TGraphicControl)
      private
        fText: String;
        Timer: TTimer;
        fSpeed: Integer;
        fBackgroundColor: TColor;
        BackBitmap: TBitmap;
        DrawnBitmap: TBitmap;
        WholeBitmap: TBitmap;
        Position: Integer;
        fEdgeFade: Boolean;
        fEdgeFadeWidth: Integer;
        fLayout: TTextLayout;
        fTextDirection: TTextDirection;
        fPixelJump: Integer;
        fVisible: Boolean;
        procedure SetText(const Value: String);
        procedure SetSpeed(const Value: Integer);
        procedure OnTimer(Sender: TObject);
        procedure SetBackgroundColor(const Value: TColor);
        procedure CMFontChanged(var Msg: TMessage); message CM_FontChanged;
        procedure InvalidateEverything;
        procedure SetEdgeFadeWidth(const Value: Integer);
        function CalcColorIndex(StartColor, EndColor: TColor; Steps, ColorIndex: Integer): TColor;
        procedure SetLayout(const Value: TTextLayout);
        procedure SetTextDirection(const Value: TTextDirection);
        procedure SetVisible(const Value: Boolean);
      protected
        procedure Paint; override;
        procedure Loaded; override;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure Resize; override;
      published
        property Text: String                   read fText              write SetText;
        property Speed: Integer                 read fSpeed             write SetSpeed              default 50;
        property BackgroundColor: TColor        read fBackgroundColor   write SetBackgroundColor    default clBtnFace;
        property EdgeFadeWidth: Integer         read fEdgeFadeWidth     write SetEdgeFadeWidth      default 15;
        property Layout: TTextLayout            read fLayout            write SetLayout             default tlCenter;
        property TextDirection: TTextDirection  read fTextDirection     write SetTextDirection      default tdLeftToRight;
        property PixelJump: Integer             read fPixelJump         write fPixelJump            default 1;
        property Visible: Boolean               read fVisible           write SetVisible;
        property Font;
        property Enabled;
        property ParentFont;
        property OnMouseDown;
        property OnMouseUp;
        property OnClick;
      end;
    
    procedure Register;
    
    implementation
    
    procedure Register;
    begin
      RegisterComponents('ScrollingTextEx', [TALScrollingText]);
    end;
    
    { TALScrollingText }
    
    constructor TALScrollingText.Create(AOwner: TComponent);
    begin
      inherited;
    
      BackBitmap := TBitmap.Create;
      DrawnBitmap := TBitmap.Create;
      WholeBitmap := TBitmap.Create;
      WholeBitmap.Transparent := True;
    
      Timer := TTimer.Create(nil);
      Timer.OnTimer := OnTimer;
    
      Width := 50;
      Height := 18;
    
      ParentFont := True;
    
      fVisible := True;
      fText := 'Text';
      Speed := 50;
      fEdgeFade := True;
      fEdgeFadeWidth := 15;
      fBackgroundColor := clBtnFace;
      fLayout := tlCenter;
      fTextDirection := tdLeftToRight;
      fPixelJump := 1;
      Position := -Width;
      Font.Color := clWindowText;
    end;
    
    destructor TALScrollingText.Destroy;
    begin
      Timer.Free;
      BackBitmap.Free;
      DrawnBitmap.Free;
      WholeBitmap.Free;
    
      inherited;
    end;
    
    procedure TALScrollingText.Loaded;
    begin
      inherited;
    
      InvalidateEverything;
      if fTextDirection = tdLeftToRight then
        Position := -(WholeBitmap.Width - Width)
      else
        Position := 0;
    end;
    
    procedure TALScrollingText.OnTimer(Sender: TObject);
    begin
      if Enabled then
      begin
        if fTextDirection = tdLeftToRight then
        begin
          Inc(Position, fPixelJump);
          if Position >= 0 then
            Position := -WholeBitmap.Width + Width;
        end
        else
        begin
          Dec(Position, fPixelJump);
          if Position <= -(WholeBitmap.Width - Width) then
            Position := 0;
        end;
        Paint;
      end;
    end;
    
    procedure TALScrollingText.Paint;
    begin
      inherited;
    
      BitBlt(DrawnBitmap.Canvas.Handle, 0, 0, Width, Height, BackBitmap.Canvas.Handle, 0, 0, SrcCopy);
      DrawnBitmap.Canvas.Draw(Position, 0, WholeBitmap);
    
      BitBlt(Canvas.Handle, 0, 0, Width, Height, DrawnBitmap.Canvas.Handle, 0, 0, SrcCopy);
    end;
    
    procedure TALScrollingText.InvalidateEverything;
    var
      i: Integer;
    begin
      with WholeBitmap do
      begin
        Canvas.Brush.Color := fBackgroundColor;
        Canvas.FillRect(Rect(0, 0, Width, Height));
        Canvas.Font := Self.Font;
        Width := WholeBitmap.Canvas.TextWidth(fText) + (2 * Self.Width);
        Height := Self.Height;
        if (Self.Font.Color = clGreen) or (fBackgroundColor = clGreen) then
        begin
          TransparentColor := clRed;
          Canvas.Font.Color := clRed;
        end
        else
        begin
          TransparentColor := clGreen;
          Canvas.Font.Color := clGreen;
        end;
        if fLayout = tlTop then
          Canvas.TextOut(Self.Width, 0, fText)
        else if fLayout = tlCenter then
          Canvas.TextOut(Self.Width, (Self.Height div 2) - (Canvas.TextHeight(fText) div 2), fText)
        else
          Canvas.TextOut(Self.Width, Self.Height - Canvas.TextHeight(fText), fText);
      end;
    
      with BackBitmap do
      begin
        Width := Self.Width;
        Height := Self.Height;
        Canvas.Brush.Color := Self.Font.Color;
        Canvas.FillRect(Rect(0, 0, Self.Width, Self.Height));
        if fEdgeFadeWidth > 0 then
        begin
          for i := 0 to fEdgeFadeWidth-1 do
          begin
            Canvas.Pen.Color := CalcColorIndex(fBackgroundColor, Self.Font.Color, fEdgeFadeWidth, i+1);
            Canvas.MoveTo(i, 0);
            Canvas.LineTo(i, Self.Height);
            Canvas.MoveTo(Width-i-1, 0);
            Canvas.LineTo(Width-i-1, Self.Height);
          end;
        end;
      end;
    
      DrawnBitmap.Width := Width;
      DrawnBitmap.Height := Height;
    end;
    
    procedure TALScrollingText.CMFontChanged(var Msg: TMessage);
    begin
      inherited;
    
      InvalidateEverything;
      Msg.Result := 1;
    end;
    
    procedure TALScrollingText.Resize;
    begin
      inherited;
    
      InvalidateEverything;
    end;
    
    procedure TALScrollingText.SetBackgroundColor(const Value: TColor);
    begin
      if fBackgroundColor <> Value then
      begin
        fBackgroundColor := Value;
        InvalidateEverything;
      end;
    end;
    
    procedure TALScrollingText.SetSpeed(const Value: Integer);
    begin
      if fSpeed <> Value then
      begin
        fSpeed := Value;
        Timer.Interval := Value;
      end;
    end;
    
    procedure TALScrollingText.SetText(const Value: String);
    begin
      if fText <> Value then
      begin
        fText := Value;
        InvalidateEverything;
      end;
    end;
    
    procedure TALScrollingText.SetEdgeFadeWidth(const Value: Integer);
    begin
      if fEdgeFadeWidth <> Value then
      begin
        fEdgeFadeWidth := Value;
        InvalidateEverything;
      end;
    end;
    
    procedure TALScrollingText.SetLayout(const Value: TTextLayout);
    begin
      if fLayout <> Value then
      begin
        fLayout := Value;
        InvalidateEverything;
      end;
    end;
    
    procedure TALScrollingText.SetTextDirection(const Value: TTextDirection);
    begin
      if fTextDirection <> Value then
      begin
        fTextDirection := Value;
        if Value = tdLeftToRight then
          Position := -(WholeBitmap.Width - Width)
        else
          Position := 0;
        InvalidateEverything;
      end;
    end;
    
    function TALScrollingText.CalcColorIndex(StartColor, EndColor: TColor; Steps, ColorIndex: Integer): TColor;
    var
      BeginRGBValue: Array[0..2] of Byte;
      RGBDifference: Array[0..2] of Integer;
      Red, Green, Blue: Byte;
      NumColors: Integer;
    begin
      if (ColorIndex < 1) or (ColorIndex > Steps) then
        raise ERangeError.Create('ColorIndex can''t be less than 1 or greater than ' + IntToStr(Steps));
      NumColors := Steps;
      Dec(ColorIndex);
      BeginRGBValue[0] := GetRValue(ColorToRGB(StartColor));
      BeginRGBValue[1] := GetGValue(ColorToRGB(StartColor));
      BeginRGBValue[2] := GetBValue(ColorToRGB(StartColor));
      RGBDifference[0] := GetRValue(ColorToRGB(EndColor)) - BeginRGBValue[0];
      RGBDifference[1] := GetGValue(ColorToRGB(EndColor)) - BeginRGBValue[1];
      RGBDifference[2] := GetBValue(ColorToRGB(EndColor)) - BeginRGBValue[2];
    
      // Calculate the bands color
      Red := BeginRGBValue[0] + MulDiv(ColorIndex, RGBDifference[0], NumColors - 1);
      Green := BeginRGBValue[1] + MulDiv(ColorIndex, RGBDifference[1], NumColors - 1);
      Blue := BeginRGBValue[2] + MulDiv(ColorIndex, RGBDifference[2], NumColors - 1);
      Result := RGB(Red, Green, Blue);
    end;
    
    procedure TALScrollingText.SetVisible(const Value: Boolean);
    begin
      if Value <> fVisible then
      begin
        fVisible := Value;
        Enabled := fVisible;
        TGraphicControl(Self).Visible := fVisible;
      end;
    end;
    
    end.

     

     

    ddddddddd.gif

    не очень понятно какое это имеет отношение к теме поста.

    А унаследоваться от TControl можно. 

  9. 3 часа назад, kami сказал:

    Чтобы начали ломать софт на FMX - софт должен стать популярным. Вероятность популяризации софта в какой-то мере пропорциональна количеству написанного софта. Количество написанного софта тем больше, чем популярнее язык/фреймворк. Посему - фразу следует построить так "Когда (если) FMX станет популярным - появится и взломанный софт, написанный на нем".

    Тоже самое сказанное другими словами.

  10. Взлом FMX приложения скорее всего более сложен чем взлом Java приложения.

    Хотя бы по причине кучи декомпиляторов Java байткода, с Delphi же сложнее, придеться копаться в бинарнике каким-нибудь отладчиком/дизассемблером.

  11. 1 час назад, Kitty сказал:

    Нет ни одного форума где не было бы руганьи. Плохо. Меня интересует только сухой приговор - перспективы fmx. И мнение разработчиков fmx тут главное...

    Они сами не знают, и у них нет единого мнения. Сейчас многое зависит от того какой релиз будет через год.

  12. Мое решение, все тоже - жду год, смотрю что происходит. Сейчас я стараюсь "доводить" свои наработки в OpenSource и выкладывать в бесплатном или нет варианте, делиться опытом, который есть в виде статей и заметок, чтобы оно не сгинуло если что...

  13. Ссылка: https://habrahabr.ru/post/318876/

    Автор: Error

    Описание:

    Delphi и C++Builder разработчики, использующие VCL не по наслышке знают о вездесущей проблеме мерцания контролов.
    Мерцание происходит при перерисовке, вследствие того, что сначала отрисовываеться фон компонента, и только потом сам компонент.
    И если в случае с наследниками от TWinControl частичным решением проблемы является установка свойства DoubleBuffered в True, что заставляет контрол отрисовываться в буфере(однако DoubleBuffered работает тоже не идеально, к прим.: контрол перестает быть прозрачным), то в случае с TGraphicControl решение с DoubleBuffered просто невозможно, из-за отсутствия у TGraphicControl окна, установка же DoubleBuffered в True у родителя не помогает, из-за того что отрисовка вложенных TGraphicControl-ов происходит уже после прорисовки родителя в буфере.
    Обычно остается только одно — смириться с мерцанием, и максимально упростить отрисовку для минимизации эффекта, или использовать по возможности исключительно TWinControl-ы, что не всегда возможно и удобно.

    Однажды намучившись с мерцанием, я не выдержал и решил решить эту проблему, раз и навсегда!

    ...

  14. 1 час назад, ZuBy сказал:

    вот вы часто используете нативные контролы и какие? браузер и карты не считаем, они кросс

    Использовать нативный TEdit и TMemo под iOS - must have.

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

    опять же повторюсь, что у айос почти нет фрагментации по сравнению с андроид

    И это тоже плюс к iOS.

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

    про какие костыли вы говорите?

    Конкретный пример не приведу, но FMX для Android есть костыли.

  15. 11 минут назад, ZuBy сказал:

    т.к. фрагментация у IOS небольшая в отличии от Android можно по ошибке сказать что там приложения работают лучше.

    если выбрать десять девайсов на андроиде с нормальными характеристиками (процом!), то приложения будут работать +/- одинаково

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

     

    Не соглашусь, под iOS доступны нативные компоненты, Z-Order.

    Delphi код работает в основном потоке, в отличие от Android, что уже от многих глюков уберегает.

    И в целом на мой взгляд интеграция с системой более аккуратная, из-за меньшего количество костылей в FMX для iOS.

  16. У меня в TLang в Seattle тупо в редакторе перевод нельзя добавить, так что это не наш метод xD

    В примере FMX приложения PowerOff просто в коде на русский текст заменяю, если в русской винде запущенно: https://github.com/errorcalc/PowerOff/blob/master/Main.pas#L206

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

    В Vcl есть встроенное средство для перевода, неплохое(хотя и заброшенное немного имхо), я его в https://github.com/errorcalc/ProjectScreen к примеру использую. Жалко аналога в Fmx нет.

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