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

gonzales

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

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

  • Посещение

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

    27

Весь контент gonzales

  1. Че то не срослось((( Два раза проверил, выдает 5 ошибок ERROR ITMS-90022: "Missing required icon file. The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format for iOS versions >= 10.0. To support older versions of iOS, the icon may be required in the bundle outside of an asset catalog. Make sure the Info.plist file includes appropriate entries referencing the file. See https://developer.apple.com/documentation/bundleresources/information_property_list/user_interface" ERROR ITMS-90023: "Missing required icon file. The bundle does not contain an app icon for iPad of exactly '152x152' pixels, in .png format for iOS versions >= 10.0. To support older operating systems, the icon may be required in the bundle outside of an asset catalog. Make sure the Info.plist file includes appropriate entries referencing the file. See https://developer.apple.com/documentation/bundleresources/information_property_list/user_interface" ERROR ITMS-90474: "Invalid Bundle. iPad Multitasking support requires these orientations: 'UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight'. Found 'UIInterfaceOrientationPortrait,UIInterfaceOrientationLandscapeLeft' in bundle 'ююю'." ERROR ITMS-90475: "Invalid Bundle. Your app supports Multitasking on iPad, so you must include the UILaunchStoryboardName key in your bundle, 'ююю’. Learn more (https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW40)." ERROR ITMS-90704: "Missing App Icon. An app icon measuring 1024 by 1024 pixels in PNG format must be included in the Asset Catalog of apps built for iOS, iPadOS, or watchOS. Without this icon, apps cannot be submitted for review. For details, see https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/app-icon/."
  2. Все срослось, заработало на андроиде как надо!!!! Исправил прямо в исходнике. Спасибо огромное!!!!
  3. А почему нужно копировать в папку к себе, почему нельзя исправить сразу в исходнике?
  4. в 10.4 тоже самое((( Прозрачность не отрабатывается. Более того, при создании формы типа TCustomPopup неадекватно работают TEdit, это связано с невозможностью установить фокус popup окна на поле ввода.
  5. constructor TEssence.CreateCustom(AOwner: TComponent; X: Single; Y: Single; W: Single; H: Single; R: Single; Str_T: Single; Str_C: cardinal; Fill_C: cardinal; FontColor: cardinal; FontSize: Single; Im_size: Single; text: string; El_W:Single; AlignEssence:byte); var Size: TSizeF; NameAni: TFloatAnimation; RectAni: TFloatAnimation; ImAni: TFloatAnimation; begin inherited Create(AOwner); Parent := AOwner as TFmxObject; XRadius := R; YRadius := R; Stroke.Thickness := Str_T; Stroke.Color := Str_C; ..... это конструктор родителя constructor TPult.Create(AOwner: TComponent; X: Single; Y: Single; W: Single; H: Single; Pult_Align:integer; R: Single; Str_T: Single; Str_C: cardinal; Fill_C: cardinal; Font_C: cardinal; FontSize: Single; text: string; image: string; ColCount: byte; RowCount: byte); var i:integer; c:single; begin //inherited CreatePult(AOwner); inherited CreateCustom(AOwner, X, Y, W, H, R, Str_T, Str_C, Fill_C, Font_C, FontSize, 0, text, 0, 0); if Pult_Align = 1 then begin Align:=TAlignLayout.Top; Margins.Top := 5; Margins.Bottom := 5; Margins.Left := 10; Margins.Right := 10; .... а это конструктор наследника. TPult - наследник от TEssence. Соответственно, если в наследнике Pult_Align = 1, наследник прибивается к топу, но его Width не изменяется.
  6. Собственно сабж, не могу сообразить. Создаю в рантайме компонент, у которого указываю Width и Height. После чего компоненту присваивается Align:=TAlignLayout.Top; Однако Width не меняется. Каким образом заставить программу пересчитать размеры компонента. Пробовал все что могло повлиять, Resize, RecalcSize, Realign и тд. Ничего не срабатывает(((
  7. На iOS заметил, что приложение крашится при использовании aNotificationCenter.CancelAll; Пока не понятно, как без этого удалить пуши из шторки.
  8. Нашел причину В Library path для Андроид64 добавил путь E:\Embarcadero\Studio\21.0\source\rtl\android, где собственно и лежит Androidapi.JNI.PlayServices.Tasks.pas и все заработало. Буду с iOS разбираться теперь
  9. Веселье продолжается. Все тоже стандартное приложение не компилится на Андроид64 (На iOS тоже, но с ним буду разбираться отдельно) Ругается на юнит FMX.PushNotification.Android [DCC Fatal Error] Unit1.pas(10): F2613 Unit 'Androidapi.JNI.PlayServices.Tasks' not found. Unit1.pas(10): Unit 'Androidapi.JNI.PlayServices.Tasks' is used by 'Androidapi.JNI.Firebase' Unit1.pas(10): Unit 'Androidapi.JNI.Firebase' is used by 'FMX.PushNotification.Android' Может библиотеку нужно какую добавить? ЗЫ. Для Андроид32 компилится без ошибок и работает правильно
  10. overload - с помощью этой директивы можно объявлять одноименные методы/процедуры с разным набором параметровoverride - эта деректива перекрывает реализацию виртуального/динамического метода/конструктора/деструктора/ родительского класса и обозначает, что у наследника она будет своя
  11. Доброго времени суток! Использую 10.4, пытаюсь в рантайме создать и удалить контролы. Вот простое приложение, две кнопки, вертикальный скролбокс и мемо. unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo; type TMyObject = class(TCircle) protected constructor Create(AOwnedObject: TComponent); Overload; constructor CreateCustom(AOwnedObject: TComponent); Overload; destructor Destroy; Overload; end; type TForm1 = class(TForm) VertScrollBox1: TVertScrollBox; Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} constructor TMyObject.Create(AOwnedObject: TComponent); begin inherited Create(AOwnedObject); Parent := AOwnedObject as TFmxObject; Width := 20; Height := 20; Align := TAlignLayout.Top; Fill.Color := TAlphaColors.Red; form1.Memo1.Lines.Add('create'); end; constructor TMyObject.CreateCustom(AOwnedObject: TComponent); begin inherited Create(AOwnedObject); Parent := AOwnedObject as TFmxObject; Width := 20; Height := 20; Align := TAlignLayout.Top; Fill.Color := TAlphaColors.Blue; form1.Memo1.Lines.Add('create'); end; destructor TMyObject.Destroy; begin form1.Memo1.Lines.Add('delete'); inherited; end; procedure TForm1.Button1Click(Sender: TObject); var MyCircle: TMyObject; I: Integer; begin for I := 0 to 5 do begin MyCircle := TMyObject.Create(VertScrollBox1); end; end; procedure TForm1.Button2Click(Sender: TObject); var MyCircle: TFmxObject; begin while VertScrollBox1.Content.ChildrenCount > 0 do begin MyCircle := VertScrollBox1.Content.Children[0]; VertScrollBox1.Content.RemoveObject(MyCircle); MyCircle.DisposeOf; MyCircle:=nil; end; end; end. проблема в уничтожении объектов - не заходит в деструктор, вообще, никак. Оказалось что директива Overload для декструктора не отрабатывает. Правильно было написать destructor Destroy; Override; Если, кто из гуру даст комментарий, почему так, буду благодарен (для общего развития);
  12. Нашел причину, В недрах класса TPushService TPushService = class abstract public type TPropPair = TPair<string, string>; TPropArray = TArray<TPropPair>; // commonly used names TServiceNames = record public const GCM = 'gcm'; // deprecated 'Is not available anymore. Please use FCM instead'; // Google cloud messaging FCM = 'fcm'; // Google Firebase cloud messaging APS = 'aps'; // Apple end; Соответственно нужно исправить FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); на FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM); Все работает
  13. Не могу одолеть пуши при компиляции приложения в 10.4 Вот стандартный код unit Unit1; 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.ScrollBox, FMX.Memo, System.PushNotification, System.JSON, System.Net.HTTPClient, System.Threading,REST.Types {$IFDEF ANDROID}, FMX.PushNotification.Android, FMX.Memo.Types{$ENDIF} {$IFDEF IOS}, FMX.PushNotification.IOS{$ENDIF}; type TForm1 = class(TForm) MemoLog: TMemo; procedure FormCreate(Sender: TObject); private FDeviceID: string; FDeviceToken: string; FPushService: TPushService; FPushServiceConnection: TPushServiceConnection; procedure OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification); procedure OnServiceConnectionChange(Sender: TObject; AChange: TPushService.TChanges); procedure PushServiceRegister; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} const FAndroidServerKey = '13648316531'; procedure TForm1.OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification); const FCMSignature = 'gcm.notification.body'; GCMSignature = 'message'; APNsSignature = 'alert'; var aText: string; aObj: TJSONValue; begin // это событие срабатывает при открытом приложении {$IFDEF ANDROID} aObj := ANotification.DataObject.GetValue(GCMSignature); if aObj <> nil then aText := aObj.Value else aText := ANotification.DataObject.GetValue(FCMSignature).Value; {$ELSE} aObj := ANotification.DataObject.GetValue(APNsSignature); if aObj <> nil then aText := aObj.Value; {$ENDIF} ShowMessage(aText); end; procedure TForm1.OnServiceConnectionChange(Sender: TObject; AChange: TPushService.TChanges); begin if (TPushService.TChange.DeviceToken in AChange) and Assigned(FPushServiceConnection) then begin FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]; MemoLog.Lines.Add('DeviceID - '+ FDeviceID); MemoLog.Lines.Add('DeviceToken - '+ FDeviceToken); end; end; procedure TForm1.PushServiceRegister; begin FPushService := nil; FPushServiceConnection := nil; {$IF defined(ANDROID)} FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey; {$ENDIF} {$IF defined(IOS) AND defined(CPUARM)} FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.APS); {$ENDIF} if Assigned(FPushService) then begin FPushServiceConnection := TPushServiceConnection.Create(FPushService); FPushServiceConnection.OnChange := OnServiceConnectionChange; FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent; FPushServiceConnection.Active := true; FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]; MemoLog.Lines.Add('DeviceID - '+ FDeviceID); MemoLog.Lines.Add('DeviceToken - '+ FDeviceToken); end; end; procedure TForm1.FormCreate(Sender: TObject); begin PushServiceRegister; end; end. При регистрации пуш-сервиса строка FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey; вызывает Segmentation Fault (11) В 10.3 тот же самый код работает, дебаг ничего не дает, проваливаюсь в процедуру procedure TPushService.SetAppProp(const AName, AValue: string); begin FAppProps.AddOrSetValue(AName, AValue); end; а внутрь AddOrSetValue уже не идет, сразу ошибка. Если кто сталкивался, помогите плиз
  14. если бы все было так просто... в моем случае TEssense - это родительский класс для других компонентов, сортировать на этапе создания - означало бы иметь кучу вложенных циклов, не уверен, что это было бы шустро. А ларчик просто открывался, по недогляду забыл про Result:=0; Вот рабочий код procedure TForm1.SortGroup; begin Form1.RoomsScrollBox.sort( function(LeftItm, RightItm: TFmxObject): integer begin Result := 0; if TEssence(LeftItm).SortIndex > TEssence(RightItm).SortIndex then Result := 1 else if TEssence(LeftItm).SortIndex < TEssence(RightItm).SortIndex then Result := -1; end); end; Не забываем про BeginUpdate, EndUpdate
  15. хммм, оказалось есть одна неприятная вещь, при переходе на 10.3 и отказе от Application.processmessages при первичном старте компоненты не сортируются. Дебаг показал, что у них у всех при первом запуске (Form1.RoomsScrollBox.Content.Children.Items[element] as TEssence).Position.Y = 0; то есть, я делаю вывод, что пока элементы не отобразились TAlignLayout.top - еще не сработало, они как-бы подвешены в памяти и сортировка поэтому не срабатывает. Ест какие-нибудь идеи кроме таймера как отрисовать элементы? Сейчас создание и дальнейшая сортировка срабатывают по form.show.
  16. Столкнулся с задачей, не могу понять как решить. На Android и iOS необходимо отловить нажатие Done (Enter) при работе с TEdit. Почему-то событие TEdit.onKeyDown не отрабатывает при нажатии на Done, во всех остальных случаях работает. Использовать form1.onvirtualkeyboardhidden не совсем устраивает, так как TEdit создается динамически, и должен быть убит по нажатию Done
  17. Вот так компилится procedure TForm1.SortGroup; var Comparer: IComparer<TFmxObject>; t: TFMXObjectSortCompare; begin t := function (LeftItm, RightItm: TFmxObject): integer begin if TEssence(LeftItm).SortIndex > TEssence(RightItm).SortIndex then Result := 1 else if TEssence(LeftItm).SortIndex < TEssence(RightItm).SortIndex then Result := -1; end; Form1.RoomsScrollBox.sort(t); end; но входит в бесконечный цикл
  18. procedure TForm1.SortGroup; var Comparer: IComparer<TEssence>; begin Comparer := TDelegatedComparer<TEssence>.Create( function(const LeftItm, RightItm: TEssence): Integer begin if LeftItm.SortIndex > RightItm.SortIndex then Result:= 1 else if LeftItm.SortIndex < RightItm.SortIndex then Result:= -1; end); Form1.RoomsScrollBox.Content.Sort(Comparer); end; Вот так ругается [dcc32 Error] main_unit.pas(3918): E2010 Incompatible types: 'TFmxObjectSortCompare' and 'System.Generics.Defaults.IComparer<Essenses_unit.TEssence>' TEssence - мой класс, наследован от TRectangle
  19. а не подскажите, как тоже самое сделать для scrollbox? там тоже есть метод Form1.RoomsScrollBox.Content.Sort(); Только у меня ругается на TListViewItem, говорит не знает такого var Comparer: IComparer<TListViewItem>;
  20. Да, сработало. По крайней мере приложение скомпилилось старым XCode (10.1) с подменой SDK на версию 13.5 Техника секса: 1. Скачиваем свежий XCode по прямой ссылке https://developer.apple.com/download/more/ 2. Разархивируем скаченный архив 3. XCode конечно не открывается, кликаем правой кнопкой, выбираем пункт "показать содержимое пакета" 4. Идем по пути Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs, видим там папку и ярлык на SDK. 5. Копируем эту папку и ярлык в тот же каталог рабочей версии XCode. 6. Запускаем XCode 7. В Делфи запускаем SDK Manager. Добавляем новый SDK для iOS, видим, что система предлагает уже измененную версию (у меня 13.5), скачиваем ее, устанавливаем SDK 8. Проверяем компиляцию проекта
  21. да, по всей видимости это беда. надо будет попробовать подменить в пакете XCode SDK
×
×
  • Создать...