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

krapotkin

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

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

  • Посещение

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

    210

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

  1. везде, где вижу Application.ProcessMessages; сразу вспоминаю бессмертное: - у вас на стройке несчастные случаи были? - нет - будут... хорошим решением будет сделать Button.Enabled := False и после этого запустить поток, который 1. делает все что там вам нужно 2. при окончании работы разблокирует кнопку 3** Можно также запустить антизависательный таймер, который, если от потока не приходит вестей N секунд, прибивает поток и разблокирует кнопку
  2. если вы на этом форуме, то, скорее всего, выход проще - нужно отказаться от TidHTTP и использовать THttpClient, встроенный в delphi
  3. думаю, вы упускаете этот момент http://docwiki.embarcadero.com/RADStudio/Seattle/en/Zero-based_strings_(Delphi) в андроид индексы в строках идут с 0, на десктопе - с 1 и, насколько я помню, все движется в сторону immutable strings, когда нельзя будет заменить конкретный символ в строке кроме как составлением новой строки так что приводите свой алгоритм в соответствие с этими вводными
  4. правильное решение, конечно, с фреймами. не забудьте, что их нужно создавать отдельно, вручную, в нужный момент
  5. все правильно. деинсталляция очищает собственные данные программы
  6. у меня еще хитрее ) могу сейчас чуть-чуть приврать, давно ваял, но общий смысл... сделан поток, который стартует в FormShow, все проверяет, и возвращает все результаты проверок соответственно, в OnThreadTerminate стартует ShowModal формы логина но в большинстве мест все-таки загрузки профиля и т.п. идут в главном потоке под диалогом из fgx ...
  7. тут все непросто если нет связи например, или еще какая-то совсем беда, остаемся на первой если не залогинены, загружаю форму логина если залогинены - одну из двух "главных" (по смыслу, не по делфи) форм приложения при этом на каждой из форм есть и фреймы и всякая другая беда
  8. главное - главную форму делать из трех компонентов - бэкграунд, лого и кнопка Начать тогда все будет очень хорошо и быстро
  9. в TTask будет то же что в TThread только в модном спагетти-стиле ))
  10. копать в TThread, вам же надо кроссплатформу
  11. можно сделать обычное окно, только прозрачное полностью, а на него положить непрозрачный image и кнопку. а вызывается псевдомодальная форма на Android / ios так: form2.ShowModal(procedure (aresult:TModalResult) begin // этот код получает управление при выходе из "модального" окна end)
  12. а чем вам не угодил TThread ? кроме того, если у вас что-то обращается в сеть, прервать это что-то не удастся, только выйти по тайм-ауту. поток просто ждет этого выхода, не блокируя программу.
  13. 1. все, что происходит с КОМПОНЕНТОМ, придется делать в ГП. Это заполнение св-ва Path 2. НО! все, что нужно предварительно рассчитать, не должно быть в ГП Как вариант procedure TMyThread.Execute; begin while not Terminated do begin ProcessCurrentState(); Synchronize(UpdateUserInterface); sleep(UpdateInterval); end; end; при этом ПО-ЛЮБОМУ будет уходить время на UpdateUserInterface/ Линейно увеличиваясь с кол-вом компонентов
  14. нет имеется в виду что Synchronize - это выполнение в главном потоке если весь код вашего потока выполняется в главном потоке, то зачем заводить поток??? у меня аналогичная анимация Path происходит путем расчетов ключевых точек в дополнительном потоке, и только заполнение готового Path.Path происходит в главном т.к. это всяко компонент и тут без ГП никак
  15. при установленном cnPack такое иногда у меня бывает. но редко и плюсы гораздо круче минусов и обычно никаких разрушений не несет. перезапустился и вперед. а Ctrl+Shift+S у меня на автомате со времен Turbo Pascal )
  16. я сделал в самом начале, какой еще пример?
  17. не надо ничего в потоке, который так же сожрет весь проц
  18. вы вообще не читаете? этот пример от первого не отличается ничем. у вас неправильный алгоритм. вы нарушаете главный цикл приложения. программа и так находится в большом цикле while not terminated do begin processMessages end; и все события, которые возникают в программе и системе, обрабатываются именно там. вы нажимаете кнопку - вам временно передается управление, чтобы выполнить обработчик кнопки. потом программа опять находится в ожидании событий, и при этом не жрет процессор как не в себя. то, что вы делаете собственный цикл - разрушает нормальную обработку в главном цикле и забирает все свободное время процессора.
  19. 1. как уже отметили fr - это поле формы 2. вместо fr.free нужно freeAndNil(fr);
  20. вы не поверите, этот цикл УЖЕ встроен в программу (см. Application.Run) , и повторять его не надо. и вам уже написали 2.5 раза, как нужно делать. Под windows, android, и вообще любую платформу
  21. неправильно. это не должен быть цикл в понимании for, repeat, while это должна быть запись некоего состояния программы, изменение состояния, отражение состояния в пользовательском интерфейсе TForm1=class(TForm) ... ProcessStarted:boolean; PressCount:integer; ... end; procedure TForm1.Button1Click(...) begin StartProcess(); end; procedure TForm1.Button2Click() begin CheckProcessEnd(); end; procedure TForm1.StartProcess(); begin ProcessStarted:=true; PressCount:=0; button1.enabled := false; button2.enabled := true; end; procedure TForm1.CheckProcessEnd; const PRESS_COUNT_PENDING=5; begin inc(PressCount); if (PressCount=PRESS_COUNT_PENDING) then begin ProcessStarted:=false; button1.enabled:=true; button2.enabled:=false; end; end; да. именно конечный автомат это и есть.
  22. а если до нажатия 5 раз ничего делать не надо, то и таймер лишний )))
  23. еще хотелось бы знать, а что нужно-то ? из вашего кода не ясно запустить поток, активировать кнопку Button2 чтобы она остановила поток? либо выполнять какое-то действие время от времени, а по Button2 прекратить его выполнять? тогда простой таймер вполне решает вопрос
  24. что-то сильно поменяется в следующей версии??
  25. по слухам, у дешевых китайцев он один на всех
×
×
  • Создать...