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

Akad

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

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

  • Посещение

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

    2

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

  1. Ничего в этом плане с 7 версии не изменилось. Единственный надёжный что-то вычистить в студии способ - это far, alt+7, *.*, и искать все упоминания в данном случае файлов от DevExpress/FireDAC... Эта проблема из той же серии, что когда проект копируешь в другую папку, и начинаешь там без предварительной подготовки что-то править, то правишь старые файлы а не скопированные. Подобных ммм... "фишек" у студии куча. Надо или мириться, или переходить на что-то другое. В последней версии (10.2-10.2.2) они даже ctrl+пробел сломали, а Вы про автоматическую прочистку лишних bpl.
  2. А если не секрет: зачем все эти тормозные монстры из FireDAC? Понятно, что если MS SQL какой-нибудь, то там особой разницы не будет. Но для лайта зачем включать эти тормоза? Почему нельзя работать с базой напрямую? P.S. Всё же я б депенденсом бы прошёлся. Чую не хватает какой-то длл.
  3. Для того, что бы дельфя работала с sqlite нужна dll собраная для дельфи и от 1 до 3 .pas файлов для интеграции. В "топовой версии" доступно шифрование базы через libeay32.dll. В любом случае нужно посмотреть зависимости и после этого приложить нужную dll.
  4. Искать по класс нейму окно, и утверждать, что оно ваше - это 5 балов. Особенно по стандартному названию, как из примера. Кросс платформенного решения быть не может, потому что запущенность приложения под тем-же андроидом вещь сильно условная. В остальном vcl = firemonkey с некоторыми оговорками через ifdef. Поэтому нет проблемы код из vcl проекта использовать под firemonkey и наоборот. Если нужно win api - пара слов в uses, и всё что надо доступно. Нужен android api - тоже самое.
  5. С месяц назад у меня стояла подобная задача отображения многострочной информации в списке. Парился я с кастомами в *list* в итоге понял, что единственный вариант - это TGrid. У него надо прописывать самому обработку нажатий с тачскрина, так как из коробки - это глюкалово. Но это по ходу единственный метод вывести список именно так, как хочется. Но тут конечно надо прописать немного кода будет....
  6. Akad

    TGrid vs Тач интерфейс

    Эээ... Разве? Я как только прикасаюсь к таблице, ещё палец не убираю, сразу вызывается OnCellClick.Т.е. не важно, после касания я провёл пальцем или сразу отпустил OnCellClick вызывается у меня в любом случае. Есть настройка этого поведения? Я сейчас как раз и обрабатываю Mouse Down/Up, вычисляя радиус между нажатием и отпусканием. Но это имхо не правильно. Поэтому и возник вопрос. P.S. А каким тогда компонентом правильнее сделать список на подобии такого: вывод отличается в зависимости от кучи параметров (например если адрес не влез в строку уменьшаем шрифт). Сейчас я перехватываю DrawColumnCell и рисую что и как мне надо. Самые очевидные для подобной задачи ListBox/ListView не умеют такого, на сколько я понял? Мне нужно что бы под мобильными платформами это всё без затруднений скроллилось и открывалось при клике.
  7. Akad

    TGrid vs Тач интерфейс

    Как можно отследить, что пользователь кликнул на ячейку грида (режим только чтение, при клике программа должна выполнить действие в зависимости от выбранной ячейки)? Теоретически этим должны заниматься OnCellClick/OnClick. Но по факту они ловят событие нажатия на грид, не рассматривая случай скролла. Т.е. мимо. OnSelChanged - почти оно, кроме случая когда пользователь ткнул на выделенную ячейку. OnTap - вызывается до изменения выделенности (очередной баг?). Соответственно тоже мимо. Есть ли корректный способ отследить нажатие пользователем на ячейку TGrid?
  8. Кстати вопрос в тему: а как закэшировать всё это при старте приложения (ВСЕ компоненты во всех формах создаются динамически). У меня тоже при первом открытии дочерних форм ощущаются подлагивания.
  9. А если не перегружать страницу, а скриптом править размер?
  10. Из сторонних компонент использую только TMSWebBrowser. В стеке вызовов при падении нет ничего от не Embarcadero.
  11. Хочу, что бы минимальное требование к версии андроида была, например, 4.4. Соответственно в настройках выбираю SDK api level ...android-sdk-windows\platforms\android-19 На 6 и 7 андроиде работает все замечательно, но если приложение устанавливается на 5 или 4.4 - при запуске оно падает. Что надо ещё поправить, что бы понизить требуемый API level? Падает в самом начале ExecJNI, if InvokeData.MethodID = nil then raise EJNIFatal.CreateRes(@SJNIUnknownMethod); Студия 10.2. Собирал и на SDK, которая идёт с RAD Studio, и с той, что ставил отдельно. Результат един. NDK выставлял 9, ничего не меняется.
  12. Стандартная ситуация. "Лечить" как всегда try/except.
  13. Да, они действительно существуют. Но во времена XE2 они как-то очень "странно" работали. Поэтому написал свои. Возможно сейчас ситуация стала лучше.Не проверял. Беру свои слова обратно. Но TerminateThread в любом случае нет, а нужен он.
  14. Как миниум нет полноценного класса. Но вопрос не в этом. Cancel не работает. Поток не убивает. Только что проверил на запросе который длится 6-7 сек. Через секунду потоку делаю Cancel, но он всё равно доходит до конца и даже память освобождает. В общем не работает. Оно очевидно из кода. Любое межпоточное взаимодействие нужно осуществлять на локах (если нужно быстро, но в дельфе нет, только через апи). Ну или по извращённому/тормозному/но дельфёвому. Через Synchronize например. Ну если не интересно отлаживать приложение на устройствах клиента с разницей во времени часов в 12, и явным не желанием пользователя этим заниматься. Потому что единственная цель жизни потока в данном случае - обратиться к серверу с 'select тра-ля-ля' и заполнить таблицу. Таблиц на форме может быть 5-6. Соответственно потоков столько-же. Костылей наставить можно, но правильнее при закрытии формы поток прибить. Точнее под винду так и поступаю, но сейчас портирую на мобилки. И без конструкции вида TerminateThread(ServerReader.Handle,$DEAD); пока не представляю как это сделать.
  15. Нужен полноценный поток, как отдельный класс. Тем более Это явный краш всей системы. Когда поток высвободит ресурсы между if и cancel. Ага. Только когда он отвиснет, не будет ни сам существовать ни все переменные, которые в нём. А равно как и форма, один из компонентов которой он заполнял. Под андроидом сложно игнорировать краш всей программы и закрытие её. По крайней мере у меня не получается. Если в одном из потоков тотальный краш - это всё.
  16. Есть TThread, который что-то там своё делает. При этом он может "подвиснуть", особенно на 3g TCP соединениях. И соответственно часто случается, что его надо "пристрелить" не дожидаясь пока он сам сообразит что пора закругляться. Под винду есть чудесная TerminateThread. Но как ту же задачу выполнить под Android? iOS?
  17. Akad

    Indy IRC

    А что реально приходит (дебагер показывает, что в буфере)? Помню там была проблема с отсечением последнего символа. Но приходил корректный текст. Можно инди пересобрать и в колл-стеке глянуть где криво переход анси в юникод. Возможно сервер ожидает utf8, а там 1251 например приходит.
  18. Как правило акк+название девайса. Ну для страховки можно мак. Проще читай - данные придут не повторяемые. На андроиде даже IMEI не 100% гарантия уникальности. Так как опять-же на китайце его можно изменить. Но это хоть 99% уникальности. Вообще лично я сейчас вычисляю md5 от кучи параметров (IMEI, версия прошивки, название и пр.) это даёт шанс уникальности. Но лишь шанс. )))
  19. На андроиде если есть симка - по IMEI, если нет, то ни как. На мак адреса и пр. полагаться нельзя из-за обилия китайцев. С IOS всё проще. Там эти мак айди аккаунта. Номер винта может меняться даже на протяжении жизни одной ОС на нём. Вот тут как раз лучше про маки вспоминать. Про дату биоса, цпу айди и пр.
  20. Мдя... Win api реально крепкий орешек. WinExec будет молчать до последнего. Это факт. ShellExecute что-то проронит, но увидев зомби-фразу fmx - сдуется. Так что останется только кошерный CreateProcess. И ничего с этим не поделать. Хотя он имеет весьма не большое отношение к форумтагу...
  21. Поставь тайм-ауты секунд по 10-20 и в try всё заверни. Будет тебе стабильность работы не смотря на связь.
  22. Почему у меня не считает? Почему я без проблем на любой OS отправляю и получаю то, что отправил? Даже код отправки выложил. P.S. Если ты осознанно отправляешь AnsiString, и его же и пытайся принять (web стандарт так сказать). Или забивай на это, что внутри, и шли буфер. А в твоём примере ты отправляешь UTF-16, а принимаешь UTF-8. Естественно ничего не работает. Delphi работает с UTF 16 всегда, если мы про string. Отправь AnsiString в uft8, и получи его-же.
  23. Я бы вообще не парился с кодировкой, а отправлял/принимал буфер как он есть. Какая разница что там внутри? Тут правда будет проблема отсечения блока текста, так как чаще всего каждый второй байт будет нулём. Поэтому перед отсылкой буфера лучше отсылать его размер. Ну или переводить в Ansistring utf8 и отправлять ноль после буфера. Но так обрывы менее очевидны. Лично я сжимаю сначала весь буфер (у меня xml передаётся в обычном string) через TZCompressionStream, затем отправляю заголовок, в котором содержится тип пакета, размер буфера и пр. и потом сам буфер. function ZCompressIDBuf(aText: string): TIdBytes; var strInput: TMemoryStream; strOutput: TMemoryStream; Zipper: TZCompressionStream; begin SetLength(result,0); strInput:= TStringStream.Create(); strInput.Write(aText[1],Length(aText)*2); strInput.Position := 0; strOutput:= TMemoryStream.Create; try Zipper:= TZCompressionStream.Create( clFastest ,strOutput); try Zipper.CopyFrom(strInput, strInput.Size); finally Zipper.Free; end; SetLength(result,strOutput.Size); strOutput.Position := 0; strOutput.Read(result[0],strOutput.Size); // Result:= strOutput.DataString; finally strInput.Free; strOutput.Free; end; end; procedure LetsSendBuf(p:pointer; siz:integer;cli: TIdIOHandlerSocket); var buf : TIdBytes; begin setlength(buf,siz); move(p^,buf[0],siz); cli.Write(buf); end; сама отправка: var head : TProtocolHeader; XMLOut:string; buf: TIdBytes; ..... buf := ZCompressIDBuf(XMLOut); head.PacketBodyLen := length(buf); LetsSendBuf(@head,sizeof(head),AContext.Connection.Socket); AContext.Connection.Socket.Write(buf); Приём по аналогии. P.S. String андроида/айос начнёт соответствовать стандартам Delphi, если выключить сверхсекретную опцию, которая по умолчанию почему-то включена. {$ZEROBASEDSTRINGS OFF}
  24. Переопределить OnDrawColumnCell и рисовать ручками что и как хочется не?
  25. Я и не утверждал, что в VCL всё работает корректно. Так же как и переопределение этого события там подобным образом. В своё время даже статьи писались об этом. И в книгах отдельные жирные шрифты к чему могут приводить подобные переопределения в событии. Ну и которые, к сожалению, были проигнорированы при разработке fmx. Правильно. По логике. Оно должно запрещать редактирование. НО редактирование разрешено. Не разрешёно лишь изменение редактируемого. Напомните... где здесь ээээ... слово забыл... А! логика? Правильно. У грида так же есть TCurrencyColumn, TImageColumn, TCheckColumn и так далее. Но как только мы говорим про [TGridOption.Editing], тут здравый смысл кончается. TCheckColumn работает одинаково, а вот TStringColumn без него не работает вообще (я про реадонли), а с ним работает в режиме всегда редактируем. Понимаю, что опять нужно искать логику. Лично я её в упор не вижу. P.S. В целом - Ваших словах есть логика. Но она НЕ ОЧЕВИДНА людям, которые перешли с VCL. А так как документация на fmx по факту отсутствует, примеры показывают только сферических коней в вакууме - пока поймёшь, где это там настроена нужная тебе фишка - можно не один час убить - всё пишется методом проб и ошибок. И как я изначально написал - с постоянным возгласом - "ну зачем ТАК делать???" Смысла в дальнейшем разговоре не вижу. Всё равно глюки ни куда не денутся - придётся мне их править (реадонли и постоянная потеря OnKeyDown как минимум если мы говорим о гриде). Хотя меня сейчас абсолютная не работоспособность браузера под всеми платформами напрягает больше всего. Короче посмотрим. Логику разработчика я услышал. Благодарю.
×
×
  • Создать...