gonzales

Пользователи
  • Публикации

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

  • Посещение

  • Days Won

    1

gonzales last won the day on 4 января 2015

gonzales had the most liked content!

О gonzales

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

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

365 просмотров профиля
  1. Это прекрасно))) А как реализован MQTT в firemonkey? А брокером сама ардуино является?
  2. Разумеется. Я не подумал, что вызывая SendHTTPMessage в потоке я также должен синхронизировать результаты. Пока не удается завернуть SendHTTPMessage в поток, обмен данными не идет. Буду искать ошибки. Во всяком случае большое спасибо за наводки
  3. Спасибо Maximus, учту. Несколько уточняющих вопросов 1. Любое обращение к форме нужно проводить с синхронизацией? Я думал это только визуальных компонентов касается, которые должны в главном потоке отрисовываться. 2. С таймером - хорошая мысль, попробую, вдруг действительно не успевает отработать, это объяснило бы глюки на андроиде. 3. Объектов до 10 и по каждому запрос, только запрос не HTTP, так как у меня не web-сервер, а это просто пакет байт, на который сервер отвечает таким же пакетом. Я уже думаю над тем, чтобы передавать всю информацию в одном пакете, но для этого придется полностью переколбасить сервер, а сейчас пока на это нет времени. А нельзя TCPClient заставить работать в асинхронном режиме?
  4. Может я вообще не с того конца решаю задачу и уважаемая общественность подскажет более правильный путь. Опишу более подробно. Есть объекты, у них есть состояние, о нем знает сервер. Соответственно клиентов может быть несколько и у всех должно синхронно обновляться состояние при изменении его на сервере. Сервер - это МК со своими прибамбасами, но сейчас не об этом. Клиенты - приложение для IOS и Android. Задача - получать данные с сервера о состоянии активных в данный момент объектах, желательно, чтобы основной интерфейс не тормозил в моменты получения информации.
  5. Еще есть подозрение, что проблема кроется в том, что из потока идет обращение к функции посылки и приема сообщений Вот она 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;
  6. Да, забыл отметить, что без использования потока все работает стабильно, но соответственно есть заметные подлагивания.
  7. Доброго времени суток! Решаю следующую задачу, в приложении динамически формируются разные объекты, наследники от одного класса. При формировании объектов заполняется динамический массив этих элементов. Далее я хочу в отдельном потоке для каждого из элементов массива получить его состояние, то есть делаю запрос к серверу. Все это повешено на таймер, каждую секунду должен отрабатываться запрос. Все более менее работает в 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;
  8. Круто!! Спасибо, попробую. Хотя уже сделал, как говорили выше.
  9. Ну сами понимаете, что не проще)))) Но видать делать нечего, придется действовать именно так. Просто удивительно, на что опирается Андроид, когда файлы загружает именно в том порядке, в каком они были задеплоины. Хотя сами файлы (я посмотрел на телефоне) выглядят также как и в Винде, дата создания у них одна и та же, никаких префиксов у них не появляется. И вторая странность, почему в деплой-менеджере при добавлении файла он попадает не в конец списка а куда-то в середину, причем, например файл 017.png в 3-ю строчку, а файл 018.png в 15 строку(((
  10. Вообще deplyment менеджер работает странно. При добавлении файла он не добавляется в конец списка а падает хаотично в середину. Логику данного процесса понять не удалось.
  11. Доброго всем! Вот процедура загрузки картинок *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 менеджере нет сортировок или перемещений вверх вниз. Придется каждый файл удалить и заново прописать. Может кто знает, как это сделать правильно? Заранее спасибо за ответы
  12. С первой частью все ок. Забыл поменять TBrushKind на Solid, а Андроид сам не догадался))) А вот со стилями так ничего и не выходит
  13. Доброго времени всем! Столкнулся с неприятностью, в Андроид не меняется цвет элементов в рантайм. На форме обычный 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'; Такая же проблема. В Андроид цвета не меняются. Подскажите пожалуйста!!!
  14. сам нашел. Нужно переопределить свойство StyleLookup Form1.Button1.StyleLookup := 'Button1Style1';
  15. Не работает, программа валится. Работает вот так. Сам искал, вдруг кому сгодится procedure TForm1.Button1ApplyStyleLookup(Sender: TObject); var l:tlayout; begin l:=StyleBook1.Style.FindStyleResource('Button1Style1') as Tlayout; (l.FindComponent('GlowEffect') as TGlowEffect).GlowColor:=Talphacolorrec.Red; end; А вот на лету не меняет. Программа не валится, но и изменений нет l:=StyleBook1.Style.FindStyleResource('Button1Style1') as Tlayout; (l.FindComponent('GlowEffect') as TGlowEffect).GlowColor:=Talphacolorrec.Red; form1.Button1.ApplyStyleLookup; Изменения по ApplyStyleLookUp не происходят. Причем ApplyStyleLookUp компонента происходит раньше чем например FormShow формы. Вопрос, как теперь применить настройки стиля по нажатию на кнопку.