Перейти к содержанию

gonzales

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

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

  • Посещение

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

    10

gonzales стал победителем дня 3 июля

gonzales имел наиболее популярный контент!

Информация о gonzales

  • Звание
    Продвинутый пользователь

Посетители профиля

3 981 просмотров профиля
  1. Нашел причину, В недрах класса 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); Все работает
  2. Не могу одолеть пуши при компиляции приложения в 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 уже не идет, сразу ошибка. Если кто сталкивался, помогите плиз
  3. если бы все было так просто... в моем случае 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
  4. хммм, оказалось есть одна неприятная вещь, при переходе на 10.3 и отказе от Application.processmessages при первичном старте компоненты не сортируются. Дебаг показал, что у них у всех при первом запуске (Form1.RoomsScrollBox.Content.Children.Items[element] as TEssence).Position.Y = 0; то есть, я делаю вывод, что пока элементы не отобразились TAlignLayout.top - еще не сработало, они как-бы подвешены в памяти и сортировка поэтому не срабатывает. Ест какие-нибудь идеи кроме таймера как отрисовать элементы? Сейчас создание и дальнейшая сортировка срабатывают по form.show.
  5. Столкнулся с задачей, не могу понять как решить. На Android и iOS необходимо отловить нажатие Done (Enter) при работе с TEdit. Почему-то событие TEdit.onKeyDown не отрабатывает при нажатии на Done, во всех остальных случаях работает. Использовать form1.onvirtualkeyboardhidden не совсем устраивает, так как TEdit создается динамически, и должен быть убит по нажатию Done
  6. Вот так компилится 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; но входит в бесконечный цикл
  7. 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
  8. а не подскажите, как тоже самое сделать для scrollbox? там тоже есть метод Form1.RoomsScrollBox.Content.Sort(); Только у меня ругается на TListViewItem, говорит не знает такого var Comparer: IComparer<TListViewItem>;
  9. Да, сработало. По крайней мере приложение скомпилилось старым 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. Проверяем компиляцию проекта
  10. да, по всей видимости это беда. надо будет попробовать подменить в пакете XCode SDK
  11. Очередной update. Обновился iphone до версии 13.5, соответственно XCode говорит что нет у него DeviceSupport файлов, соответственно Делфа не может запустить проект на телефоне, нет отладки и все такое. При попытке скачать новый XCode АппСтор говорит, хрен тебе, обнови-ка сначала MacOS до версии 10.15. Но при попытке обновить МакОсь вылезает ошибка, что мол на твою железку 10.15 поставить нельзя. И все, никаких вариантов решения не предлагается. Очередной танец с бубном привел к следующему решению такой проблемы 1. Скачиваем свежий XCode по прямой ссылке https://developer.apple.com/download/more/ 2. Разархивируем скаченный архив 3. XCode конечно не открывается, кликаем правой кнопкой, выбираем пункт "показать содержимое пакета" 4. Идем по пути Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport, видим там папки со всеми версиями платформ. 5. Копируем нужные версии в тот же каталог рабочей версии XCode. 6. Запускаем XCode, подключаем телефон, убеждаемся, что XCode больше не ругается. 7. Скаченный XCode можно удалить На данный момент опробовано для Delphi 10.3.3, XCode 10.1. Скачивал XCode версии 11.5.
  12. gonzales

    потоки в ios

    Переделал вот так procedure TForm5.Button16Click(Sender: TObject); begin TTask.Run( procedure begin //действия end); end; и заработало. Странно, я всегда думал, что TTask и TThread - это одно и то же.
  13. gonzales

    потоки в ios

    Доброго всем времени суток. При переходе на 10.3.3. на iOS стало крошится приложение при использовании потока, причем не всегда, иногда отрабатывает, иногда даже несколько раз, но однозначно падает с третьего, четвертого раза. Конструкция вот такая procedure TForm5.Button16Click(Sender: TObject); var thread1: TThread; begin thread1 := TThread.CreateAnonymousThread( procedure begin //действия end); thread1.freeonterminate := true; thread1.start; end; сами действия в потоке работают нормально, проверял. если убрать поток и оставить только действия, то все работает нормально, но заворачиваю в поток и все. Причем это не только конкретно в одном месте, а везде, где используется поток. Если кто знает, подскажите, что не так. Заранее спасибо
  14. Работает только в одном случае, если стиль TSwitchObject положить в Layout. Но пропадает свойство IsChecked, компонент становится неработоспособен.
  15. Тоже не сработало((
×
×
  • Создать...