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

Slym

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

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

  • Посещение

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

    39

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

  1. procedure SyncProc(Proc:TProc<TLightweightEvent>);
    var
      Event:TLightweightEvent;
    begin
      Event:=TLightweightEvent.Create;
      try
        Proc(Event);
        Event.WaitFor();
      finally
        Event.Free;
      end;
    end;
    
    function MessageDialogSync(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons;
          const ADefaultButton: TMsgDlgBtn; const AHelpCtx: THelpContext): TModalResult;
    var LocalResult: TModalResult;
    begin
      SyncProc(
        procedure(Event:TLightweightEvent)
        begin
          TThread.Synchronize(nil,
          procedure
          begin
            TDialogServiceAsync.MessageDialog(AMessage, ADialogType, AButtons, ADefaultButton, AHelpCtx,
              procedure(const AResult: TModalResult)
              begin
                LocalResult:=AResult;
                Event.SetEvent;
              end);
          end);
        end);
      result:=LocalResult;
    end;
    
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      TThread.CreateAnonymousThread(
        procedure
        begin
          while not TThread.CheckTerminated do
          begin
            TThread.Sleep(1000);
            if MessageDialogSync('Продолжать?', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],TMsgDlgBtn.mbYes,0)<>idYes then
              TThread.CurrentThread.Terminate;
          end;
        end).Start;
    end;

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

  2. type
      TOpenCustomScrollBox=class(TCustomScrollBox);
    procedure TScrollBoxService.OnViewportPositionChange(Sender: TObject;
      const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
    var ICtrl:IControl;
    begin
      ICtrl:=TControl(Sender).Root.Captured;
      if not assigned(ICtrl) then
      begin
        ICtrl:=TControl(Sender).Root.Focused;
        if not assigned(ICtrl) then
          exit;
      end;
    
      if TOpenCustomScrollBox(Sender).Content.ContainsObject(ICtrl.GetObject) then
      begin
        ICtrl.MouseUp(TMouseButton.mbLeft,[],0,0);
        ICtrl.DoMouseLeave;
      end;
    end;

     

  3.  

    var
    i:integer;
    begin
      s:='hello world';
      for i:=low(s) to high(s) do
        print(s[i]);
    end;

    s.Chars[0] и все остальное из TStringHelper всегда с нуля...

    но даже так огреб при расчете суммы ean13 :)

  4. ImageToStream.Free;
    убери может оно гасится раньше отправки

    var
    ImageToStream : TMemoryStream;
    begin
    ImageToStream := TMemoryStream.Create;
    ImageToStream.LoadFromFile('Здесь находится путь к файлу');
    ImageToStream.Position := 0;
    TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream;
    end;
    А вот который принимает: 
    
    procedure TForm1.TetheringAppProfile1Resources3ResourceReceived(const Sender: TObject; const AResource: TRemoteResource);
    begin
      ImageViewer1.Bitmap.LoadFromStream(AResource.Value.AsStream);
    end;

     

  5. 1 рабочий поток.
    но диалоги через Synchronize посылаются в главный поток
    при этом рабочий засыпает на Event.WaitFor;
    диалог закрывается и дергает Event.SetEvent;
     

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

  6. Я пробовал полезную нагрузку сунуть в поток а гуй через sync и с ожиданием Event
    как то так (псевдокод) :

    TThread.CreateAnonThread(
    begin
    Event:=TEvent.Create;
    try
      DoStep1;
      Event.Reset;
      TThread.Sync(
    	begin
          ShowMessageAsync('Ахтунг!'
          begin
            Event.SetEvent;
          end)
        end);
      Event.WaitFor;
      DoStep2;....
    fin
      Event.Free;
    end;
    
    end)


     

  7. 1 час назад, Krok27 сказал:

    Спасибо. ComObject все таки завязан на Windows, теряется смысл FMX как фреймворка. Просто есть порядка 30 компонентов разной степени сложности, написанные под VCL. Хотелось обойтись малой кровью при переходе. Композиция всегда считалась лучше чем наследование. Займёмся композицией. Спасибо всем.

    VCLComObject все таки завязан только названием! Остальное завязано только на QueryInterface, а оно нативно и мультиплатформенно

  8. наследовать ради интерфейса? не проще композицией интерфейс внести?
    property OptionsIntfImpl: IFDStanOptions read FOptionsIntf implements IFDStanOptions;
    можно было бы без наследования вообще через TComponent.VCLComObject, но какая то редиска в TPresentedControl не спустила QueryInterface до TComponent.QueryInterface
    но можно пропатчить FMX.Controls.Presentation.pas

    function TPresentedControl.QueryInterface(const IID: TGUID; out Obj): HRESULT;
    else
        Result := inherited;

    и делать так

    var Test:ITest;
    begin
      if Supports(Label1, ITest, Test) then
        Test.Test;
    end;

    Если надо пример - пиши, скину

  9. https://stackoverflow.com/questions/46457733/how-to-get-notification-authorization-status-in-swift-3
    т.е. както так- писал в блокноте

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TUNUserNotificationCenter.OCClass.currentNotificationCenter.getNotificationSettingsWithCompletionHandler(OnNotificationSettings);
    end;
    
    procedure TForm1.OnNotificationSettings(NotificationSettings: UNNotificationSettings);
    begin
      NotificationSettings.authorizationStatus;
    end;

     

  10.       if not TCLLocationManager.OCClass.locationServicesEnabled then
            abort;
    
          AuthorizationStatus:=TCLLocationManager.OCClass.authorizationStatus;
          if AuthorizationStatus in [kCLAuthorizationStatusDenied,  kCLAuthorizationStatusRestricted] then
            abort;
    
          if AuthorizationStatus in [kCLAuthorizationStatusAuthorizedWhenInUse, kCLAuthorizationStatusAuthorized] then
            abort;
    
          FLocater := TCLLocationManager.Create;
          try
            FLocater.retain;
            FLocater.requestWhenInUseAuthorization;
          finally
            FLocater.release;
            FLocater:=nil;
          end;

     

  11. 1. Патчить

     thgw_p1CPqL7vX7.png.c98bbcb16d59fc333ce58714e2363915.png

    2. Не хочется генофонд трогать
    Можно скопипастить к себе TAVAudioSession и патчить у себя...

    а потом

    AudioSession := TAVAudioSession.Wrap(TAVAudioSession.OCClass.sharedInstance);
    if AudioSession.recordPermission=AVAudioSessionRecordPermissionDenied then
    
    AudioSession.requestRecordPermission(TPermissionBlock.Proc);
    
    type
      TPermissionBlock=class
      public
        class procedure Proc(Granted: Boolean);
      end;
    
    class procedure TPermissionBlock.Proc(Granted: Boolean);
    begin
      if Granted then
    end;


     

  12. там еще дефайны стоят #if defined(WINDOWS) && !defined(WINDOWLESS)
    т.к. нельзя пропускать функции в структуре - надо точно знать с какими дефайнами длл сбилдена.
    если лень описывать ненужную функцию делай заглушкой SciterGetPPI: pointer;  - повторюсь пропускать нельзя

  13. В 04.10.2020 в 11:55, Дмитрий Потапов сказал:

    SciterVersion: function(major: Integer): UINT;

    а где тут stdcall?

    type
      PSciterAPI = ^ISciterAPI;
      ISciterAPI = packed record
        version: UINT;
        SciterClassName: function(): LPCWSTR;stdcall;
        SciterVersion: function(major: BOOL): UINT;stdcall;
      end;

  14. макросы разворачиваем в уме:
    sciter-x-api.h UINT
    SCFN( SciterVersion )(BOOL major);
    sciter-x-types.h  #
    define SCFN(name) (__stdcall *name)
    итог:
    SciterVersion: function(major:
    bool) UINT; stdcall;
    и всетаки попробуй bool оставить

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