gonzales
Пользователи-
Постов
334 -
Зарегистрирован
-
Посещение
-
Победитель дней
27
Весь контент gonzales
-
попробую подождать, но что-то мне подсказывает, что проблема не в этом.
-
И работает демо из коробки, ничего изменять не надо? Только вбить FPushClient.GCMAppID? Я правильно понимаю, что при отправке Notification из консоли Firebase я должен сразу получить уведомление?
-
А какая версия Delphi?
-
Запустил Демо, уведомления не приходят. Ошибок никаких не выдается, но и уведомлений нет. Функция procedure TForm1.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); begin if TPushService.TChange.DeviceToken in AChange then begin Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID); Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken); end; end; отрабатывает, появляются значения DeviceID и DeviceToken, а функция procedure TForm1.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); begin Memo1.Lines.Add('Notification: ' + ANotification.DataObject.ToString); end; не вызывается. Может я что не так в FireBase настроил. Но вроде там трудно ошибиться.
-
Сделал по указанному варианту. Работает везде кроме iOS, splash не показывается, логотип висит до отрисовки form1 begin Application.Initialize; Application.FormFactor.Orientations := [TFormOrientation.Portrait]; Application.CreateForm(TSplashForm, SplashForm); Application.Run; end. procedure TSplashForm.FormShow(Sender: TObject); begin Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm5, Form5); Application.CreateForm(TForm6, Form6); Application.CreateForm(TForm7, Form7); Application.CreateForm(TForm8, Form8); Application.CreateForm(TForm9, Form9); Application.CreateForm(TForm4, Form4); Application.CreateForm(TForm10, Form10); Application.CreateForm(TForm11, Form11); Application.CreateForm(TfBaseDialog, fBaseDialog); Application.CreateForm(TForm12, Form12); PreloadConfiguration; form1.Show; end; procedure TForm1.FormShow(Sender: TObject); begin application.MainForm := Form1; SplashForm.Close; end;
-
Спасибо! Хотя описанный способ прямо противоположен описанному здесь Попробую переделать
-
Рабочая комбинация программ для публикации в AppStore
gonzales опубликовал вопрос в Публикация в AppStore
Имею: Delphi 10.1 up2 Xcode 9.0.1 PAServer 18 SDK 11.0 MacOs Sierra 10.12 Не удается скомпилить приложение для конфигурации ApplicationStore [PAClient Error] Error: E0776 xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH Поиски по сети навели на нерадостные сообщение, что проблема в версии XCode. Что начиная с версии 8.3. в XCode отсутствует PackageApplication, но Apple требует версии XCode для публикации как раз не ниже 8.3. Опять же на MACOs Sierra 8-я версия не ставится. Вопрос к знатокам, какая комбинация программ устойчиво работает с ApplicationStore? -
Тоже интересует тема. Сделал по Вашему примеру, вроде скомпилилось, пока есть только iPad, проверить не на чем, но вопрос в другом: а как читать смс-ки в ios Вы случайно не знаете?
-
Не очень понял, чем это может помочь! В общем процедуру, которая в потоке запрашивает у сервера информацию и обновляет состояние компонента я написал, но теперь есть другая засада. Эта процедура срабатывает по таймеру в 1 сек, соответственно работает в своем потоке. Но иногда проявляется следующий баг, пользователь принудительно меняет состояние объекта (при этом он перерисовывается), и тут же перерисовывается обратно по таймеру (так как информация о смене состояния на сервер еще не попала) и только на следующем такте (обращении по таймеру к серверу) объект перерисуется в правильное состояние. Вопрос, могу ли я каким-то образом в момент нажатия пользователем на объект остановить выполнение задачи в потоке? Надеюсь что-то понятно из моего объяснения))
-
Добрый день! Делаю приложение для мобильных платформ. По совету с форума сделал одну автоматическую форму, в которой по OnShow создаю все остальные. Пока все это создается показываю на сплеше progressbar. В конце загрузки показываю form1.Show; procedure TForm1.FormShow(Sender: TObject); begin application.MainForm := Form1; SplashForm.Close; end; Все замечательно работает на Андроиде и в iOS не показывает SplashForm, долго показывает встроенный Splash (с логотипом Delphi) и сразу главную форму. begin Application.Initialize; Application.FormFactor.Orientations := [TFormOrientation.Portrait]; Application.CreateForm(TSplashForm, SplashForm); //SplashForm.Show; Application.Run; end. Если активировать SplashForm.Show - в винде приложение валится. Вопрос собственно, как заставить ioS показать SplashForm
-
Спасибо Maximus, учту. Несколько уточняющих вопросов 1. Любое обращение к форме нужно проводить с синхронизацией? Я думал это только визуальных компонентов касается, которые должны в главном потоке отрисовываться. 2. С таймером - хорошая мысль, попробую, вдруг действительно не успевает отработать, это объяснило бы глюки на андроиде. 3. Объектов до 10 и по каждому запрос, только запрос не HTTP, так как у меня не web-сервер, а это просто пакет байт, на который сервер отвечает таким же пакетом. Я уже думаю над тем, чтобы передавать всю информацию в одном пакете, но для этого придется полностью переколбасить сервер, а сейчас пока на это нет времени. А нельзя TCPClient заставить работать в асинхронном режиме?
-
Может я вообще не с того конца решаю задачу и уважаемая общественность подскажет более правильный путь. Опишу более подробно. Есть объекты, у них есть состояние, о нем знает сервер. Соответственно клиентов может быть несколько и у всех должно синхронно обновляться состояние при изменении его на сервере. Сервер - это МК со своими прибамбасами, но сейчас не об этом. Клиенты - приложение для IOS и Android. Задача - получать данные с сервера о состоянии активных в данный момент объектах, желательно, чтобы основной интерфейс не тормозил в моменты получения информации.
-
Еще есть подозрение, что проблема кроется в том, что из потока идет обращение к функции посылки и приема сообщений Вот она procedure TForm1.SendHTTPMessage; var t_out, t_in: TIdBytes; Size: TSizeF; localAnswer: byte; localicon: byte; localserver: boolean; begin try Size.cx := 16; Size.cy := 16; if Client1.Connected = false then Client1.Connect; if Client1.Connected = true then begin localicon := 15; localserver := true; localAnswer := 0; SetLength(t_out, SizeOf(HTTPRequest)); Move(HTTPRequest, t_out[0], SizeOf(HTTPRequest)); Client1.Socket.WriteBufferOpen; Client1.Socket.Write(t_out, 13); Client1.Socket.WriteBufferFlush; Client1.Socket.WriteBufferClose; SetLength(t_in, SizeOf(THTTPAnswer)); try Client1.Socket.ReadBytes(t_in, SizeOf(THTTPAnswer), false); Move(t_in[0], HTTPAnswer, Length(t_in)); localAnswer := HTTPAnswer.Command; Client1.Disconnect; except localicon := 7; localserver := false; localAnswer := 0; Form1.Client1.Disconnect; end; end else begin Client1.Disconnect; localicon := 7; localserver := false; localAnswer := 0; end; except on E: Exception do begin // showmessage('Error: ' + E.Message); Client1.Disconnect; localicon := 7; localserver := false; localAnswer := 0; end; end; Form1.ConnectImage.Bitmap := Form1.IconList.Bitmap(Size, localicon); AnswerIsComming := localAnswer; Form1.ServerOK := localserver; end;
-
Обращение к серверу в потоке (Android)
gonzales опубликовал вопрос в Потоки и распределенные вычисления
Доброго времени суток! Решаю следующую задачу, в приложении динамически формируются разные объекты, наследники от одного класса. При формировании объектов заполняется динамический массив этих элементов. Далее я хочу в отдельном потоке для каждого из элементов массива получить его состояние, то есть делаю запрос к серверу. Все это повешено на таймер, каждую секунду должен отрабатываться запрос. Все более менее работает в Windows, а на Андроиде со временем приложение валится. Вот код таймера, для читаемости я удалил куски с различными вариантами E. RootElements - это массив TEssense от которого есть наследники. Функции GetBoardCurrentValue, GetBoardMaxValue - по сути запросы к серверу. Подскажите, правильно ли я оформляю работу с потоками для работы на Андроиде? procedure TForm1.MasterTimerTimer(Sender: TObject); begin TTask.Run( procedure var l, d, a: byte; i,j:integer; E: TEssence; p: Pointer; VirtualNode: IXMLNode; VirtualElementNode: IXMLNode; id: byte; begin l := Length(Form1.RoomElements); for j := 0 to l - 1 do begin E := Form1.RoomElements[j]; // Реле if E is TRele then begin d := (E as TRele).Device_ID; a := (E as TRele).Device_Adress; if Form1.GetBoardCurrentValue(d, a) = true then begin TThread.Synchronize(nil, procedure begin (E as TRele).ReleSwitch.IsChecked := Form1.device[d].Board[a].CurrentValue.ToBoolean; end); end; // (E as TRele).ReleOnTimer(E) end // Диммер else if E is TDimmer then begin d := (E as TDimmer).Device_ID; a := (E as TDimmer).Device_Adress; if Form1.GetBoardMaxValue(d, a) = true then begin TThread.Synchronize(nil, procedure begin if (Form1.device[d].Board[a].Type_ID = TType.Светодиод) or (Form1.device[d].Board[a].Type_ID = TType.Диммер220) then begin (E as TDimmer).DimmerValue.Text := (Form1.device[d].Board[a].MaxValue).ToString; end; end); end; // (E as TDimmer).DimmerOnTimer(E) end // Таймер else if E is TSTimer then begin id := (E as TSTimer).STimerIndex; Form1.FillHTTPRequest(0, 0, HTTP_GET_TIMER_INFO, id); if Form1.AnswerIsComming = HTTP_GET_TIMER_INFO then begin TThread.Synchronize(nil, procedure begin if Form1.HTTPAnswer.Data1 = 0 then (E as TSTimer).Interval.Text := 'OFF' else (E as TSTimer).Interval.Text := 'ON' end); end; // (E as TSTimer).STimerOnTimer(E); end; end; end); end; -
Загрузка картинок из папки в ImageList
gonzales ответил gonzales вопрос в Работа с файловой системой
Круто!! Спасибо, попробую. Хотя уже сделал, как говорили выше. -
Загрузка картинок из папки в ImageList
gonzales ответил gonzales вопрос в Работа с файловой системой
Ну сами понимаете, что не проще)))) Но видать делать нечего, придется действовать именно так. Просто удивительно, на что опирается Андроид, когда файлы загружает именно в том порядке, в каком они были задеплоины. Хотя сами файлы (я посмотрел на телефоне) выглядят также как и в Винде, дата создания у них одна и та же, никаких префиксов у них не появляется. И вторая странность, почему в деплой-менеджере при добавлении файла он попадает не в конец списка а куда-то в середину, причем, например файл 017.png в 3-ю строчку, а файл 018.png в 15 строку((( -
Загрузка картинок из папки в ImageList
gonzales ответил gonzales вопрос в Работа с файловой системой
Вообще deplyment менеджер работает странно. При добавлении файла он не добавляется в конец списка а падает хаотично в середину. Логику данного процесса понять не удалось. -
Доброго всем! Вот процедура загрузки картинок *png в imagelist procedure TForm1.LoadImages; var Layer: TLayer; c: TCustomSourceItem; B: TCustomBitmapItem; d: TCustomDestinationItem; Item: TListBoxItem; i: integer; sRec: TSearchRec; isFound: boolean; filecount: integer; begin isFound := FindFirst(Form1.imagefolder + '*.png', faAnyFile, sRec) = 0; while isFound do begin showmessage(sRec.Name); d := ImageList1.Destination.Add; Layer := ImageList1.Destination[d.index].Layers.Add; Layer.SourceRect.Rect := TRectF.Create(TPoint.Zero, 48, 48); c := ImageList1.Source.Add; Layer.Name := c.Name; c.MultiResBitmap.TransparentColor := TAlphaColorRec.Fuchsia; B := c.MultiResBitmap.Add; B.Bitmap.Assign(B.CreateBitmap(Form1.imagefolder + sRec.Name)); application.ProcessMessages; isFound := FindNext(sRec) = 0; end; FindClose(sRec); end; Она работает, но есть проблема. Картинки в папке пронумерованы: 001.png, 002.png и т.д. В винде, как и положено обработка начинается с первой и кончается последней картинкой. Соответственно ImageIndex у картинок соответствует названию файла (практически). В Андроиде файлы из папки берутся в порядке их деплоя. Почему - не понятно. Решение конечно есть - задеплоить файлы в нужном порядке, но в Deployment менеджере нет сортировок или перемещений вверх вниз. Придется каждый файл удалить и заново прописать. Может кто знает, как это сделать правильно? Заранее спасибо за ответы
-
С первой частью все ок. Забыл поменять TBrushKind на Solid, а Андроид сам не догадался))) А вот со стилями так ничего и не выходит
-
Доброго времени всем! Столкнулся с неприятностью, в Андроид не меняется цвет элементов в рантайм. На форме обычный TCircle form1.DefaultCircle.Fill.Color:=4280444565; Ничего не происходит. Пробовал добавлять BeginUpdate, EndUpdate, Repaint. Ничего не помогает. В Винде все хорошо. Также заранее спрошу вдогонку, если я хочу поменять элементы стиля. // цвет тулбара AObject := Form1.StyleBook1.Style.FindStyleResource('toolbarstyle'); if (AObject is TRectangle) then TRectangle(AObject).Fill.Color := strtoint(node.GetAttribute('BackgroundColor')); form4.ToolBar1.StyleLookup := 'toolbarstyle'; // цвет панели AObject := Form1.StyleBook1.Style.FindStyleResource('panelstyle1'); if (AObject is TRectangle) then TRectangle(AObject).Fill.Color := strtoint(node.GetAttribute('BackgroundColor')); Form1.Panel1.StyleLookup := 'panelstyle1'; Такая же проблема. В Андроид цвета не меняются. Подскажите пожалуйста!!!
-
сам нашел. Нужно переопределить свойство StyleLookup Form1.Button1.StyleLookup := 'Button1Style1';