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

gonzales

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

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

  • Посещение

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

    27

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

  1. попробую подождать, но что-то мне подсказывает, что проблема не в этом.
  2. И работает демо из коробки, ничего изменять не надо? Только вбить FPushClient.GCMAppID? Я правильно понимаю, что при отправке Notification из консоли Firebase я должен сразу получить уведомление?
  3. Запустил Демо, уведомления не приходят. Ошибок никаких не выдается, но и уведомлений нет. Функция 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 настроил. Но вроде там трудно ошибиться.
  4. Сделал по указанному варианту. Работает везде кроме 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;
  5. Спасибо! Хотя описанный способ прямо противоположен описанному здесь Попробую переделать
  6. Спасибо большое, как раз то что нужно!!! Реализовал, все работает
  7. Имею: 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?
  8. gonzales

    Отправка SMS в IOS

    Тоже интересует тема. Сделал по Вашему примеру, вроде скомпилилось, пока есть только iPad, проверить не на чем, но вопрос в другом: а как читать смс-ки в ios Вы случайно не знаете?
  9. Не очень понял, чем это может помочь! В общем процедуру, которая в потоке запрашивает у сервера информацию и обновляет состояние компонента я написал, но теперь есть другая засада. Эта процедура срабатывает по таймеру в 1 сек, соответственно работает в своем потоке. Но иногда проявляется следующий баг, пользователь принудительно меняет состояние объекта (при этом он перерисовывается), и тут же перерисовывается обратно по таймеру (так как информация о смене состояния на сервер еще не попала) и только на следующем такте (обращении по таймеру к серверу) объект перерисуется в правильное состояние. Вопрос, могу ли я каким-то образом в момент нажатия пользователем на объект остановить выполнение задачи в потоке? Надеюсь что-то понятно из моего объяснения))
  10. Добрый день! Делаю приложение для мобильных платформ. По совету с форума сделал одну автоматическую форму, в которой по 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
  11. Это прекрасно))) А как реализован MQTT в firemonkey? А брокером сама ардуино является?
  12. Разумеется. Я не подумал, что вызывая SendHTTPMessage в потоке я также должен синхронизировать результаты. Пока не удается завернуть SendHTTPMessage в поток, обмен данными не идет. Буду искать ошибки. Во всяком случае большое спасибо за наводки
  13. Спасибо Maximus, учту. Несколько уточняющих вопросов 1. Любое обращение к форме нужно проводить с синхронизацией? Я думал это только визуальных компонентов касается, которые должны в главном потоке отрисовываться. 2. С таймером - хорошая мысль, попробую, вдруг действительно не успевает отработать, это объяснило бы глюки на андроиде. 3. Объектов до 10 и по каждому запрос, только запрос не HTTP, так как у меня не web-сервер, а это просто пакет байт, на который сервер отвечает таким же пакетом. Я уже думаю над тем, чтобы передавать всю информацию в одном пакете, но для этого придется полностью переколбасить сервер, а сейчас пока на это нет времени. А нельзя TCPClient заставить работать в асинхронном режиме?
  14. Может я вообще не с того конца решаю задачу и уважаемая общественность подскажет более правильный путь. Опишу более подробно. Есть объекты, у них есть состояние, о нем знает сервер. Соответственно клиентов может быть несколько и у всех должно синхронно обновляться состояние при изменении его на сервере. Сервер - это МК со своими прибамбасами, но сейчас не об этом. Клиенты - приложение для IOS и Android. Задача - получать данные с сервера о состоянии активных в данный момент объектах, желательно, чтобы основной интерфейс не тормозил в моменты получения информации.
  15. Еще есть подозрение, что проблема кроется в том, что из потока идет обращение к функции посылки и приема сообщений Вот она 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;
  16. Да, забыл отметить, что без использования потока все работает стабильно, но соответственно есть заметные подлагивания.
  17. Доброго времени суток! Решаю следующую задачу, в приложении динамически формируются разные объекты, наследники от одного класса. При формировании объектов заполняется динамический массив этих элементов. Далее я хочу в отдельном потоке для каждого из элементов массива получить его состояние, то есть делаю запрос к серверу. Все это повешено на таймер, каждую секунду должен отрабатываться запрос. Все более менее работает в 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;
  18. Круто!! Спасибо, попробую. Хотя уже сделал, как говорили выше.
  19. Ну сами понимаете, что не проще)))) Но видать делать нечего, придется действовать именно так. Просто удивительно, на что опирается Андроид, когда файлы загружает именно в том порядке, в каком они были задеплоины. Хотя сами файлы (я посмотрел на телефоне) выглядят также как и в Винде, дата создания у них одна и та же, никаких префиксов у них не появляется. И вторая странность, почему в деплой-менеджере при добавлении файла он попадает не в конец списка а куда-то в середину, причем, например файл 017.png в 3-ю строчку, а файл 018.png в 15 строку(((
  20. Вообще deplyment менеджер работает странно. При добавлении файла он не добавляется в конец списка а падает хаотично в середину. Логику данного процесса понять не удалось.
  21. Доброго всем! Вот процедура загрузки картинок *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 менеджере нет сортировок или перемещений вверх вниз. Придется каждый файл удалить и заново прописать. Может кто знает, как это сделать правильно? Заранее спасибо за ответы
  22. С первой частью все ок. Забыл поменять TBrushKind на Solid, а Андроид сам не догадался))) А вот со стилями так ничего и не выходит
  23. Доброго времени всем! Столкнулся с неприятностью, в Андроид не меняется цвет элементов в рантайм. На форме обычный 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'; Такая же проблема. В Андроид цвета не меняются. Подскажите пожалуйста!!!
  24. сам нашел. Нужно переопределить свойство StyleLookup Form1.Button1.StyleLookup := 'Button1Style1';
×
×
  • Создать...