Slym
-
Постов
180 -
Зарегистрирован
-
Посещение
-
Победитель дней
39
Сообщения, опубликованные Slym
-
-
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;
поток тормозится до исполнения диалога... диалог показывается в главном потоке
-
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;
-
В 09.08.2020 в 00:06, Bob32 сказал:
Вопрос - а как под IOS-ом?
Собственно - это только IOS
Все там есть. см iOSapi.CoreLocation.pas -
-
var i:integer; begin s:='hello world'; for i:=low(s) to high(s) do print(s[i]); end;
s.Chars[0] и все остальное из TStringHelper всегда с нуля...
но даже так огреб при расчете суммы ean13
-
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;
-
1 рабочий поток.
но диалоги через Synchronize посылаются в главный поток
при этом рабочий засыпает на Event.WaitFor;
диалог закрывается и дергает Event.SetEvent;
у меня это тоже не как скелет, все кишки с евентами и синхронизами спрятаны, 1-3 скроки показать диалог... остальное бизнес логика
-
-
Я пробовал полезную нагрузку сунуть в поток а гуй через 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)
-
Да весь FMX на интерфейсах и QueryInterface...
FireDAC так вообще страшный сон все на QueryInterface, на фабриках фабрик.а Модель COM - построена на одном интерфейсе - IDispatch, все!
-
1 час назад, Krok27 сказал:
Спасибо. ComObject все таки завязан на Windows, теряется смысл FMX как фреймворка. Просто есть порядка 30 компонентов разной степени сложности, написанные под VCL. Хотелось обойтись малой кровью при переходе. Композиция всегда считалась лучше чем наследование. Займёмся композицией. Спасибо всем.
VCLComObject все таки завязан только названием! Остальное завязано только на QueryInterface, а оно нативно и мультиплатформенно
-
5 часов назад, krapotkin сказал:
Написал бы сразу статью сюда. Для всех полезно было бы
Хотелось бы рецензию на статью
-
Пример в атаче, там же патченый FMX.Controls.Presentation
-
наследовать ради интерфейса? не проще композицией интерфейс внести?
property OptionsIntfImpl: IFDStanOptions read FOptionsIntf implements IFDStanOptions;
можно было бы без наследования вообще через TComponent.VCLComObject, но какая то редиска в TPresentedControl не спустила QueryInterface до TComponent.QueryInterface
но можно пропатчить FMX.Controls.Presentation.pasfunction TPresentedControl.QueryInterface(const IID: TGUID; out Obj): HRESULT;
else
Result := inherited;
и делать такvar Test:ITest;
begin
if Supports(Label1, ITest, Test) then
Test.Test;
end;Если надо пример - пиши, скину
-
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;
-
Таймер не?
-
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;
-
1. Патчить
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;
-
-
В 07.10.2020 в 15:25, destroyer86 сказал:
Всем привет, подскажите, а как вы собирали jar библиотеку из https://github.com/mik3y/usb-serial-for-android/
я обычно с гуя:
-
-
там еще дефайны стоят #if defined(WINDOWS) && !defined(WINDOWLESS)
т.к. нельзя пропускать функции в структуре - надо точно знать с какими дефайнами длл сбилдена.
если лень описывать ненужную функцию делай заглушкой SciterGetPPI: pointer; - повторюсь пропускать нельзя -
В 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; -
макросы разворачиваем в уме:
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 оставить
[Android] Разделить скроллинг и нажатие
в Жесты
Опубликовано · Изменено пользователем Slym
атак?
if TOpenCustomScrollBox(Sender).ContainsObject(ICtrl.GetObject) then