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

Равиль Зарипов (ZuBy)

Модераторы
  • Постов

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

  • Посещение

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

    264

Сообщения, опубликованные Равиль Зарипов (ZuBy)

  1. 2 часа назад, Alisson R Oliveira сказал:

    извините за мое понимание вашего подразделения. Процедура «StatusBarGetBounds» не является функцией, которая не возвращает мне значение высоты строки состояния, поэтому я говорю, что у меня есть много знаний о предмете, высота бара состояния и босса для всех версий android (от 5 ) и независимо от марки устройства (asus, samsung, lg и др.)? Как вы можете привести пример правильного использования описанных вами процедур.

    еще раз спасибо

    Процедура возвращает результат в параметрах

    var
      statusbar, navbar: integer;
    begin
      StatusBarGetBounds(statusbar, navbar);
      Control.Margin.Top := statusbar;
    end;

     

  2. 1 час назад, Alisson R Oliveira сказал:

    Он работал, теперь он рисует строку состояния, но экран идет позади ... Я не видел, чтобы функция могла получить высоту строки состояния, чтобы сделать интервал, например, один из предыдущего примера
    "Layout.Margins.Top: = TmyWindow.StatusBarHeight;"
    Не могли бы вы помочь мне, как мне это сделать с этим новым подразделением, которое вы показали?

    благодарный

    Использовать процедуру 

    StatusBarGetBounds, там будет высота статус бара

  3. оставлю это здесь

    Скрытый текст

    unit uMain;

    interface

    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti, FMX.Grid.Style, FMX.Controls.Presentation,
      FMX.ScrollBox, FMX.Grid;

    type
      TStringGrid = class(FMX.Grid.TStringGrid)
      public
        property OnDblClick;
      end;

      TForm6 = class(TForm)
        StringGrid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure MyDblClick(Sender: TObject);
      end;

    var
      Form6: TForm6;

    implementation

    {$R *.fmx}

    procedure TForm6.FormCreate(Sender: TObject);
    begin
      StringGrid1.OnDblClick := MyDblClick;
    end;

    procedure TForm6.MyDblClick(Sender: TObject);
    begin
      ShowMessage('DblClick');
    end;

    end.

     

  4. 16 часов назад, Alisson R Oliveira сказал:

    если вы можете мне помочь, спасибо

    решение может быть такое

    не использовать стиль, тоже самое можно сделать программно. посмотрите этот модуль

    Скрытый текст

    unit FMX.StatusBar;

    {
      author : ZuBy
      rzaripov1990@gmail.com
    }

    interface

    uses
      System.UITypes, FMX.Platform
    {$IFDEF ANDROID} ,
      Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, Androidapi.Helpers,
      Androidapi.JNI.JavaTypes, Androidapi.JNI.App, FMX.Platform.Android, FMX.Helpers.Android
    {$ELSEIF defined(IOS)}
        , FMX.Helpers.iOS, FMX.Platform.iOS, iOSapi.UIKit, iOSapi.Foundation, iOSapi.CoreGraphics, iOSapi.CoreImage
    {$ENDIF};

    {$IFDEF ANDROID}

    type
      JWindowManager_LayoutParamsClassExt = interface(JWindowManager_LayoutParamsClass)
        ['{48861EC2-BC53-440A-B1B8-76FF4DF36F97}']
        { class } function _GetFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS: Integer; cdecl;
        { class } property FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS: Integer read _GetFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
      end;

      TJWindowManager_LayoutParamsExt = class(TJavaGenericImport<JWindowManager_LayoutParamsClassExt,
        JWindowManager_LayoutParams>)
      end;

      [JavaSignature('android/view/Window')]
      JWindowExt = interface(JWindow)
        ['{2810B178-9634-453D-8963-19CE145E6669}']
        procedure setStatusBarColor(color: Integer); cdecl;

        function getStatusBarColor: Integer; cdecl;
      end;

      TJWindowExt = class(TJavaGenericImport<JWindowClass, JWindowExt>)
      end;

    function GetWindowExt: JWindowExt;
    {$ENDIF}
    function Darker(color: TAlphaColor; Percent: Byte): TAlphaColor;

    procedure StatusBarGetBounds(out StatusBar, navigationBar: Integer);  // получаем размеры статус бара и нав бара
    procedure StatusBarSetColor(const aColor: TAlphaColor); // устанавливаем цвет формы!!

    implementation

    uses
      System.SysUtils;

    function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;

      function MathRound(AValue: Extended): Int64; inline;
      begin
        if AValue >= 0 then
          Result := Trunc(AValue + 0.5)
        else
          Result := Trunc(AValue - 0.5);
      end;

    begin
      if nDenominator = 0 then
        Result := -1
      else
        Result := MathRound(Int64(nNumber) * Int64(nNumerator) / nDenominator);
    end;

    function Darker(color: TAlphaColor; Percent: Byte): TAlphaColor;
    var
      r, g, b: Byte;
    begin
      r := TAlphaColorRec(color).r;
      g := TAlphaColorRec(color).g;
      b := TAlphaColorRec(color).b;
      r := r - MulDiv(r, Percent, 100);
      g := g - MulDiv(g, Percent, 100);
      b := b - MulDiv(b, Percent, 100);
      Result := TAlphaColorF.Create(r / 255, g / 255, b / 255, 1).ToAlphaColor;
    end;

    function Lighter(color: TAlphaColor; Percent: Byte): TAlphaColor;
    var
      r, g, b: Byte;
    begin
      r := TAlphaColorRec(color).r;
      g := TAlphaColorRec(color).g;
      b := TAlphaColorRec(color).b;
      r := r + MulDiv(255 - r, Percent, 100);
      g := g + MulDiv(255 - g, Percent, 100);
      b := b + MulDiv(255 - b, Percent, 100);
      Result := TAlphaColorF.Create(r / 255, g / 255, b / 255, 1).ToAlphaColor;
    end;

    {$IFDEF ANDROID}

    function GetWindowExt: JWindowExt;
    begin
      Result := TJWindowExt.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID);
    end;
    {$ENDIF}

    procedure StatusBarGetBounds(out StatusBar, navigationBar: Integer);
    {$IFDEF ANDROID}
    var
      KeyCharacterMap: JKeyCharacterMap;
      resourceID: Integer;
      ScreenService: IFMXScreenService;
      sScale: Single;
    {$ENDIF}
    begin
      navigationBar := 0;
      StatusBar := 0;
    {$IFDEF ANDROID}
      if TOSVersion.Check(5, 0) then // вроде только работает с 5.0 ниже нет устройства проверить
      begin
        sScale := 1;
        if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
          sScale := ScreenService.GetScreenScale; // получаем скейл

        resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('status_bar_height'),
          StringToJString('dimen'), StringToJString('android'));
        if resourceID > 0 then
          StatusBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);

        if not TJKeyCharacterMap.JavaClass.deviceHasKey(TJKeyEvent.JavaClass.KEYCODE_BACK) then
        // проверка на существование наэкранных кнопок или физических
        begin
          resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'),
            StringToJString('dimen'), StringToJString('android'));
          if resourceID > 0 then
            navigationBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);
        end;
      end;
    {$ENDIF}
    end;

    {$IFDEF IOS}

    function GetStatusBarView: UIView;
    var
      I: Integer;
      LViews: NSArray;
      LView: UIView;
    begin
      Result := nil;
      LViews := SharedApplication.keyWindow.rootViewController.view.subviews;
      for I := 0 to LViews.count - 1 do
      begin
        LView := TUIView.Wrap(LViews.objectAtIndex(I));
        if CGRectEqualToRect(LView.frame, SharedApplication.statusBarFrame) <> 0 then
        begin
          Result := LView;
          Break;
        end;
      end;
    end;

    procedure SetStatusBarBackgroundColor(const ABackgroundColor: TAlphaColor);
    var
      Red: Single;
      Green: Single;
      Blue: Single;
      ColorCI: CIColor;
      ColorUI: UIColor;
      StatusBarView: UIView;
    begin
      StatusBarView := GetStatusBarView;
      if StatusBarView = nil then
        Exit;
      Red := TAlphaColorRec(ABackgroundColor).r / 255;
      Green := TAlphaColorRec(ABackgroundColor).g / 255;
      Blue := TAlphaColorRec(ABackgroundColor).b / 255;
      ColorCI := TCIColor.Wrap(TCIColor.OCClass.colorWithRed(Red, Green, Blue));
      ColorUI := TUIColor.Wrap(TUIColor.OCClass.colorWithCIColor(ColorCI));
      StatusBarView.setBackgroundColor(ColorUI);
      if TOSVersion.Check(7, 0) then
        SharedApplication.keyWindow.rootViewController.setNeedsStatusBarAppearanceUpdate;
    end;
    {$ENDIF}

    procedure StatusBarSetColor(const aColor: TAlphaColor);
    {$IFDEF ANDROID}
    var
      Window: JWindowExt;
    {$ENDIF}
    begin
    {$IFDEF ANDROID}
      CallInUIThread(
        procedure
        begin
          if TOSVersion.Check(5, 0) then
          begin
            Window := GetWindowExt;
            Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
              TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
            Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
              TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            Window.setStatusBarColor(-16777216);
          end;
        end);
    {$ENDIF}
    {$IFDEF IOS}
      SetStatusBarBackgroundColor(aColor);
    {$ENDIF}
    end;

    end.

     

  5. 2 часа назад, om.pranayama сказал:

    Приношу извинения за беспокойство. Проблема была в TAniIndicator. Буду разбираться почему он так себя безобразно ведёт.

    рекомендуется заменить TAniIndicator на TBitmapListAnimation 

  6. 4 часа назад, Akad сказал:

    И каким образом это повлияет на разработанную 15 лет назад библиотеку?

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

  7. когда-то давно написал такую штуку (только не все поддерживается, в Readme написано)

    в вашем случае будет вот такие структуры

    Скрытый текст

    TmyType16662694 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType839887 = record
      id: integer;
      value: integer;
      label: string;
      name: string;
      sort: integer;
      is_main: boolean;
      statuses: TmyTypeStatuses;
      leads: integer;
    end;

    TmyType16662775 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType17082592 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType804520 = record
      id: integer;
      value: integer;
      label: string;
      name: string;
      sort: integer;
      is_main: boolean;
      statuses: TObject;
      leads: integer;
    end;

    TmyType142 = record
      id: integer;
      name: string;
      color: string;
      sort: integer;
      editable: string;
      pipeline_id: integer;
    end;

    TmyTypeResponse = record
      pipelines: TmyTypePipelines;
      server_time: integer;
    end;

    TmyType143 = record
      id: integer;
      name: string;
      color: string;
      sort: integer;
      editable: string;
      pipeline_id: integer;
    end;

    TmyType17082598 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType17073886 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType17040784 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyTypeStatuses = record
      142: TmyType142;
      143: TmyType143;
      17073904: TObject;
      17073907: TmyType17073907;
      17082598: TmyType17082598;
    end;

    TmyType17073907 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType17073889 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType16681687 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyTypePipelines = record
      804520: TmyType804520;
      804529: TObject;
      839881: TmyType839881;
      839884: TObject;
      839887: TmyType839887;
    end;

    TmyType17073898 = record
      id: integer;
      name: string;
      pipeline_id: integer;
      sort: integer;
      color: string;
      editable: string;
    end;

    TmyType839881 = record
      id: integer;
      value: integer;
      label: string;
      name: string;
      sort: integer;
      is_main: boolean;
      statuses: TObject;
      leads: integer;
    end;

    TmyTypeRecord = record
      response: TmyTypeResponse;
    end;

    не поддерживается только массив colors

    использую в связке с XSuperObject

    var
    	aRecord: TmyTypeRecord;
    begin
    	aRecord := TJson.Parse<TmyTypeRecord>(aJsonString);
        

    где aJsonString - ваш ответ с сервера

    дальше работа идёт делфовыми структурами, удобней в разы

    P.S. увидел пару недочетов в программе, надо будет в будущем поправить.

    но описать 3-4 структуры не должно составить труда (если они нужны)

  8. 3 часа назад, A. Sharif сказал:

    Вроде как есть такая возможность у FB, у остальных нет

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

    но в делфи ты не сделаешь своё активити, так что задача почти нереализуема

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